linux/tools/testing/selftests/arm64/fp
Mark Brown c745b15c1f kselftest/arm64: Test that ptrace takes effect in the target process
While we have test coverage for the ptrace interface in our selftests
the current programs have a number of gaps. The testing is done per
regset so does not cover interactions and at no point do any of the
tests actually run the traced processes meaning that there is no
validation that anything we read or write corresponds to register values
the process actually sees. Let's add a new program which attempts to cover
these gaps.

Each test we do performs a single ptrace write. For each test we generate
some random initial register data in memory and then fork() and trace a
child. The child will load the generated data into the registers then
trigger a breakpoint. The parent waits for the breakpoint then reads the
entire child register state via ptrace, verifying that the values expected
were actually loaded by the child. It then does the write being tested
and resumes the child. Once resumed the child saves the register state
it sees to memory and executes another breakpoint. The parent uses
process_vm_readv() to get these values from the child and verifies that
the values were as expected before cleaning up the child.

We generate configurations with combinations of vector lengths and SVCR
values and then try every ptrace write which will implement the
transition we generated. In order to control execution time (especially
in emulation) we only cover the minimum and maximum VL for each of SVE
and SME, this will ensure we generate both increasing and decreasing
changes in vector length. In order to provide a baseline test we also
check the case where we resume the child without doing a ptrace write.

In order to simplify the generation of the test count for kselftest we
will report but skip a substantial number of tests that can't actually
be expressed via a single ptrace write, several times more than we
actually run. This is noisy and will add some overhead but is very much
simpler so is probably worth the tradeoff.

Signed-off-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20240122-arm64-test-ptrace-regs-v1-1-0897f822d73e@kernel.org
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
2024-02-21 17:59:35 +00:00
..
.gitignore kselftest/arm64: Test that ptrace takes effect in the target process 2024-02-21 17:59:35 +00:00
asm-offsets.h kselftest/arm64: Count SIGUSR2 deliveries in FP stress tests 2022-09-06 18:31:41 +01:00
asm-utils.S selftests: arm64: Factor out utility functions for assembly FP tests 2021-10-21 11:11:27 +01:00
assembler.h kselftest/arm64: Fix .pushsection for strings in FP tests 2023-01-20 14:30:45 +00:00
fp-pidbench.S kselftest/arm64: Remove redundant _start labels from FP tests 2023-01-20 14:30:45 +00:00
fp-ptrace-asm.S kselftest/arm64: Test that ptrace takes effect in the target process 2024-02-21 17:59:35 +00:00
fp-ptrace.c kselftest/arm64: Test that ptrace takes effect in the target process 2024-02-21 17:59:35 +00:00
fp-ptrace.h kselftest/arm64: Test that ptrace takes effect in the target process 2024-02-21 17:59:35 +00:00
fp-stress.c Merge branches 'for-next/sysreg', 'for-next/sme', 'for-next/kselftest', 'for-next/misc', 'for-next/sme2', 'for-next/tpidr2', 'for-next/scs', 'for-next/compat-hwcap', 'for-next/ftrace', 'for-next/efi-boot-mmu-on', 'for-next/ptrauth' and 'for-next/pseudo-nmi', remote-tracking branch 'arm64/for-next/perf' into for-next/core 2023-02-10 18:51:49 +00:00
fpsimd-stress selftests: arm64: Add wrapper scripts for stress tests 2020-09-18 14:17:58 +01:00
fpsimd-test.S kselftest/arm64: Remove redundant _start labels from FP tests 2023-01-20 14:30:45 +00:00
Makefile kselftest/arm64: Test that ptrace takes effect in the target process 2024-02-21 17:59:35 +00:00
rdvl-sme.c kselftest/arm64: Extend vector configuration API tests to cover SME 2022-04-28 17:57:11 +01:00
rdvl-sve.c kselftest/arm64: Provide a helper binary and "library" for SVE RDVL 2021-08-03 16:20:05 +01:00
rdvl.h kselftest/arm64: Extend vector configuration API tests to cover SME 2022-04-28 17:57:11 +01:00
rdvl.S kselftest/arm64: Extend vector configuration API tests to cover SME 2022-04-28 17:57:11 +01:00
README selftests: arm64: Add build and documentation for FP tests 2020-09-18 14:19:20 +01:00
sme-inst.h kselftest/arm64: Add a stress test program for ZT0 2023-01-20 12:23:07 +00:00
ssve-stress kselftest/arm64: sme: Provide streaming mode SVE stress test 2022-04-28 17:57:11 +01:00
sve-probe-vls.c kselftest/arm64: Validate vector lengths are set in sve-probe-vls 2021-08-03 16:20:05 +01:00
sve-ptrace.c kselftest/arm64: Limit the maximum VL we try to set via ptrace 2023-01-31 15:33:23 +00:00
sve-stress selftests: arm64: Add wrapper scripts for stress tests 2020-09-18 14:17:58 +01:00
sve-test.S kselftest/arm64: Log SVCR when the SME tests barf 2023-12-11 12:02:00 +00:00
TODO selftests: arm64: More comprehensively test the SVE ptrace interface 2021-09-29 14:40:32 +01:00
vec-syscfg.c kselftest/arm64: Don't probe the current VL for unsupported vector types 2023-12-19 10:03:17 +00:00
vlset.c kselftest/arm64: sme: Add SME support to vlset 2022-04-28 17:57:11 +01:00
za-fork-asm.S selftests/arm64: Add a testcase for handling of ZA on clone() 2022-04-28 17:57:12 +01:00
za-fork.c kselftest/arm64: Fix output formatting for za-fork 2023-11-23 14:16:15 +00:00
za-ptrace.c kselftest/arm64: Limit the maximum VL we try to set via ptrace 2023-01-31 15:33:23 +00:00
za-stress kselftest/arm64: Add stress test for SME ZA context switching 2022-04-28 17:57:12 +01:00
za-test.S kselftest/arm64: Log SVCR when the SME tests barf 2023-12-11 12:02:00 +00:00
zt-ptrace.c kselftest/arm64: Add coverage of the ZT ptrace regset 2023-01-20 12:23:09 +00:00
zt-test.S kselftest/arm64: Log SVCR when the SME tests barf 2023-12-11 12:02:00 +00:00

This directory contains a mix of tests integrated with kselftest and
standalone stress tests.

kselftest tests
===============

sve-probe-vls - Checks the SVE vector length enumeration interface
sve-ptrace - Checks the SVE ptrace interface

Running the non-kselftest tests
===============================

sve-stress performs an SVE context switch stress test, as described
below.

(The fpsimd-stress test works the same way; just substitute "fpsimd" for
"sve" in the following commands.)


The test runs until killed by the user.

If no context switch error was detected, you will see output such as
the following:

$ ./sve-stress
(wait for some time)
^C
Vector length:        512 bits
PID:    1573
Terminated by signal 15, no error, iterations=9467, signals=1014
Vector length:  512 bits
PID:    1575
Terminated by signal 15, no error, iterations=9448, signals=1028
Vector length:  512 bits
PID:    1577
Terminated by signal 15, no error, iterations=9436, signals=1039
Vector length:  512 bits
PID:    1579
Terminated by signal 15, no error, iterations=9421, signals=1039
Vector length:  512 bits
PID:    1581
Terminated by signal 15, no error, iterations=9403, signals=1039
Vector length:  512 bits
PID:    1583
Terminated by signal 15, no error, iterations=9385, signals=1036
Vector length:  512 bits
PID:    1585
Terminated by signal 15, no error, iterations=9376, signals=1039
Vector length:  512 bits
PID:    1587
Terminated by signal 15, no error, iterations=9361, signals=1039
Vector length:  512 bits
PID:    1589
Terminated by signal 15, no error, iterations=9350, signals=1039


If an error was detected, details of the mismatch will be printed
instead of "no error".

Ideally, the test should be allowed to run for many minutes or hours
to maximise test coverage.


KVM stress testing
==================

To try to reproduce the bugs that we have been observing, sve-stress
should be run in parallel in two KVM guests, while simultaneously
running on the host.

1) Start 2 guests, using the following command for each:

$ lkvm run --console=virtio -pconsole=hvc0 --sve Image

(Depending on the hardware GIC implementation, you may also need
--irqchip=gicv3.  New kvmtool defaults to that if appropriate, but I
can't remember whether my branch is new enough for that.  Try without
the option first.)

Kvmtool occupies the terminal until you kill it (Ctrl+A x),
or until the guest terminates.  It is therefore recommended to run
each instance in separate terminal (use screen or ssh etc.)  This
allows multiple guests to be run in parallel while running other
commands on the host.

Within the guest, the host filesystem is accessible, mounted on /host.

2) Run the sve-stress on *each* guest with the Vector-Length set to 32:
guest$ ./vlset --inherit 32 ./sve-stress

3) Run the sve-stress on the host with the maximum Vector-Length:
host$ ./vlset --inherit --max ./sve-stress


Again, the test should be allowed to run for many minutes or hours to
maximise test coverage.

If no error is detected, you will see output from each sve-stress
instance similar to that illustrated above; otherwise details of the
observed mismatches will be printed.