162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci// Copyright (C) 2021 ARM Limited. 362306a36Sopenharmony_ci// 462306a36Sopenharmony_ci// Assembly portion of the syscall ABI test 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci// 762306a36Sopenharmony_ci// Load values from memory into registers, invoke a syscall and save the 862306a36Sopenharmony_ci// register values back to memory for later checking. The syscall to be 962306a36Sopenharmony_ci// invoked is configured in x8 of the input GPR data. 1062306a36Sopenharmony_ci// 1162306a36Sopenharmony_ci// x0: SVE VL, 0 for FP only 1262306a36Sopenharmony_ci// x1: SME VL 1362306a36Sopenharmony_ci// 1462306a36Sopenharmony_ci// GPRs: gpr_in, gpr_out 1562306a36Sopenharmony_ci// FPRs: fpr_in, fpr_out 1662306a36Sopenharmony_ci// Zn: z_in, z_out 1762306a36Sopenharmony_ci// Pn: p_in, p_out 1862306a36Sopenharmony_ci// FFR: ffr_in, ffr_out 1962306a36Sopenharmony_ci// ZA: za_in, za_out 2062306a36Sopenharmony_ci// SVCR: svcr_in, svcr_out 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#include "syscall-abi.h" 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci.arch_extension sve 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define ID_AA64SMFR0_EL1_SMEver_SHIFT 56 2762306a36Sopenharmony_ci#define ID_AA64SMFR0_EL1_SMEver_WIDTH 4 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci/* 3062306a36Sopenharmony_ci * LDR (vector to ZA array): 3162306a36Sopenharmony_ci * LDR ZA[\nw, #\offset], [X\nxbase, #\offset, MUL VL] 3262306a36Sopenharmony_ci */ 3362306a36Sopenharmony_ci.macro _ldr_za nw, nxbase, offset=0 3462306a36Sopenharmony_ci .inst 0xe1000000 \ 3562306a36Sopenharmony_ci | (((\nw) & 3) << 13) \ 3662306a36Sopenharmony_ci | ((\nxbase) << 5) \ 3762306a36Sopenharmony_ci | ((\offset) & 7) 3862306a36Sopenharmony_ci.endm 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci/* 4162306a36Sopenharmony_ci * STR (vector from ZA array): 4262306a36Sopenharmony_ci * STR ZA[\nw, #\offset], [X\nxbase, #\offset, MUL VL] 4362306a36Sopenharmony_ci */ 4462306a36Sopenharmony_ci.macro _str_za nw, nxbase, offset=0 4562306a36Sopenharmony_ci .inst 0xe1200000 \ 4662306a36Sopenharmony_ci | (((\nw) & 3) << 13) \ 4762306a36Sopenharmony_ci | ((\nxbase) << 5) \ 4862306a36Sopenharmony_ci | ((\offset) & 7) 4962306a36Sopenharmony_ci.endm 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci/* 5262306a36Sopenharmony_ci * LDR (ZT0) 5362306a36Sopenharmony_ci * 5462306a36Sopenharmony_ci * LDR ZT0, nx 5562306a36Sopenharmony_ci */ 5662306a36Sopenharmony_ci.macro _ldr_zt nx 5762306a36Sopenharmony_ci .inst 0xe11f8000 \ 5862306a36Sopenharmony_ci | (((\nx) & 0x1f) << 5) 5962306a36Sopenharmony_ci.endm 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci/* 6262306a36Sopenharmony_ci * STR (ZT0) 6362306a36Sopenharmony_ci * 6462306a36Sopenharmony_ci * STR ZT0, nx 6562306a36Sopenharmony_ci */ 6662306a36Sopenharmony_ci.macro _str_zt nx 6762306a36Sopenharmony_ci .inst 0xe13f8000 \ 6862306a36Sopenharmony_ci | (((\nx) & 0x1f) << 5) 6962306a36Sopenharmony_ci.endm 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci.globl do_syscall 7262306a36Sopenharmony_cido_syscall: 7362306a36Sopenharmony_ci // Store callee saved registers x19-x29 (80 bytes) plus x0 and x1 7462306a36Sopenharmony_ci stp x29, x30, [sp, #-112]! 7562306a36Sopenharmony_ci mov x29, sp 7662306a36Sopenharmony_ci stp x0, x1, [sp, #16] 7762306a36Sopenharmony_ci stp x19, x20, [sp, #32] 7862306a36Sopenharmony_ci stp x21, x22, [sp, #48] 7962306a36Sopenharmony_ci stp x23, x24, [sp, #64] 8062306a36Sopenharmony_ci stp x25, x26, [sp, #80] 8162306a36Sopenharmony_ci stp x27, x28, [sp, #96] 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci // Set SVCR if we're doing SME 8462306a36Sopenharmony_ci cbz x1, 1f 8562306a36Sopenharmony_ci adrp x2, svcr_in 8662306a36Sopenharmony_ci ldr x2, [x2, :lo12:svcr_in] 8762306a36Sopenharmony_ci msr S3_3_C4_C2_2, x2 8862306a36Sopenharmony_ci1: 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci // Load ZA and ZT0 if enabled - uses x12 as scratch due to SME LDR 9162306a36Sopenharmony_ci tbz x2, #SVCR_ZA_SHIFT, 1f 9262306a36Sopenharmony_ci mov w12, #0 9362306a36Sopenharmony_ci ldr x2, =za_in 9462306a36Sopenharmony_ci2: _ldr_za 12, 2 9562306a36Sopenharmony_ci add x2, x2, x1 9662306a36Sopenharmony_ci add x12, x12, #1 9762306a36Sopenharmony_ci cmp x1, x12 9862306a36Sopenharmony_ci bne 2b 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci // ZT0 10162306a36Sopenharmony_ci mrs x2, S3_0_C0_C4_5 // ID_AA64SMFR0_EL1 10262306a36Sopenharmony_ci ubfx x2, x2, #ID_AA64SMFR0_EL1_SMEver_SHIFT, \ 10362306a36Sopenharmony_ci #ID_AA64SMFR0_EL1_SMEver_WIDTH 10462306a36Sopenharmony_ci cbz x2, 1f 10562306a36Sopenharmony_ci adrp x2, zt_in 10662306a36Sopenharmony_ci add x2, x2, :lo12:zt_in 10762306a36Sopenharmony_ci _ldr_zt 2 10862306a36Sopenharmony_ci1: 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci // Load GPRs x8-x28, and save our SP/FP for later comparison 11162306a36Sopenharmony_ci ldr x2, =gpr_in 11262306a36Sopenharmony_ci add x2, x2, #64 11362306a36Sopenharmony_ci ldp x8, x9, [x2], #16 11462306a36Sopenharmony_ci ldp x10, x11, [x2], #16 11562306a36Sopenharmony_ci ldp x12, x13, [x2], #16 11662306a36Sopenharmony_ci ldp x14, x15, [x2], #16 11762306a36Sopenharmony_ci ldp x16, x17, [x2], #16 11862306a36Sopenharmony_ci ldp x18, x19, [x2], #16 11962306a36Sopenharmony_ci ldp x20, x21, [x2], #16 12062306a36Sopenharmony_ci ldp x22, x23, [x2], #16 12162306a36Sopenharmony_ci ldp x24, x25, [x2], #16 12262306a36Sopenharmony_ci ldp x26, x27, [x2], #16 12362306a36Sopenharmony_ci ldr x28, [x2], #8 12462306a36Sopenharmony_ci str x29, [x2], #8 // FP 12562306a36Sopenharmony_ci str x30, [x2], #8 // LR 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci // Load FPRs if we're not doing neither SVE nor streaming SVE 12862306a36Sopenharmony_ci cbnz x0, 1f 12962306a36Sopenharmony_ci ldr x2, =svcr_in 13062306a36Sopenharmony_ci tbnz x2, #SVCR_SM_SHIFT, 1f 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci ldr x2, =fpr_in 13362306a36Sopenharmony_ci ldp q0, q1, [x2] 13462306a36Sopenharmony_ci ldp q2, q3, [x2, #16 * 2] 13562306a36Sopenharmony_ci ldp q4, q5, [x2, #16 * 4] 13662306a36Sopenharmony_ci ldp q6, q7, [x2, #16 * 6] 13762306a36Sopenharmony_ci ldp q8, q9, [x2, #16 * 8] 13862306a36Sopenharmony_ci ldp q10, q11, [x2, #16 * 10] 13962306a36Sopenharmony_ci ldp q12, q13, [x2, #16 * 12] 14062306a36Sopenharmony_ci ldp q14, q15, [x2, #16 * 14] 14162306a36Sopenharmony_ci ldp q16, q17, [x2, #16 * 16] 14262306a36Sopenharmony_ci ldp q18, q19, [x2, #16 * 18] 14362306a36Sopenharmony_ci ldp q20, q21, [x2, #16 * 20] 14462306a36Sopenharmony_ci ldp q22, q23, [x2, #16 * 22] 14562306a36Sopenharmony_ci ldp q24, q25, [x2, #16 * 24] 14662306a36Sopenharmony_ci ldp q26, q27, [x2, #16 * 26] 14762306a36Sopenharmony_ci ldp q28, q29, [x2, #16 * 28] 14862306a36Sopenharmony_ci ldp q30, q31, [x2, #16 * 30] 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci b 2f 15162306a36Sopenharmony_ci1: 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci // Load the SVE registers if we're doing SVE/SME 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci ldr x2, =z_in 15662306a36Sopenharmony_ci ldr z0, [x2, #0, MUL VL] 15762306a36Sopenharmony_ci ldr z1, [x2, #1, MUL VL] 15862306a36Sopenharmony_ci ldr z2, [x2, #2, MUL VL] 15962306a36Sopenharmony_ci ldr z3, [x2, #3, MUL VL] 16062306a36Sopenharmony_ci ldr z4, [x2, #4, MUL VL] 16162306a36Sopenharmony_ci ldr z5, [x2, #5, MUL VL] 16262306a36Sopenharmony_ci ldr z6, [x2, #6, MUL VL] 16362306a36Sopenharmony_ci ldr z7, [x2, #7, MUL VL] 16462306a36Sopenharmony_ci ldr z8, [x2, #8, MUL VL] 16562306a36Sopenharmony_ci ldr z9, [x2, #9, MUL VL] 16662306a36Sopenharmony_ci ldr z10, [x2, #10, MUL VL] 16762306a36Sopenharmony_ci ldr z11, [x2, #11, MUL VL] 16862306a36Sopenharmony_ci ldr z12, [x2, #12, MUL VL] 16962306a36Sopenharmony_ci ldr z13, [x2, #13, MUL VL] 17062306a36Sopenharmony_ci ldr z14, [x2, #14, MUL VL] 17162306a36Sopenharmony_ci ldr z15, [x2, #15, MUL VL] 17262306a36Sopenharmony_ci ldr z16, [x2, #16, MUL VL] 17362306a36Sopenharmony_ci ldr z17, [x2, #17, MUL VL] 17462306a36Sopenharmony_ci ldr z18, [x2, #18, MUL VL] 17562306a36Sopenharmony_ci ldr z19, [x2, #19, MUL VL] 17662306a36Sopenharmony_ci ldr z20, [x2, #20, MUL VL] 17762306a36Sopenharmony_ci ldr z21, [x2, #21, MUL VL] 17862306a36Sopenharmony_ci ldr z22, [x2, #22, MUL VL] 17962306a36Sopenharmony_ci ldr z23, [x2, #23, MUL VL] 18062306a36Sopenharmony_ci ldr z24, [x2, #24, MUL VL] 18162306a36Sopenharmony_ci ldr z25, [x2, #25, MUL VL] 18262306a36Sopenharmony_ci ldr z26, [x2, #26, MUL VL] 18362306a36Sopenharmony_ci ldr z27, [x2, #27, MUL VL] 18462306a36Sopenharmony_ci ldr z28, [x2, #28, MUL VL] 18562306a36Sopenharmony_ci ldr z29, [x2, #29, MUL VL] 18662306a36Sopenharmony_ci ldr z30, [x2, #30, MUL VL] 18762306a36Sopenharmony_ci ldr z31, [x2, #31, MUL VL] 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci // Only set a non-zero FFR, test patterns must be zero since the 19062306a36Sopenharmony_ci // syscall should clear it - this lets us handle FA64. 19162306a36Sopenharmony_ci ldr x2, =ffr_in 19262306a36Sopenharmony_ci ldr p0, [x2] 19362306a36Sopenharmony_ci ldr x2, [x2, #0] 19462306a36Sopenharmony_ci cbz x2, 1f 19562306a36Sopenharmony_ci wrffr p0.b 19662306a36Sopenharmony_ci1: 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci ldr x2, =p_in 19962306a36Sopenharmony_ci ldr p0, [x2, #0, MUL VL] 20062306a36Sopenharmony_ci ldr p1, [x2, #1, MUL VL] 20162306a36Sopenharmony_ci ldr p2, [x2, #2, MUL VL] 20262306a36Sopenharmony_ci ldr p3, [x2, #3, MUL VL] 20362306a36Sopenharmony_ci ldr p4, [x2, #4, MUL VL] 20462306a36Sopenharmony_ci ldr p5, [x2, #5, MUL VL] 20562306a36Sopenharmony_ci ldr p6, [x2, #6, MUL VL] 20662306a36Sopenharmony_ci ldr p7, [x2, #7, MUL VL] 20762306a36Sopenharmony_ci ldr p8, [x2, #8, MUL VL] 20862306a36Sopenharmony_ci ldr p9, [x2, #9, MUL VL] 20962306a36Sopenharmony_ci ldr p10, [x2, #10, MUL VL] 21062306a36Sopenharmony_ci ldr p11, [x2, #11, MUL VL] 21162306a36Sopenharmony_ci ldr p12, [x2, #12, MUL VL] 21262306a36Sopenharmony_ci ldr p13, [x2, #13, MUL VL] 21362306a36Sopenharmony_ci ldr p14, [x2, #14, MUL VL] 21462306a36Sopenharmony_ci ldr p15, [x2, #15, MUL VL] 21562306a36Sopenharmony_ci2: 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci // Do the syscall 21862306a36Sopenharmony_ci svc #0 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci // Save GPRs x8-x30 22162306a36Sopenharmony_ci ldr x2, =gpr_out 22262306a36Sopenharmony_ci add x2, x2, #64 22362306a36Sopenharmony_ci stp x8, x9, [x2], #16 22462306a36Sopenharmony_ci stp x10, x11, [x2], #16 22562306a36Sopenharmony_ci stp x12, x13, [x2], #16 22662306a36Sopenharmony_ci stp x14, x15, [x2], #16 22762306a36Sopenharmony_ci stp x16, x17, [x2], #16 22862306a36Sopenharmony_ci stp x18, x19, [x2], #16 22962306a36Sopenharmony_ci stp x20, x21, [x2], #16 23062306a36Sopenharmony_ci stp x22, x23, [x2], #16 23162306a36Sopenharmony_ci stp x24, x25, [x2], #16 23262306a36Sopenharmony_ci stp x26, x27, [x2], #16 23362306a36Sopenharmony_ci stp x28, x29, [x2], #16 23462306a36Sopenharmony_ci str x30, [x2] 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci // Restore x0 and x1 for feature checks 23762306a36Sopenharmony_ci ldp x0, x1, [sp, #16] 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci // Save FPSIMD state 24062306a36Sopenharmony_ci ldr x2, =fpr_out 24162306a36Sopenharmony_ci stp q0, q1, [x2] 24262306a36Sopenharmony_ci stp q2, q3, [x2, #16 * 2] 24362306a36Sopenharmony_ci stp q4, q5, [x2, #16 * 4] 24462306a36Sopenharmony_ci stp q6, q7, [x2, #16 * 6] 24562306a36Sopenharmony_ci stp q8, q9, [x2, #16 * 8] 24662306a36Sopenharmony_ci stp q10, q11, [x2, #16 * 10] 24762306a36Sopenharmony_ci stp q12, q13, [x2, #16 * 12] 24862306a36Sopenharmony_ci stp q14, q15, [x2, #16 * 14] 24962306a36Sopenharmony_ci stp q16, q17, [x2, #16 * 16] 25062306a36Sopenharmony_ci stp q18, q19, [x2, #16 * 18] 25162306a36Sopenharmony_ci stp q20, q21, [x2, #16 * 20] 25262306a36Sopenharmony_ci stp q22, q23, [x2, #16 * 22] 25362306a36Sopenharmony_ci stp q24, q25, [x2, #16 * 24] 25462306a36Sopenharmony_ci stp q26, q27, [x2, #16 * 26] 25562306a36Sopenharmony_ci stp q28, q29, [x2, #16 * 28] 25662306a36Sopenharmony_ci stp q30, q31, [x2, #16 * 30] 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci // Save SVCR if we're doing SME 25962306a36Sopenharmony_ci cbz x1, 1f 26062306a36Sopenharmony_ci mrs x2, S3_3_C4_C2_2 26162306a36Sopenharmony_ci adrp x3, svcr_out 26262306a36Sopenharmony_ci str x2, [x3, :lo12:svcr_out] 26362306a36Sopenharmony_ci1: 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci // Save ZA if it's enabled - uses x12 as scratch due to SME STR 26662306a36Sopenharmony_ci tbz x2, #SVCR_ZA_SHIFT, 1f 26762306a36Sopenharmony_ci mov w12, #0 26862306a36Sopenharmony_ci ldr x2, =za_out 26962306a36Sopenharmony_ci2: _str_za 12, 2 27062306a36Sopenharmony_ci add x2, x2, x1 27162306a36Sopenharmony_ci add x12, x12, #1 27262306a36Sopenharmony_ci cmp x1, x12 27362306a36Sopenharmony_ci bne 2b 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci // ZT0 27662306a36Sopenharmony_ci mrs x2, S3_0_C0_C4_5 // ID_AA64SMFR0_EL1 27762306a36Sopenharmony_ci ubfx x2, x2, #ID_AA64SMFR0_EL1_SMEver_SHIFT, \ 27862306a36Sopenharmony_ci #ID_AA64SMFR0_EL1_SMEver_WIDTH 27962306a36Sopenharmony_ci cbz x2, 1f 28062306a36Sopenharmony_ci adrp x2, zt_out 28162306a36Sopenharmony_ci add x2, x2, :lo12:zt_out 28262306a36Sopenharmony_ci _str_zt 2 28362306a36Sopenharmony_ci1: 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci // Save the SVE state if we have some 28662306a36Sopenharmony_ci cbz x0, 1f 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci ldr x2, =z_out 28962306a36Sopenharmony_ci str z0, [x2, #0, MUL VL] 29062306a36Sopenharmony_ci str z1, [x2, #1, MUL VL] 29162306a36Sopenharmony_ci str z2, [x2, #2, MUL VL] 29262306a36Sopenharmony_ci str z3, [x2, #3, MUL VL] 29362306a36Sopenharmony_ci str z4, [x2, #4, MUL VL] 29462306a36Sopenharmony_ci str z5, [x2, #5, MUL VL] 29562306a36Sopenharmony_ci str z6, [x2, #6, MUL VL] 29662306a36Sopenharmony_ci str z7, [x2, #7, MUL VL] 29762306a36Sopenharmony_ci str z8, [x2, #8, MUL VL] 29862306a36Sopenharmony_ci str z9, [x2, #9, MUL VL] 29962306a36Sopenharmony_ci str z10, [x2, #10, MUL VL] 30062306a36Sopenharmony_ci str z11, [x2, #11, MUL VL] 30162306a36Sopenharmony_ci str z12, [x2, #12, MUL VL] 30262306a36Sopenharmony_ci str z13, [x2, #13, MUL VL] 30362306a36Sopenharmony_ci str z14, [x2, #14, MUL VL] 30462306a36Sopenharmony_ci str z15, [x2, #15, MUL VL] 30562306a36Sopenharmony_ci str z16, [x2, #16, MUL VL] 30662306a36Sopenharmony_ci str z17, [x2, #17, MUL VL] 30762306a36Sopenharmony_ci str z18, [x2, #18, MUL VL] 30862306a36Sopenharmony_ci str z19, [x2, #19, MUL VL] 30962306a36Sopenharmony_ci str z20, [x2, #20, MUL VL] 31062306a36Sopenharmony_ci str z21, [x2, #21, MUL VL] 31162306a36Sopenharmony_ci str z22, [x2, #22, MUL VL] 31262306a36Sopenharmony_ci str z23, [x2, #23, MUL VL] 31362306a36Sopenharmony_ci str z24, [x2, #24, MUL VL] 31462306a36Sopenharmony_ci str z25, [x2, #25, MUL VL] 31562306a36Sopenharmony_ci str z26, [x2, #26, MUL VL] 31662306a36Sopenharmony_ci str z27, [x2, #27, MUL VL] 31762306a36Sopenharmony_ci str z28, [x2, #28, MUL VL] 31862306a36Sopenharmony_ci str z29, [x2, #29, MUL VL] 31962306a36Sopenharmony_ci str z30, [x2, #30, MUL VL] 32062306a36Sopenharmony_ci str z31, [x2, #31, MUL VL] 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ci ldr x2, =p_out 32362306a36Sopenharmony_ci str p0, [x2, #0, MUL VL] 32462306a36Sopenharmony_ci str p1, [x2, #1, MUL VL] 32562306a36Sopenharmony_ci str p2, [x2, #2, MUL VL] 32662306a36Sopenharmony_ci str p3, [x2, #3, MUL VL] 32762306a36Sopenharmony_ci str p4, [x2, #4, MUL VL] 32862306a36Sopenharmony_ci str p5, [x2, #5, MUL VL] 32962306a36Sopenharmony_ci str p6, [x2, #6, MUL VL] 33062306a36Sopenharmony_ci str p7, [x2, #7, MUL VL] 33162306a36Sopenharmony_ci str p8, [x2, #8, MUL VL] 33262306a36Sopenharmony_ci str p9, [x2, #9, MUL VL] 33362306a36Sopenharmony_ci str p10, [x2, #10, MUL VL] 33462306a36Sopenharmony_ci str p11, [x2, #11, MUL VL] 33562306a36Sopenharmony_ci str p12, [x2, #12, MUL VL] 33662306a36Sopenharmony_ci str p13, [x2, #13, MUL VL] 33762306a36Sopenharmony_ci str p14, [x2, #14, MUL VL] 33862306a36Sopenharmony_ci str p15, [x2, #15, MUL VL] 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci // Only save FFR if we wrote a value for SME 34162306a36Sopenharmony_ci ldr x2, =ffr_in 34262306a36Sopenharmony_ci ldr x2, [x2, #0] 34362306a36Sopenharmony_ci cbz x2, 1f 34462306a36Sopenharmony_ci ldr x2, =ffr_out 34562306a36Sopenharmony_ci rdffr p0.b 34662306a36Sopenharmony_ci str p0, [x2] 34762306a36Sopenharmony_ci1: 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci // Restore callee saved registers x19-x30 35062306a36Sopenharmony_ci ldp x19, x20, [sp, #32] 35162306a36Sopenharmony_ci ldp x21, x22, [sp, #48] 35262306a36Sopenharmony_ci ldp x23, x24, [sp, #64] 35362306a36Sopenharmony_ci ldp x25, x26, [sp, #80] 35462306a36Sopenharmony_ci ldp x27, x28, [sp, #96] 35562306a36Sopenharmony_ci ldp x29, x30, [sp], #112 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci // Clear SVCR if we were doing SME so future tests don't have ZA 35862306a36Sopenharmony_ci cbz x1, 1f 35962306a36Sopenharmony_ci msr S3_3_C4_C2_2, xzr 36062306a36Sopenharmony_ci1: 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci ret 363