Commit 1c3b6145 authored by Mark Brown's avatar Mark Brown Committed by Catalin Marinas

kselftest/arm64: Run BTI selftests on systems without BTI

The BTI selftests are built both with and without BTI support, validating
both the generation of BTI signals as expected for binaries without BTI
support. Both versions of the binary currently skip all their tests when
the system does not support BTI, however this is excessive since we do have
a defined ABI for how the programs should function in this case (especially
for the non-BTI binary). Update the test program to run all the tests
unconditionally, adding a runtime adjustment of the expected results on
systems that don't support BTI where we currently handle the build time
case.

The tests all use HINT space instructions, BTI itself is a HINT as is
are the PAC instructions that function as landing pads, so nothing in the
tests depends on support for BTI in the kernel or hardware.
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20230110-arm64-bti-selftest-skip-v1-2-143ecdc84567@kernel.orgSigned-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 30792e7c
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "system.h" #include "system.h"
#include <stdbool.h>
#include <stddef.h> #include <stddef.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/auxvec.h> #include <linux/auxvec.h>
...@@ -101,7 +102,8 @@ static void handler(int n, siginfo_t *si __always_unused, ...@@ -101,7 +102,8 @@ static void handler(int n, siginfo_t *si __always_unused,
uc->uc_mcontext.pstate &= ~PSR_BTYPE_MASK; uc->uc_mcontext.pstate &= ~PSR_BTYPE_MASK;
} }
static int skip_all; /* Does the system have BTI? */
static bool have_bti;
static void __do_test(void (*trampoline)(void (*)(void)), static void __do_test(void (*trampoline)(void (*)(void)),
void (*fn)(void), void (*fn)(void),
...@@ -109,19 +111,11 @@ static void __do_test(void (*trampoline)(void (*)(void)), ...@@ -109,19 +111,11 @@ static void __do_test(void (*trampoline)(void (*)(void)),
const char *name, const char *name,
int expect_sigill) int expect_sigill)
{ {
if (skip_all) { /*
test_skipped++; * Branch Target exceptions should only happen for BTI
putstr("ok "); * binaries running on a system with BTI:
putnum(test_num++); */
putstr(" "); if (!BTI || !have_bti)
puttestname(name, trampoline_name);
putstr(" # SKIP\n");
return;
}
/* Branch Target exceptions should only happen in BTI binaries: */
if (!BTI)
expect_sigill = 0; expect_sigill = 0;
sigill_expected = expect_sigill; sigill_expected = expect_sigill;
...@@ -199,9 +193,10 @@ void start(int *argcp) ...@@ -199,9 +193,10 @@ void start(int *argcp)
putstr("# HWCAP2_BTI present\n"); putstr("# HWCAP2_BTI present\n");
if (!(hwcap & HWCAP_PACA)) if (!(hwcap & HWCAP_PACA))
putstr("# Bad hardware? Expect problems.\n"); putstr("# Bad hardware? Expect problems.\n");
have_bti = true;
} else { } else {
putstr("# HWCAP2_BTI not present\n"); putstr("# HWCAP2_BTI not present\n");
skip_all = 1; have_bti = false;
} }
putstr("# Test binary"); putstr("# Test binary");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment