[PATCH v3 14/21] kselftest/arm64: Add a stress test program for ZT0
Zenghui Yu
yuzenghui at huawei.com
Sat Dec 17 01:15:35 PST 2022
On 2022/11/12 5:50, Mark Brown wrote:
> +// Trivial memory copy: copy x2 bytes, starting at address x1, to address x0.
> +// Clobbers x0-x3
> +function memcpy
> + cmp x2, #0
> + b.eq 1f
> +0: ldrb w3, [x1], #1
> + strb w3, [x0], #1
> + subs x2, x2, #1
> + b.ne 0b
> +1: ret
> +endfunction
There is an exact same implementation of memcpy in fp/asm-utils.S.
> +
> +// Generate a test pattern for storage in ZT
> +// x0: pid
> +// x1: generation
> +
> +// These values are used to constuct a 32-bit pattern that is repeated in the
s/constuct/construct/ ?
> +// scratch buffer as many times as will fit:
> +// bits 31:24 generation number (increments once per test_loop)
> +// bits 23: 8 pid
> +// bits 7: 0 32-bit lane index
> +
> +function pattern
> + mov w3, wzr
> + bfi w3, w0, #8, #16 // PID
> + bfi w3, w1, #24, #8 // Generation
> +
> + ldr x0, =scratch
> + mov w1, #ZT_B / 4
> +
> +0: str w3, [x0], #4
> + add w3, w3, #1 // Lane
> + subs w1, w1, #1
> + b.ne 0b
> +
> + ret
> +endfunction
> +
> +// Set up test pattern in a ZT horizontal vector
> +// x0: pid
> +// x1: generation
> +function setup_zt
> + mov x4, x30
> +
> + bl pattern // Get pattern in scratch buffer
> + ldr x0, =ztref
> + ldr x1, =scratch
> + mov x2, #ZT_B
> + bl memcpy
> +
> + _ldr_zt 0 // load zt0 from pointer x0
Isn't x0 already clobbered by memcpy (and is now pointing to the
end of ztref)?
> +
> + ret x4
> +endfunction
> +
> +// Trivial memory compare: compare x2 bytes starting at address x0 with
> +// bytes starting at address x1.
> +// Returns only if all bytes match; otherwise, the program is aborted.
> +// Clobbers x0-x5.
> +function memcmp
> + cbz x2, 2f
> +
> + stp x0, x1, [sp, #-0x20]!
> + str x2, [sp, #0x10]
> +
> + mov x5, #0
> +0: ldrb w3, [x0, x5]
> + ldrb w4, [x1, x5]
> + add x5, x5, #1
> + cmp w3, w4
> + b.ne 1f
> + subs x2, x2, #1
> + b.ne 0b
> +
> +1: ldr x2, [sp, #0x10]
> + ldp x0, x1, [sp], #0x20
> + b.ne barf
> +
> +2: ret
> +endfunction
> +
> +// Verify that a ZT vector matches its shadow in memory, else abort
> +// Clobbers x0-x7 and x12.
It looks like check_zt doesn't clobber as many registers as "x0-x7
and x12".
> +function check_zt
> + mov x3, x30
> +
> + ldr x0, =scratch // Poison scratch
> + mov x1, #ZT_B
> + bl memfill_ae
> +
> + ldr x0, =scratch
> + _str_zt 0
> +
> + ldr x0, =ztref
> + ldr x1, =scratch
> + mov x2, #ZT_B
> + mov x30, x3
> + b memcmp
> +endfunction
[...]
> +.Ltest_loop:
> + mov x0, x20
> + mov x1, x22
> + bl setup_zt
> +
> + mov x8, #__NR_sched_yield // Encourage preemption
> + svc #0
> +
> + mov x0, x20
> + mov x1, x22
check_zt receives no parameter so there is no need to initialize
x0 and x1.
> + bl check_zt
> +
> + add x22, x22, #1 // Everything still working
> + b .Ltest_loop
> +
> +.Labort:
> + mov x0, #0
> + mov x1, #SIGABRT
> + mov x8, #__NR_kill
> + svc #0
> +endfunction
[...]
> +function svcr_barf
And svcr_barf is unused in zt-test.
Zenghui
More information about the linux-arm-kernel
mailing list