Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <mathieu.desnoyers@efficios.com>
Acked-by: Will Deacon <will.deacon@arm.com>
CC: Peter Zijlstra <peterz@infradead.org>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Joel Fernandes <joelaf@google.com>
CC: Catalin Marinas <catalin.marinas@arm.com>
CC: Dave Watson <davejwatson@fb.com>
CC: Will Deacon <will.deacon@arm.com>
CC: Shuah Khan <shuah@kernel.org>
CC: Andi Kleen <andi@firstfloor.org>
CC: linux-kselftest@vger.kernel.org
CC: "H . Peter Anvin" <hpa@zytor.com>
CC: Chris Lameter <cl@linux.com>
CC: Russell King <linux@arm.linux.org.uk>
CC: Michael Kerrisk <mtk.manpages@gmail.com>
CC: "Paul E . McKenney" <paulmck@linux.vnet.ibm.com>
CC: Paul Turner <pjt@google.com>
CC: Boqun Feng <boqun.feng@gmail.com>
CC: Josh Triplett <josh@joshtriplett.org>
CC: Steven Rostedt <rostedt@goodmis.org>
CC: Ben Maurer <bmaurer@fb.com>
CC: linux-api@vger.kernel.org
CC: Andy Lutomirski <luto@amacapital.net>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>

authored by

Mathieu Desnoyers and committed by
Shuah Khan
7cd4ce2e 2b845d4b

+15 -2
+15 -2
tools/testing/selftests/rseq/rseq-arm64.h
··· 6 6 * (C) Copyright 2018 - Will Deacon <will.deacon@arm.com> 7 7 */ 8 8 9 - #define RSEQ_SIG 0xd428bc00 /* BRK #0x45E0 */ 9 + /* 10 + * aarch64 -mbig-endian generates mixed endianness code vs data: 11 + * little-endian code and big-endian data. Ensure the RSEQ_SIG signature 12 + * matches code endianness. 13 + */ 14 + #define RSEQ_SIG_CODE 0xd428bc00 /* BRK #0x45E0. */ 15 + 16 + #ifdef __AARCH64EB__ 17 + #define RSEQ_SIG_DATA 0x00bc28d4 /* BRK #0x45E0. */ 18 + #else 19 + #define RSEQ_SIG_DATA RSEQ_SIG_CODE 20 + #endif 21 + 22 + #define RSEQ_SIG RSEQ_SIG_DATA 10 23 11 24 #define rseq_smp_mb() __asm__ __volatile__ ("dmb ish" ::: "memory") 12 25 #define rseq_smp_rmb() __asm__ __volatile__ ("dmb ishld" ::: "memory") ··· 134 121 135 122 #define RSEQ_ASM_DEFINE_ABORT(label, abort_label) \ 136 123 " b 222f\n" \ 137 - " .inst " __rseq_str(RSEQ_SIG) "\n" \ 124 + " .inst " __rseq_str(RSEQ_SIG_CODE) "\n" \ 138 125 __rseq_str(label) ":\n" \ 139 126 " b %l[" __rseq_str(abort_label) "]\n" \ 140 127 "222:\n"