Path: blob/master/tools/testing/selftests/arm64/abi/syscall-abi-asm.S
26289 views
// SPDX-License-Identifier: GPL-2.0-only1// Copyright (C) 2021 ARM Limited.2//3// Assembly portion of the syscall ABI test45//6// Load values from memory into registers, invoke a syscall and save the7// register values back to memory for later checking. The syscall to be8// invoked is configured in x8 of the input GPR data.9//10// x0: SVE VL, 0 for FP only11// x1: SME VL12//13// GPRs: gpr_in, gpr_out14// FPRs: fpr_in, fpr_out15// Zn: z_in, z_out16// Pn: p_in, p_out17// FFR: ffr_in, ffr_out18// ZA: za_in, za_out19// SVCR: svcr_in, svcr_out2021#include "syscall-abi.h"2223.arch_extension sve2425#define ID_AA64SMFR0_EL1_SMEver_SHIFT 5626#define ID_AA64SMFR0_EL1_SMEver_WIDTH 42728/*29* LDR (vector to ZA array):30* LDR ZA[\nw, #\offset], [X\nxbase, #\offset, MUL VL]31*/32.macro _ldr_za nw, nxbase, offset=033.inst 0xe1000000 \34| (((\nw) & 3) << 13) \35| ((\nxbase) << 5) \36| ((\offset) & 7)37.endm3839/*40* STR (vector from ZA array):41* STR ZA[\nw, #\offset], [X\nxbase, #\offset, MUL VL]42*/43.macro _str_za nw, nxbase, offset=044.inst 0xe1200000 \45| (((\nw) & 3) << 13) \46| ((\nxbase) << 5) \47| ((\offset) & 7)48.endm4950/*51* LDR (ZT0)52*53* LDR ZT0, nx54*/55.macro _ldr_zt nx56.inst 0xe11f8000 \57| (((\nx) & 0x1f) << 5)58.endm5960/*61* STR (ZT0)62*63* STR ZT0, nx64*/65.macro _str_zt nx66.inst 0xe13f8000 \67| (((\nx) & 0x1f) << 5)68.endm6970.globl do_syscall71do_syscall:72// Store callee saved registers x19-x29 (80 bytes) plus x0 and x173stp x29, x30, [sp, #-112]!74mov x29, sp75stp x0, x1, [sp, #16]76stp x19, x20, [sp, #32]77stp x21, x22, [sp, #48]78stp x23, x24, [sp, #64]79stp x25, x26, [sp, #80]80stp x27, x28, [sp, #96]8182// Set SVCR if we're doing SME83cbz x1, load_gpr84adrp x2, svcr_in85ldr x2, [x2, :lo12:svcr_in]86msr S3_3_C4_C2_2, x28788// Load ZA and ZT0 if enabled - uses x12 as scratch due to SME LDR89tbz x2, #SVCR_ZA_SHIFT, load_gpr90mov w12, #091ldr x2, =za_in921: _ldr_za 12, 293add x2, x2, x194add x12, x12, #195cmp x1, x1296bne 1b9798// ZT099mrs x2, S3_0_C0_C4_5 // ID_AA64SMFR0_EL1100ubfx x2, x2, #ID_AA64SMFR0_EL1_SMEver_SHIFT, \101#ID_AA64SMFR0_EL1_SMEver_WIDTH102cbz x2, load_gpr103adrp x2, zt_in104add x2, x2, :lo12:zt_in105_ldr_zt 2106107load_gpr:108// Load GPRs x8-x28, and save our SP/FP for later comparison109ldr x2, =gpr_in110add x2, x2, #64111ldp x8, x9, [x2], #16112ldp x10, x11, [x2], #16113ldp x12, x13, [x2], #16114ldp x14, x15, [x2], #16115ldp x16, x17, [x2], #16116ldp x18, x19, [x2], #16117ldp x20, x21, [x2], #16118ldp x22, x23, [x2], #16119ldp x24, x25, [x2], #16120ldp x26, x27, [x2], #16121ldr x28, [x2], #8122str x29, [x2], #8 // FP123str x30, [x2], #8 // LR124125// Load FPRs if we're not doing neither SVE nor streaming SVE126cbnz x0, check_sve_in127ldr x2, =svcr_in128tbnz x2, #SVCR_SM_SHIFT, check_sve_in129130ldr x2, =fpr_in131ldp q0, q1, [x2]132ldp q2, q3, [x2, #16 * 2]133ldp q4, q5, [x2, #16 * 4]134ldp q6, q7, [x2, #16 * 6]135ldp q8, q9, [x2, #16 * 8]136ldp q10, q11, [x2, #16 * 10]137ldp q12, q13, [x2, #16 * 12]138ldp q14, q15, [x2, #16 * 14]139ldp q16, q17, [x2, #16 * 16]140ldp q18, q19, [x2, #16 * 18]141ldp q20, q21, [x2, #16 * 20]142ldp q22, q23, [x2, #16 * 22]143ldp q24, q25, [x2, #16 * 24]144ldp q26, q27, [x2, #16 * 26]145ldp q28, q29, [x2, #16 * 28]146ldp q30, q31, [x2, #16 * 30]147148b 2f149150check_sve_in:151// Load the SVE registers if we're doing SVE/SME152153ldr x2, =z_in154ldr z0, [x2, #0, MUL VL]155ldr z1, [x2, #1, MUL VL]156ldr z2, [x2, #2, MUL VL]157ldr z3, [x2, #3, MUL VL]158ldr z4, [x2, #4, MUL VL]159ldr z5, [x2, #5, MUL VL]160ldr z6, [x2, #6, MUL VL]161ldr z7, [x2, #7, MUL VL]162ldr z8, [x2, #8, MUL VL]163ldr z9, [x2, #9, MUL VL]164ldr z10, [x2, #10, MUL VL]165ldr z11, [x2, #11, MUL VL]166ldr z12, [x2, #12, MUL VL]167ldr z13, [x2, #13, MUL VL]168ldr z14, [x2, #14, MUL VL]169ldr z15, [x2, #15, MUL VL]170ldr z16, [x2, #16, MUL VL]171ldr z17, [x2, #17, MUL VL]172ldr z18, [x2, #18, MUL VL]173ldr z19, [x2, #19, MUL VL]174ldr z20, [x2, #20, MUL VL]175ldr z21, [x2, #21, MUL VL]176ldr z22, [x2, #22, MUL VL]177ldr z23, [x2, #23, MUL VL]178ldr z24, [x2, #24, MUL VL]179ldr z25, [x2, #25, MUL VL]180ldr z26, [x2, #26, MUL VL]181ldr z27, [x2, #27, MUL VL]182ldr z28, [x2, #28, MUL VL]183ldr z29, [x2, #29, MUL VL]184ldr z30, [x2, #30, MUL VL]185ldr z31, [x2, #31, MUL VL]186187// Only set a non-zero FFR, test patterns must be zero since the188// syscall should clear it - this lets us handle FA64.189ldr x2, =ffr_in190ldr p0, [x2]191ldr x2, [x2, #0]192cbz x2, 1f193wrffr p0.b1941:195196ldr x2, =p_in197ldr p0, [x2, #0, MUL VL]198ldr p1, [x2, #1, MUL VL]199ldr p2, [x2, #2, MUL VL]200ldr p3, [x2, #3, MUL VL]201ldr p4, [x2, #4, MUL VL]202ldr p5, [x2, #5, MUL VL]203ldr p6, [x2, #6, MUL VL]204ldr p7, [x2, #7, MUL VL]205ldr p8, [x2, #8, MUL VL]206ldr p9, [x2, #9, MUL VL]207ldr p10, [x2, #10, MUL VL]208ldr p11, [x2, #11, MUL VL]209ldr p12, [x2, #12, MUL VL]210ldr p13, [x2, #13, MUL VL]211ldr p14, [x2, #14, MUL VL]212ldr p15, [x2, #15, MUL VL]2132:214215// Do the syscall216svc #0217218// Save GPRs x8-x30219ldr x2, =gpr_out220add x2, x2, #64221stp x8, x9, [x2], #16222stp x10, x11, [x2], #16223stp x12, x13, [x2], #16224stp x14, x15, [x2], #16225stp x16, x17, [x2], #16226stp x18, x19, [x2], #16227stp x20, x21, [x2], #16228stp x22, x23, [x2], #16229stp x24, x25, [x2], #16230stp x26, x27, [x2], #16231stp x28, x29, [x2], #16232str x30, [x2]233234// Restore x0 and x1 for feature checks235ldp x0, x1, [sp, #16]236237// Save FPSIMD state238ldr x2, =fpr_out239stp q0, q1, [x2]240stp q2, q3, [x2, #16 * 2]241stp q4, q5, [x2, #16 * 4]242stp q6, q7, [x2, #16 * 6]243stp q8, q9, [x2, #16 * 8]244stp q10, q11, [x2, #16 * 10]245stp q12, q13, [x2, #16 * 12]246stp q14, q15, [x2, #16 * 14]247stp q16, q17, [x2, #16 * 16]248stp q18, q19, [x2, #16 * 18]249stp q20, q21, [x2, #16 * 20]250stp q22, q23, [x2, #16 * 22]251stp q24, q25, [x2, #16 * 24]252stp q26, q27, [x2, #16 * 26]253stp q28, q29, [x2, #16 * 28]254stp q30, q31, [x2, #16 * 30]255256// Save SVCR if we're doing SME257cbz x1, check_sve_out258mrs x2, S3_3_C4_C2_2259adrp x3, svcr_out260str x2, [x3, :lo12:svcr_out]261262// Save ZA if it's enabled - uses x12 as scratch due to SME STR263tbz x2, #SVCR_ZA_SHIFT, check_sve_out264mov w12, #0265ldr x2, =za_out2661: _str_za 12, 2267add x2, x2, x1268add x12, x12, #1269cmp x1, x12270bne 1b271272// ZT0273mrs x2, S3_0_C0_C4_5 // ID_AA64SMFR0_EL1274ubfx x2, x2, #ID_AA64SMFR0_EL1_SMEver_SHIFT, \275#ID_AA64SMFR0_EL1_SMEver_WIDTH276cbz x2, check_sve_out277adrp x2, zt_out278add x2, x2, :lo12:zt_out279_str_zt 2280281check_sve_out:282// Save the SVE state if we have some283cbz x0, 1f284285ldr x2, =z_out286str z0, [x2, #0, MUL VL]287str z1, [x2, #1, MUL VL]288str z2, [x2, #2, MUL VL]289str z3, [x2, #3, MUL VL]290str z4, [x2, #4, MUL VL]291str z5, [x2, #5, MUL VL]292str z6, [x2, #6, MUL VL]293str z7, [x2, #7, MUL VL]294str z8, [x2, #8, MUL VL]295str z9, [x2, #9, MUL VL]296str z10, [x2, #10, MUL VL]297str z11, [x2, #11, MUL VL]298str z12, [x2, #12, MUL VL]299str z13, [x2, #13, MUL VL]300str z14, [x2, #14, MUL VL]301str z15, [x2, #15, MUL VL]302str z16, [x2, #16, MUL VL]303str z17, [x2, #17, MUL VL]304str z18, [x2, #18, MUL VL]305str z19, [x2, #19, MUL VL]306str z20, [x2, #20, MUL VL]307str z21, [x2, #21, MUL VL]308str z22, [x2, #22, MUL VL]309str z23, [x2, #23, MUL VL]310str z24, [x2, #24, MUL VL]311str z25, [x2, #25, MUL VL]312str z26, [x2, #26, MUL VL]313str z27, [x2, #27, MUL VL]314str z28, [x2, #28, MUL VL]315str z29, [x2, #29, MUL VL]316str z30, [x2, #30, MUL VL]317str z31, [x2, #31, MUL VL]318319ldr x2, =p_out320str p0, [x2, #0, MUL VL]321str p1, [x2, #1, MUL VL]322str p2, [x2, #2, MUL VL]323str p3, [x2, #3, MUL VL]324str p4, [x2, #4, MUL VL]325str p5, [x2, #5, MUL VL]326str p6, [x2, #6, MUL VL]327str p7, [x2, #7, MUL VL]328str p8, [x2, #8, MUL VL]329str p9, [x2, #9, MUL VL]330str p10, [x2, #10, MUL VL]331str p11, [x2, #11, MUL VL]332str p12, [x2, #12, MUL VL]333str p13, [x2, #13, MUL VL]334str p14, [x2, #14, MUL VL]335str p15, [x2, #15, MUL VL]336337// Only save FFR if we wrote a value for SME338ldr x2, =ffr_in339ldr x2, [x2, #0]340cbz x2, 1f341ldr x2, =ffr_out342rdffr p0.b343str p0, [x2]3441:345346// Restore callee saved registers x19-x30347ldp x19, x20, [sp, #32]348ldp x21, x22, [sp, #48]349ldp x23, x24, [sp, #64]350ldp x25, x26, [sp, #80]351ldp x27, x28, [sp, #96]352ldp x29, x30, [sp], #112353354// Clear SVCR if we were doing SME so future tests don't have ZA355cbz x1, 1f356msr S3_3_C4_C2_2, xzr3571:358359ret360361362