[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