diff options
author | Mathieu Desnoyers <[email protected]> | 2019-04-29 11:28:00 -0400 |
---|---|---|
committer | Shuah Khan <[email protected]> | 2019-05-07 15:32:51 -0600 |
commit | 7cd4ce2e466f56ae92930adbded675a4e326a59e (patch) | |
tree | 3700a7192560fd8375c443759b991ab8f74ebda8 | |
parent | 2b845d4b4acd9422bbb668989db8dc36dfc8f438 (diff) |
rseq/selftests: aarch64 code signature: handle big-endian environment
Handle compiling with -mbig-endian on aarch64, which generates binaries
with mixed code vs data endianness (little endian code, big endian
data).
Else mismatch between code endianness for the generated signatures and
data endianness for the RSEQ_SIG parameter passed to the rseq
registration will trigger application segmentation faults when the
kernel try to abort rseq critical sections.
Signed-off-by: Mathieu Desnoyers <[email protected]>
Acked-by: Will Deacon <[email protected]>
CC: Peter Zijlstra <[email protected]>
CC: Thomas Gleixner <[email protected]>
CC: Joel Fernandes <[email protected]>
CC: Catalin Marinas <[email protected]>
CC: Dave Watson <[email protected]>
CC: Will Deacon <[email protected]>
CC: Shuah Khan <[email protected]>
CC: Andi Kleen <[email protected]>
CC: [email protected]
CC: "H . Peter Anvin" <[email protected]>
CC: Chris Lameter <[email protected]>
CC: Russell King <[email protected]>
CC: Michael Kerrisk <[email protected]>
CC: "Paul E . McKenney" <[email protected]>
CC: Paul Turner <[email protected]>
CC: Boqun Feng <[email protected]>
CC: Josh Triplett <[email protected]>
CC: Steven Rostedt <[email protected]>
CC: Ben Maurer <[email protected]>
CC: [email protected]
CC: Andy Lutomirski <[email protected]>
CC: Andrew Morton <[email protected]>
CC: Linus Torvalds <[email protected]>
Signed-off-by: Shuah Khan <[email protected]>
-rw-r--r-- | tools/testing/selftests/rseq/rseq-arm64.h | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/tools/testing/selftests/rseq/rseq-arm64.h b/tools/testing/selftests/rseq/rseq-arm64.h index b41a2a48e965..200dae9e4208 100644 --- a/tools/testing/selftests/rseq/rseq-arm64.h +++ b/tools/testing/selftests/rseq/rseq-arm64.h @@ -6,7 +6,20 @@ * (C) Copyright 2018 - Will Deacon <[email protected]> */ -#define RSEQ_SIG 0xd428bc00 /* BRK #0x45E0 */ +/* + * aarch64 -mbig-endian generates mixed endianness code vs data: + * little-endian code and big-endian data. Ensure the RSEQ_SIG signature + * matches code endianness. + */ +#define RSEQ_SIG_CODE 0xd428bc00 /* BRK #0x45E0. */ + +#ifdef __AARCH64EB__ +#define RSEQ_SIG_DATA 0x00bc28d4 /* BRK #0x45E0. */ +#else +#define RSEQ_SIG_DATA RSEQ_SIG_CODE +#endif + +#define RSEQ_SIG RSEQ_SIG_DATA #define rseq_smp_mb() __asm__ __volatile__ ("dmb ish" ::: "memory") #define rseq_smp_rmb() __asm__ __volatile__ ("dmb ishld" ::: "memory") @@ -121,7 +134,7 @@ do { \ #define RSEQ_ASM_DEFINE_ABORT(label, abort_label) \ " b 222f\n" \ - " .inst " __rseq_str(RSEQ_SIG) "\n" \ + " .inst " __rseq_str(RSEQ_SIG_CODE) "\n" \ __rseq_str(label) ":\n" \ " b %l[" __rseq_str(abort_label) "]\n" \ "222:\n" |