Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp1100609yba; Wed, 24 Apr 2019 15:08:39 -0700 (PDT) X-Google-Smtp-Source: APXvYqz9GALeZtGDjtfA2/wbxQzgX7rU+hr1tS7gN+MQ8t/HmV3T5mTixffNKLZtifrzkxHyS4dT X-Received: by 2002:aa7:9465:: with SMTP id t5mr36198828pfq.247.1556143719594; Wed, 24 Apr 2019 15:08:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1556143719; cv=none; d=google.com; s=arc-20160816; b=QYCtSHOzXsGQBQWUNqUBOIgFO1rmAVRxwsKjDJ5tXZI8hUcORkjVxVNwTmUQgvz6UR Uou+z+q0bsqo3EnuqayodfqDRtHkXi655J6KSvE1ku+qwqRd4UMCGSNldmiwKsNaIJQW YKBRRIcRkMSFvN/51H7kjr+H2LuKbHAZWUI0VGjdI8/2ORBmvtBebeaoQ5qQAm4PfTap D0KC4FoxpXSY9rPhukwD3d6WSMjMfeKjjXS9EP7zAxU2TuHh6PZkqYdW3kG4BfZnfJfI evedeF1dAannU9RpRU7s65mlTY9nklDoK9z8SlQTZkPs9bb9jn/io+orBsifA5j4fRi6 GJ7Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=itahwmOZfTmMOJdgVYTKkv01JpA2Vmr+JIWVKWTRORk=; b=pabNho7ODu+8kC6cbucYEJP748hWd4jXUqpjgWdqBqnKUSiOr0Oj/tFdTWBZY4xVBL Pkwx+eR+UFG/fLl7IARcc52eUoOa5m+Bu0GbPQlru0mk2yTpx4UalpF2z/P4ac8uurqE DlFsJOMYn1ci9vY4HOLDs9R7C8NASg3vAYGjyD5e/ul82oAiaQef8IhKJNB/3WoKAZRZ AOxaHKd3pGlut0Jwq4wbMcdvkv0L97rDYOpxZg+1J5cLy3mu13rhMsDig+qlDUQHbfPI cnJFpP8kYTwJ+LlkaILvNpxsagDqW/EPf9QJINJ33NF2XUV0uXTLGQzMx4z81N1ZHehL amWA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c21si19044127pgk.283.2019.04.24.15.08.24; Wed, 24 Apr 2019 15:08:39 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732727AbfDXQpH (ORCPT + 99 others); Wed, 24 Apr 2019 12:45:07 -0400 Received: from foss.arm.com ([217.140.101.70]:48766 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726935AbfDXQpG (ORCPT ); Wed, 24 Apr 2019 12:45:06 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 18F5D374; Wed, 24 Apr 2019 09:45:06 -0700 (PDT) Received: from fuggles.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.72.51.249]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id C458B3F557; Wed, 24 Apr 2019 09:45:01 -0700 (PDT) Date: Wed, 24 Apr 2019 17:44:57 +0100 From: Will Deacon To: Mark Rutland Cc: Mathieu Desnoyers , Peter Zijlstra , "Paul E . McKenney" , Boqun Feng , linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, Thomas Gleixner , Andy Lutomirski , Dave Watson , Paul Turner , Andrew Morton , Russell King , Ingo Molnar , "H . Peter Anvin" , Andi Kleen , Chris Lameter , Ben Maurer , Steven Rostedt , Josh Triplett , Linus Torvalds , Catalin Marinas , Michael Kerrisk , Joel Fernandes , Shuah Khan , linux-kselftest@vger.kernel.org Subject: Re: [RFC PATCH for 5.2 08/10] rseq/selftests: aarch64 code signature: handle big-endian environment Message-ID: <20190424164457.GA18611@fuggles.cambridge.arm.com> References: <20190424152502.14246-1-mathieu.desnoyers@efficios.com> <20190424152502.14246-9-mathieu.desnoyers@efficios.com> <20190424164032.GD21101@lakrids.cambridge.arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190424164032.GD21101@lakrids.cambridge.arm.com> User-Agent: Mutt/1.11.1+86 (6f28e57d73f2) () Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Apr 24, 2019 at 05:40:33PM +0100, Mark Rutland wrote: > On Wed, Apr 24, 2019 at 11:25:00AM -0400, Mathieu Desnoyers wrote: > > 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 > > CC: Peter Zijlstra > > CC: Thomas Gleixner > > CC: Joel Fernandes > > CC: Catalin Marinas > > CC: Dave Watson > > CC: Will Deacon > > CC: Shuah Khan > > CC: Andi Kleen > > CC: linux-kselftest@vger.kernel.org > > CC: "H . Peter Anvin" > > CC: Chris Lameter > > CC: Russell King > > CC: Michael Kerrisk > > CC: "Paul E . McKenney" > > CC: Paul Turner > > CC: Boqun Feng > > CC: Josh Triplett > > CC: Steven Rostedt > > CC: Ben Maurer > > CC: linux-api@vger.kernel.org > > CC: Andy Lutomirski > > CC: Andrew Morton > > CC: Linus Torvalds > > --- > > tools/testing/selftests/rseq/rseq-arm64.h | 17 +++++++++++++++-- > > 1 file 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 > > */ > > > > -#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" \ > > I don't think this is right; the .inst directive _should_ emit the value > in the instruction stream endianness (i.e. LE, regardless of the data > endianness). > > That's certainly the case with the kernel.org crosstool GCC: > > [mark@lakrids:/mnt/data/tests/inst-test]% cat test.c > void func(void) > { > asm volatile(".inst 0xd4000001"); > } > [mark@lakrids:/mnt/data/tests/inst-test]% usekorg 8.1.0 aarch64-linux-gcc -c test.c > [mark@lakrids:/mnt/data/tests/inst-test]% usekorg 8.1.0 aarch64-linux-objdump -d test.o > > test.o: file format elf64-littleaarch64 > > > Disassembly of section .text: > > 0000000000000000 : > 0: d4000001 svc #0x0 > 4: d503201f nop > 8: d65f03c0 ret > [mark@lakrids:/mnt/data/tests/inst-test]% usekorg 8.1.0 aarch64-linux-gcc -mbig-endian -c test.c > [mark@lakrids:/mnt/data/tests/inst-test]% usekorg 8.1.0 aarch64-linux-objdump -d test.o > > test.o: file format elf64-bigaarch64 > > > Disassembly of section .text: > > 0000000000000000 : > 0: d4000001 svc #0x0 > 4: d503201f nop > 8: d65f03c0 ret > > > > Have you tested this? Is there some toolchain that doesn't get this > right? I think that the issue is that the kernel loads the thing to check the signature. RSEQ_SIG_CODE isn't byte-swapped explicitly and is used with .inst. RSEG_SIG_DATA is byte-swapped to ensure that the value passed into the syscall is consistent with what the kernel will load. But yeah, I've just spent the last ten minutes confusing myself with this. Will