Path: blob/master/tools/testing/selftests/arm64/fp/fp-ptrace-asm.S
26292 views
// SPDX-License-Identifier: GPL-2.0-only1// Copyright (C) 2021-3 ARM Limited.2//3// Assembly portion of the FP ptrace test45//6// Load values from memory into registers, break on a breakpoint, then7// break on a further breakpoint8//910#include "fp-ptrace.h"11#include "sme-inst.h"1213.arch_extension sve1415// Load and save register values with pauses for ptrace16//17// x0 - HAVE_ flags indicating which features are in use1819.globl load_and_save20load_and_save:21stp x11, x12, [sp, #-0x10]!2223// This should be redundant in the SVE case24ldr x7, =v_in25ldp q0, q1, [x7]26ldp q2, q3, [x7, #16 * 2]27ldp q4, q5, [x7, #16 * 4]28ldp q6, q7, [x7, #16 * 6]29ldp q8, q9, [x7, #16 * 8]30ldp q10, q11, [x7, #16 * 10]31ldp q12, q13, [x7, #16 * 12]32ldp q14, q15, [x7, #16 * 14]33ldp q16, q17, [x7, #16 * 16]34ldp q18, q19, [x7, #16 * 18]35ldp q20, q21, [x7, #16 * 20]36ldp q22, q23, [x7, #16 * 22]37ldp q24, q25, [x7, #16 * 24]38ldp q26, q27, [x7, #16 * 26]39ldp q28, q29, [x7, #16 * 28]40ldp q30, q31, [x7, #16 * 30]4142// SME?43tbz x0, #HAVE_SME_SHIFT, check_sve_in4445adrp x7, svcr_in46ldr x7, [x7, :lo12:svcr_in]47// SVCR is 0 by default, avoid triggering SME if not in use48cbz x7, check_sve_in49msr S3_3_C4_C2_2, x75051// ZA?52tbz x7, #SVCR_ZA_SHIFT, check_sm_in53rdsvl 11, 154mov w12, #055ldr x6, =za_in561: _ldr_za 12, 657add x6, x6, x1158add x12, x12, #159cmp x11, x1260bne 1b6162// ZT?63tbz x0, #HAVE_SME2_SHIFT, check_sm_in64adrp x6, zt_in65add x6, x6, :lo12:zt_in66_ldr_zt 66768// In streaming mode?69check_sm_in:70tbz x7, #SVCR_SM_SHIFT, check_sve_in7172// Load FFR if we have FA6473ubfx x4, x0, #HAVE_FA64_SHIFT, #174b load_sve7576// SVE?77check_sve_in:78tbz x0, #HAVE_SVE_SHIFT, check_fpmr_in79mov x4, #18081load_sve:82ldr x7, =z_in83ldr z0, [x7, #0, MUL VL]84ldr z1, [x7, #1, MUL VL]85ldr z2, [x7, #2, MUL VL]86ldr z3, [x7, #3, MUL VL]87ldr z4, [x7, #4, MUL VL]88ldr z5, [x7, #5, MUL VL]89ldr z6, [x7, #6, MUL VL]90ldr z7, [x7, #7, MUL VL]91ldr z8, [x7, #8, MUL VL]92ldr z9, [x7, #9, MUL VL]93ldr z10, [x7, #10, MUL VL]94ldr z11, [x7, #11, MUL VL]95ldr z12, [x7, #12, MUL VL]96ldr z13, [x7, #13, MUL VL]97ldr z14, [x7, #14, MUL VL]98ldr z15, [x7, #15, MUL VL]99ldr z16, [x7, #16, MUL VL]100ldr z17, [x7, #17, MUL VL]101ldr z18, [x7, #18, MUL VL]102ldr z19, [x7, #19, MUL VL]103ldr z20, [x7, #20, MUL VL]104ldr z21, [x7, #21, MUL VL]105ldr z22, [x7, #22, MUL VL]106ldr z23, [x7, #23, MUL VL]107ldr z24, [x7, #24, MUL VL]108ldr z25, [x7, #25, MUL VL]109ldr z26, [x7, #26, MUL VL]110ldr z27, [x7, #27, MUL VL]111ldr z28, [x7, #28, MUL VL]112ldr z29, [x7, #29, MUL VL]113ldr z30, [x7, #30, MUL VL]114ldr z31, [x7, #31, MUL VL]115116// FFR is not present in base SME117cbz x4, 1f118ldr x7, =ffr_in119ldr p0, [x7]120ldr x7, [x7, #0]121cbz x7, 1f122wrffr p0.b1231:124125ldr x7, =p_in126ldr p0, [x7, #0, MUL VL]127ldr p1, [x7, #1, MUL VL]128ldr p2, [x7, #2, MUL VL]129ldr p3, [x7, #3, MUL VL]130ldr p4, [x7, #4, MUL VL]131ldr p5, [x7, #5, MUL VL]132ldr p6, [x7, #6, MUL VL]133ldr p7, [x7, #7, MUL VL]134ldr p8, [x7, #8, MUL VL]135ldr p9, [x7, #9, MUL VL]136ldr p10, [x7, #10, MUL VL]137ldr p11, [x7, #11, MUL VL]138ldr p12, [x7, #12, MUL VL]139ldr p13, [x7, #13, MUL VL]140ldr p14, [x7, #14, MUL VL]141ldr p15, [x7, #15, MUL VL]142143// This has to come after we set PSTATE.SM144check_fpmr_in:145tbz x0, #HAVE_FPMR_SHIFT, wait_for_writes146adrp x7, fpmr_in147ldr x7, [x7, :lo12:fpmr_in]148msr REG_FPMR, x7149150wait_for_writes:151// Wait for the parent152brk #0153154// Save values155ldr x7, =v_out156stp q0, q1, [x7]157stp q2, q3, [x7, #16 * 2]158stp q4, q5, [x7, #16 * 4]159stp q6, q7, [x7, #16 * 6]160stp q8, q9, [x7, #16 * 8]161stp q10, q11, [x7, #16 * 10]162stp q12, q13, [x7, #16 * 12]163stp q14, q15, [x7, #16 * 14]164stp q16, q17, [x7, #16 * 16]165stp q18, q19, [x7, #16 * 18]166stp q20, q21, [x7, #16 * 20]167stp q22, q23, [x7, #16 * 22]168stp q24, q25, [x7, #16 * 24]169stp q26, q27, [x7, #16 * 26]170stp q28, q29, [x7, #16 * 28]171stp q30, q31, [x7, #16 * 30]172173tbz x0, #HAVE_FPMR_SHIFT, check_sme_out174mrs x7, REG_FPMR175adrp x6, fpmr_out176str x7, [x6, :lo12:fpmr_out]177178check_sme_out:179tbz x0, #HAVE_SME_SHIFT, check_sve_out180181rdsvl 11, 1182adrp x6, sme_vl_out183str x11, [x6, :lo12:sme_vl_out]184185mrs x7, S3_3_C4_C2_2186adrp x6, svcr_out187str x7, [x6, :lo12:svcr_out]188189// ZA?190tbz x7, #SVCR_ZA_SHIFT, check_sm_out191mov w12, #0192ldr x6, =za_out1931: _str_za 12, 6194add x6, x6, x11195add x12, x12, #1196cmp x11, x12197bne 1b198199// ZT?200tbz x0, #HAVE_SME2_SHIFT, check_sm_out201adrp x6, zt_out202add x6, x6, :lo12:zt_out203_str_zt 6204205// In streaming mode?206check_sm_out:207tbz x7, #SVCR_SM_SHIFT, check_sve_out208209// Do we have FA64 and FFR?210ubfx x4, x0, #HAVE_FA64_SHIFT, #1211b read_sve212213// SVE?214check_sve_out:215tbz x0, #HAVE_SVE_SHIFT, wait_for_reads216mov x4, #1217218rdvl x7, #1219adrp x6, sve_vl_out220str x7, [x6, :lo12:sve_vl_out]221222read_sve:223ldr x7, =z_out224str z0, [x7, #0, MUL VL]225str z1, [x7, #1, MUL VL]226str z2, [x7, #2, MUL VL]227str z3, [x7, #3, MUL VL]228str z4, [x7, #4, MUL VL]229str z5, [x7, #5, MUL VL]230str z6, [x7, #6, MUL VL]231str z7, [x7, #7, MUL VL]232str z8, [x7, #8, MUL VL]233str z9, [x7, #9, MUL VL]234str z10, [x7, #10, MUL VL]235str z11, [x7, #11, MUL VL]236str z12, [x7, #12, MUL VL]237str z13, [x7, #13, MUL VL]238str z14, [x7, #14, MUL VL]239str z15, [x7, #15, MUL VL]240str z16, [x7, #16, MUL VL]241str z17, [x7, #17, MUL VL]242str z18, [x7, #18, MUL VL]243str z19, [x7, #19, MUL VL]244str z20, [x7, #20, MUL VL]245str z21, [x7, #21, MUL VL]246str z22, [x7, #22, MUL VL]247str z23, [x7, #23, MUL VL]248str z24, [x7, #24, MUL VL]249str z25, [x7, #25, MUL VL]250str z26, [x7, #26, MUL VL]251str z27, [x7, #27, MUL VL]252str z28, [x7, #28, MUL VL]253str z29, [x7, #29, MUL VL]254str z30, [x7, #30, MUL VL]255str z31, [x7, #31, MUL VL]256257ldr x7, =p_out258str p0, [x7, #0, MUL VL]259str p1, [x7, #1, MUL VL]260str p2, [x7, #2, MUL VL]261str p3, [x7, #3, MUL VL]262str p4, [x7, #4, MUL VL]263str p5, [x7, #5, MUL VL]264str p6, [x7, #6, MUL VL]265str p7, [x7, #7, MUL VL]266str p8, [x7, #8, MUL VL]267str p9, [x7, #9, MUL VL]268str p10, [x7, #10, MUL VL]269str p11, [x7, #11, MUL VL]270str p12, [x7, #12, MUL VL]271str p13, [x7, #13, MUL VL]272str p14, [x7, #14, MUL VL]273str p15, [x7, #15, MUL VL]274275// Only save FFR if it exists276cbz x4, wait_for_reads277ldr x7, =ffr_out278rdffr p0.b279str p0, [x7]280281wait_for_reads:282// Wait for the parent283brk #0284285// Ensure we don't leave ourselves in streaming mode286tbz x0, #HAVE_SME_SHIFT, out287msr S3_3_C4_C2_2, xzr288289out:290ldp x11, x12, [sp, #-0x10]291ret292293294