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