mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-25 03:55:09 +08:00
7011d72588
The "First Fault Register" (FFR) is an SVE register that mimics a predicate register, but clears bits when a load or store fails to handle an element of a vector. The supposed usage scenario is to initialise this register (using SETFFR), then *read* it later on to learn about elements that failed to load or store. Explicit writes to this register using the WRFFR instruction are only supposed to *restore* values previously read from the register (for context-switching only). As the manual describes, this register holds only certain values, it: "... contains a monotonic predicate value, in which starting from bit 0 there are zero or more 1 bits, followed only by 0 bits in any remaining bit positions." Any other value is UNPREDICTABLE and is not supposed to be "restored" into the register. The SVE test currently tries to write a signature pattern into the register, which is *not* a canonical FFR value. Apparently the existing setups treat UNPREDICTABLE as "read-as-written", but a new implementation actually only stores canonical values. As a consequence, the sve-test fails immediately when comparing the FFR value: ----------- # ./sve-test Vector length: 128 bits PID: 207 Mismatch: PID=207, iteration=0, reg=48 Expected [cf00] Got [0f00] Aborted ----------- Fix this by only populating the FFR with proper canonical values. Effectively the requirement described above limits us to 17 unique values over 16 bits worth of FFR, so we condense our signature down to 4 bits (2 bits from the PID, 2 bits from the generation) and generate the canonical pattern from it. Any bits describing elements above the minimum 128 bit are set to 0. This aligns the FFR usage to the architecture and fixes the test on microarchitectures implementing FFR in a more restricted way. Signed-off-by: Andre Przywara <andre.przywara@arm.com> Reviwed-by: Mark Brown <broonie@kernel.org> Link: https://lore.kernel.org/r/20210319120128.29452-1-andre.przywara@arm.com Signed-off-by: Will Deacon <will@kernel.org> |
||
---|---|---|
.. | ||
fp | ||
mte | ||
pauth | ||
signal | ||
tags | ||
Makefile | ||
README |
KSelfTest ARM64 =============== - These tests are arm64 specific and so not built or run but just skipped completely when env-variable ARCH is found to be different than 'arm64' and `uname -m` reports other than 'aarch64'. - Holding true the above, ARM64 KSFT tests can be run within the KSelfTest framework using standard Linux top-level-makefile targets: $ make TARGETS=arm64 kselftest-clean $ make TARGETS=arm64 kselftest or $ make -C tools/testing/selftests TARGETS=arm64 \ INSTALL_PATH=<your-installation-path> install or, alternatively, only specific arm64/ subtargets can be picked: $ make -C tools/testing/selftests TARGETS=arm64 ARM64_SUBTARGETS="tags signal" \ INSTALL_PATH=<your-installation-path> install Further details on building and running KFST can be found in: Documentation/dev-tools/kselftest.rst