Re: [PATCH v7 10/25] arm64: compat: Add vDSO
Hi John, On 10/07/2019 10:47, Vincenzo Frascino wrote: > Hi John, > > On 10/07/2019 05:02, John Stultz wrote: >> On Fri, Jun 21, 2019 at 3:18 AM Vincenzo Frascino >> wrote: >>> >>> Provide the arm64 compat (AArch32) vDSO in kernel/vdso32 in a similar >>> way to what happens in kernel/vdso. >>> >>> The compat vDSO leverages on an adaptation of the arm architecture code >>> with few changes: >>> - Use of lib/vdso for gettimeofday >>> - Implementation of syscall based fallback >>> - Introduction of clock_getres for the compat library >>> - Implementation of trampolines >>> - Implementation of elf note >>> >>> To build the compat vDSO a 32 bit compiler is required and needs to be >>> specified via CONFIG_CROSS_COMPILE_COMPAT_VDSO. >>> >> >> Hey Vincenzo! >> Congrats on getting this work merged, I know its been a long effort >> over a number of years! >> >> Though unfortunately, it seems the arm64 vdso code that just landed is >> breaking AOSP for me. >> >> I see a lot of the following errors: >> 01-01 01:22:14.097 755 755 F libc: Fatal signal 11 (SIGSEGV), >> code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 755 (cameraserver), >> pid 755 (cameraserver) >> 01-01 01:22:14.112 759 759 F libc: Fatal signal 11 (SIGSEGV), >> code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 759 >> (android.hardwar), pid 759 (android.hardwar) >> 01-01 01:22:14.120 756 756 F libc: Fatal signal 11 (SIGSEGV), >> code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 756 (drmserver), >> pid 756 (drmserver) >> >> Which go away if I revert the vdso merge that went in via tip/timers. >> >> I tried to bisect things down a bit, but as some later fixes are >> required (at one point, date was returning the start epoch and never >> increasing), this hasn't worked too well. But I'm guessing since I >> see: "CROSS_COMPILE_COMPAT not defined or empty, the compat vDSO will >> not be built", and the system is half working, I'm guessing this is an >> issue with just the 32bit code failing. While I can try to sort out >> the proper CROSS_COMPILE_COMPAT in my build environment, I assume >> userland shouldn't be crashing if that value isn't set. >> >> Any chance this issue has already been raised? >> > > I do not have Android (bionic/libc) as part of my testing environment hence I > never saw this issue. Thanks for reporting it. > > I am investigating the problem and will post a fix as soon as it is ready. > > As Will suggested, .config would help the debugging and I would like to ask to > you to test my fix once it is ready. Is that OK for you? > >> thanks >> -john >> > Seems that the problem you are experiencing is caused by an ABI regression for which I provided a fix in [1]. Could you please verify that works for you as well? [1] https://www.mail-archive.com/linux-kernel@vger.kernel.org/msg2046889.html Please find below the tests that I conducted to verify that when CROSS_COMPILE_COMPAT is not defined or empty the compat vdso library is not exposed. # cat main-arm32.c #include #include int main() { uintptr_t vdso = (uintptr_t) getauxval(AT_SYSINFO_EHDR); printf("AT_SYSINFO_EHDR: %p\n", vdso); [...] return 0; } # file main-arm32 main-arm32: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 3.2.0, with d When CROSS_COMPILE_COMPAT is _not_ defined: === # ./main-arm32 AT_SYSINFO_EHDR: (nil) Memory Map: --- 8000-0001 rw-p 00:00 0 0001-00011000 r-xp 00:13 24905929 /home/vinfra01/bin/main-arm32 00011000-0002 rw-p 00:00 0 0002-00021000 r--p 00:13 24905929 /home/vinfra01/bin/main-arm32 00021000-00022000 rw-p 1000 00:13 24905929 /home/vinfra01/bin/main-arm32 00022000-f773d000 rw-p 00:00 0[heap] f773d000-f781f000 r-xp 00:13 24906912 /lib/arm-linux-gnueabihf/libc-2.27.so f781f000-f782f000 ---p 000e2000 00:13 24906912 /lib/arm-linux-gnueabihf/libc-2.27.so f782f000-f7831000 r--p 000e2000 00:13 24906912 /lib/arm-linux-gnueabihf/libc-2.27.so f7831000-f7832000 rw-p 000e4000 00:13 24906912 /lib/arm-linux-gnueabihf/libc-2.27.so f7832000-f7835000 rw-p 00:00 0 f7835000-f784b000 rw-p 00:00 0 f784b000-f7863000 r-xp 00:13 24906908 /lib/arm-linux-gnueabihf/ld-2.27.so f7863000-f787 rw-p 00:00 0 f787-f7872000 rw-p 00:00 0 f7872000-f7873000 r-xp 00:00 0[sigpage] f7873000-f7874000 r--p 00018000 00:13 24906908 /lib/arm-linux-gnueabihf/ld-2.27.so f7874000-f7875000 rw-p 00019000 00:13 24906908 /lib/arm-linux-gnueabihf/ld-2.27.so f7875000-ff77a000 rw-p 00:00 0 ff87a000-ff89b000 rw-p 00:00 0[stack] ff89b000- rw-p 00:00 0 -1000 r-xp 00:00 0[vectors] 1000-f000 rw-p 00:00 0 vdsotest for compat [2]: Note: vDSO version of
Re: [PATCH v7 10/25] arm64: compat: Add vDSO
On 10/07/2019 07:12, Thomas Gleixner wrote: > On Tue, 9 Jul 2019, John Stultz wrote: >> Though unfortunately, it seems the arm64 vdso code that just landed is >> breaking AOSP for me. >> >> I see a lot of the following errors: >> 01-01 01:22:14.097 755 755 F libc: Fatal signal 11 (SIGSEGV), >> code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 755 (cameraserver), >> pid 755 (cameraserver) >> 01-01 01:22:14.112 759 759 F libc: Fatal signal 11 (SIGSEGV), >> code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 759 >> (android.hardwar), pid 759 (android.hardwar) >> 01-01 01:22:14.120 756 756 F libc: Fatal signal 11 (SIGSEGV), >> code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 756 (drmserver), >> pid 756 (drmserver) >> >> Which go away if I revert the vdso merge that went in via tip/timers. >> >> I tried to bisect things down a bit, but as some later fixes are >> required (at one point, date was returning the start epoch and never >> increasing), this hasn't worked too well. But I'm guessing since I >> see: "CROSS_COMPILE_COMPAT not defined or empty, the compat vDSO will >> not be built", and the system is half working, I'm guessing this is an >> issue with just the 32bit code failing. While I can try to sort out >> the proper CROSS_COMPILE_COMPAT in my build environment, I assume >> userland shouldn't be crashing if that value isn't set. > > The obvious question is whether the VDSO is mapped to the 32bit process in > that case. It shouldn't... > Agreed. I am investing if/why this is happening and will post a fix accordingly. > Thanks, > > tglx > -- Regards, Vincenzo
Re: [PATCH v7 10/25] arm64: compat: Add vDSO
Hi John, On 10/07/2019 05:02, John Stultz wrote: > On Fri, Jun 21, 2019 at 3:18 AM Vincenzo Frascino > wrote: >> >> Provide the arm64 compat (AArch32) vDSO in kernel/vdso32 in a similar >> way to what happens in kernel/vdso. >> >> The compat vDSO leverages on an adaptation of the arm architecture code >> with few changes: >> - Use of lib/vdso for gettimeofday >> - Implementation of syscall based fallback >> - Introduction of clock_getres for the compat library >> - Implementation of trampolines >> - Implementation of elf note >> >> To build the compat vDSO a 32 bit compiler is required and needs to be >> specified via CONFIG_CROSS_COMPILE_COMPAT_VDSO. >> > > Hey Vincenzo! > Congrats on getting this work merged, I know its been a long effort > over a number of years! > > Though unfortunately, it seems the arm64 vdso code that just landed is > breaking AOSP for me. > > I see a lot of the following errors: > 01-01 01:22:14.097 755 755 F libc: Fatal signal 11 (SIGSEGV), > code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 755 (cameraserver), > pid 755 (cameraserver) > 01-01 01:22:14.112 759 759 F libc: Fatal signal 11 (SIGSEGV), > code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 759 > (android.hardwar), pid 759 (android.hardwar) > 01-01 01:22:14.120 756 756 F libc: Fatal signal 11 (SIGSEGV), > code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 756 (drmserver), > pid 756 (drmserver) > > Which go away if I revert the vdso merge that went in via tip/timers. > > I tried to bisect things down a bit, but as some later fixes are > required (at one point, date was returning the start epoch and never > increasing), this hasn't worked too well. But I'm guessing since I > see: "CROSS_COMPILE_COMPAT not defined or empty, the compat vDSO will > not be built", and the system is half working, I'm guessing this is an > issue with just the 32bit code failing. While I can try to sort out > the proper CROSS_COMPILE_COMPAT in my build environment, I assume > userland shouldn't be crashing if that value isn't set. > > Any chance this issue has already been raised? > I do not have Android (bionic/libc) as part of my testing environment hence I never saw this issue. Thanks for reporting it. I am investigating the problem and will post a fix as soon as it is ready. As Will suggested, .config would help the debugging and I would like to ask to you to test my fix once it is ready. Is that OK for you? > thanks > -john > -- Regards, Vincenzo
Re: [PATCH v7 10/25] arm64: compat: Add vDSO
On Wed, Jul 10, 2019 at 10:58:25AM +0200, Thomas Gleixner wrote: > On Wed, 10 Jul 2019, Will Deacon wrote: > > On Tue, Jul 09, 2019 at 09:02:54PM -0700, John Stultz wrote: > > > I tried to bisect things down a bit, but as some later fixes are > > > required (at one point, date was returning the start epoch and never > > > increasing), this hasn't worked too well. But I'm guessing since I > > > see: "CROSS_COMPILE_COMPAT not defined or empty, the compat vDSO will > > > not be built", and the system is half working, I'm guessing this is an > > > issue with just the 32bit code failing. While I can try to sort out > > > the proper CROSS_COMPILE_COMPAT in my build environment, I assume > > > userland shouldn't be crashing if that value isn't set. > > > > > > Any chance this issue has already been raised? > > > > First I've seen of it, although Vincenzo is likely to know better than me. > > In the meantime, please can you share your .config? > > I think the key is: CROSS_COMPILE_COMPAT not defined or empty. And then run > 32bit userspace. The part I was wondering about is whether the vectors page has been disabled at the same time, since I'm fairly sure I've already been running with the above (but I can easily double-check). Will
Re: [PATCH v7 10/25] arm64: compat: Add vDSO
On Wed, 10 Jul 2019, Will Deacon wrote: > On Tue, Jul 09, 2019 at 09:02:54PM -0700, John Stultz wrote: > > I tried to bisect things down a bit, but as some later fixes are > > required (at one point, date was returning the start epoch and never > > increasing), this hasn't worked too well. But I'm guessing since I > > see: "CROSS_COMPILE_COMPAT not defined or empty, the compat vDSO will > > not be built", and the system is half working, I'm guessing this is an > > issue with just the 32bit code failing. While I can try to sort out > > the proper CROSS_COMPILE_COMPAT in my build environment, I assume > > userland shouldn't be crashing if that value isn't set. > > > > Any chance this issue has already been raised? > > First I've seen of it, although Vincenzo is likely to know better than me. > In the meantime, please can you share your .config? I think the key is: CROSS_COMPILE_COMPAT not defined or empty. And then run 32bit userspace. Thanks, tglx
Re: [PATCH v7 10/25] arm64: compat: Add vDSO
Hi John, On Tue, Jul 09, 2019 at 09:02:54PM -0700, John Stultz wrote: > On Fri, Jun 21, 2019 at 3:18 AM Vincenzo Frascino > wrote: > > > > Provide the arm64 compat (AArch32) vDSO in kernel/vdso32 in a similar > > way to what happens in kernel/vdso. > > > > The compat vDSO leverages on an adaptation of the arm architecture code > > with few changes: > > - Use of lib/vdso for gettimeofday > > - Implementation of syscall based fallback > > - Introduction of clock_getres for the compat library > > - Implementation of trampolines > > - Implementation of elf note > > > > To build the compat vDSO a 32 bit compiler is required and needs to be > > specified via CONFIG_CROSS_COMPILE_COMPAT_VDSO. > > > > Hey Vincenzo! > Congrats on getting this work merged, I know its been a long effort > over a number of years! > > Though unfortunately, it seems the arm64 vdso code that just landed is > breaking AOSP for me. > > I see a lot of the following errors: > 01-01 01:22:14.097 755 755 F libc: Fatal signal 11 (SIGSEGV), > code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 755 (cameraserver), > pid 755 (cameraserver) > 01-01 01:22:14.112 759 759 F libc: Fatal signal 11 (SIGSEGV), > code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 759 > (android.hardwar), pid 759 (android.hardwar) > 01-01 01:22:14.120 756 756 F libc: Fatal signal 11 (SIGSEGV), > code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 756 (drmserver), > pid 756 (drmserver) > > Which go away if I revert the vdso merge that went in via tip/timers. > > I tried to bisect things down a bit, but as some later fixes are > required (at one point, date was returning the start epoch and never > increasing), this hasn't worked too well. But I'm guessing since I > see: "CROSS_COMPILE_COMPAT not defined or empty, the compat vDSO will > not be built", and the system is half working, I'm guessing this is an > issue with just the 32bit code failing. While I can try to sort out > the proper CROSS_COMPILE_COMPAT in my build environment, I assume > userland shouldn't be crashing if that value isn't set. > > Any chance this issue has already been raised? First I've seen of it, although Vincenzo is likely to know better than me. In the meantime, please can you share your .config? Thanks, Will
Re: [PATCH v7 10/25] arm64: compat: Add vDSO
On Tue, 9 Jul 2019, John Stultz wrote: > Though unfortunately, it seems the arm64 vdso code that just landed is > breaking AOSP for me. > > I see a lot of the following errors: > 01-01 01:22:14.097 755 755 F libc: Fatal signal 11 (SIGSEGV), > code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 755 (cameraserver), > pid 755 (cameraserver) > 01-01 01:22:14.112 759 759 F libc: Fatal signal 11 (SIGSEGV), > code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 759 > (android.hardwar), pid 759 (android.hardwar) > 01-01 01:22:14.120 756 756 F libc: Fatal signal 11 (SIGSEGV), > code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 756 (drmserver), > pid 756 (drmserver) > > Which go away if I revert the vdso merge that went in via tip/timers. > > I tried to bisect things down a bit, but as some later fixes are > required (at one point, date was returning the start epoch and never > increasing), this hasn't worked too well. But I'm guessing since I > see: "CROSS_COMPILE_COMPAT not defined or empty, the compat vDSO will > not be built", and the system is half working, I'm guessing this is an > issue with just the 32bit code failing. While I can try to sort out > the proper CROSS_COMPILE_COMPAT in my build environment, I assume > userland shouldn't be crashing if that value isn't set. The obvious question is whether the VDSO is mapped to the 32bit process in that case. It shouldn't... Thanks, tglx
Re: [PATCH v7 10/25] arm64: compat: Add vDSO
On Fri, Jun 21, 2019 at 3:18 AM Vincenzo Frascino wrote: > > Provide the arm64 compat (AArch32) vDSO in kernel/vdso32 in a similar > way to what happens in kernel/vdso. > > The compat vDSO leverages on an adaptation of the arm architecture code > with few changes: > - Use of lib/vdso for gettimeofday > - Implementation of syscall based fallback > - Introduction of clock_getres for the compat library > - Implementation of trampolines > - Implementation of elf note > > To build the compat vDSO a 32 bit compiler is required and needs to be > specified via CONFIG_CROSS_COMPILE_COMPAT_VDSO. > Hey Vincenzo! Congrats on getting this work merged, I know its been a long effort over a number of years! Though unfortunately, it seems the arm64 vdso code that just landed is breaking AOSP for me. I see a lot of the following errors: 01-01 01:22:14.097 755 755 F libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 755 (cameraserver), pid 755 (cameraserver) 01-01 01:22:14.112 759 759 F libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 759 (android.hardwar), pid 759 (android.hardwar) 01-01 01:22:14.120 756 756 F libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x3cf2c96c in tid 756 (drmserver), pid 756 (drmserver) Which go away if I revert the vdso merge that went in via tip/timers. I tried to bisect things down a bit, but as some later fixes are required (at one point, date was returning the start epoch and never increasing), this hasn't worked too well. But I'm guessing since I see: "CROSS_COMPILE_COMPAT not defined or empty, the compat vDSO will not be built", and the system is half working, I'm guessing this is an issue with just the 32bit code failing. While I can try to sort out the proper CROSS_COMPILE_COMPAT in my build environment, I assume userland shouldn't be crashing if that value isn't set. Any chance this issue has already been raised? thanks -john
Re: [PATCH v7 10/25] arm64: compat: Add vDSO
On Fri, Jun 21, 2019 at 10:52:37AM +0100, Vincenzo Frascino wrote: > --- /dev/null > +++ b/arch/arm64/include/asm/vdso/compat_barrier.h > @@ -0,0 +1,51 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) 2018 ARM Limited > + */ > +#ifndef __COMPAT_BARRIER_H > +#define __COMPAT_BARRIER_H > + > +#ifndef __ASSEMBLY__ > +/* > + * Warning: This code is meant to be used with > + * ENABLE_COMPAT_VDSO only. > + */ > +#ifndef ENABLE_COMPAT_VDSO > +#error This header is meant to be used with ENABLE_COMPAT_VDSO only > +#endif > + > +#ifdef dmb > +#undef dmb > +#endif > + > +#if __LINUX_ARM_ARCH__ >= 7 > +#define dmb(option) __asm__ __volatile__ ("dmb " #option : : : "memory") > +#elif __LINUX_ARM_ARCH__ == 6 > +#define dmb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" \ > + : : "r" (0) : "memory") > +#else > +#define dmb(x) __asm__ __volatile__ ("" : : : "memory") > +#endif We don't need pre-ARMv7 barriers (they've been deprecated and the arm64 kernel actually traps and emulates them by default). Also your Makefile changes never define a __LINUX_ARM_ARCH__ lower than 7. Fix-up below: --8<--- >From 5655a0313ce7bb731bfed6a19bcfe6b1100b542a Mon Sep 17 00:00:00 2001 From: Catalin Marinas Date: Mon, 24 Jun 2019 12:16:06 +0100 Subject: [PATCH] arm64: compat: No need for pre-ARMv7 barriers on an ARMv8 system This patch removes the deprecated (pre-ARMv7) compat barriers as they would not be used on an ARMv8 system. Fixes: a7f71a2c8903 ("arm64: compat: Add vDSO") Signed-off-by: Catalin Marinas --- arch/arm64/include/asm/vdso/compat_barrier.h | 7 --- 1 file changed, 7 deletions(-) diff --git a/arch/arm64/include/asm/vdso/compat_barrier.h b/arch/arm64/include/asm/vdso/compat_barrier.h index ea24ea856b07..fb60a88b5ed4 100644 --- a/arch/arm64/include/asm/vdso/compat_barrier.h +++ b/arch/arm64/include/asm/vdso/compat_barrier.h @@ -18,14 +18,7 @@ #undef dmb #endif -#if __LINUX_ARM_ARCH__ >= 7 #define dmb(option) __asm__ __volatile__ ("dmb " #option : : : "memory") -#elif __LINUX_ARM_ARCH__ == 6 -#define dmb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" \ - : : "r" (0) : "memory") -#else -#define dmb(x) __asm__ __volatile__ ("" : : : "memory") -#endif #if __LINUX_ARM_ARCH__ >= 8 #define aarch32_smp_mb() dmb(ish)
[PATCH v7 10/25] arm64: compat: Add vDSO
Provide the arm64 compat (AArch32) vDSO in kernel/vdso32 in a similar way to what happens in kernel/vdso. The compat vDSO leverages on an adaptation of the arm architecture code with few changes: - Use of lib/vdso for gettimeofday - Implementation of syscall based fallback - Introduction of clock_getres for the compat library - Implementation of trampolines - Implementation of elf note To build the compat vDSO a 32 bit compiler is required and needs to be specified via CONFIG_CROSS_COMPILE_COMPAT_VDSO. The implementation of the configuration option will be contained in a future patch. Cc: Catalin Marinas Cc: Will Deacon Signed-off-by: Vincenzo Frascino Tested-by: Shijith Thotton Tested-by: Andre Przywara --- arch/arm64/include/asm/vdso/compat_barrier.h | 51 + .../include/asm/vdso/compat_gettimeofday.h| 110 +++ arch/arm64/kernel/vdso32/.gitignore | 2 + arch/arm64/kernel/vdso32/Makefile | 186 ++ arch/arm64/kernel/vdso32/note.c | 15 ++ arch/arm64/kernel/vdso32/sigreturn.S | 62 ++ arch/arm64/kernel/vdso32/vdso.S | 19 ++ arch/arm64/kernel/vdso32/vdso.lds.S | 82 arch/arm64/kernel/vdso32/vgettimeofday.c | 59 ++ 9 files changed, 586 insertions(+) create mode 100644 arch/arm64/include/asm/vdso/compat_barrier.h create mode 100644 arch/arm64/include/asm/vdso/compat_gettimeofday.h create mode 100644 arch/arm64/kernel/vdso32/.gitignore create mode 100644 arch/arm64/kernel/vdso32/Makefile create mode 100644 arch/arm64/kernel/vdso32/note.c create mode 100644 arch/arm64/kernel/vdso32/sigreturn.S create mode 100644 arch/arm64/kernel/vdso32/vdso.S create mode 100644 arch/arm64/kernel/vdso32/vdso.lds.S create mode 100644 arch/arm64/kernel/vdso32/vgettimeofday.c diff --git a/arch/arm64/include/asm/vdso/compat_barrier.h b/arch/arm64/include/asm/vdso/compat_barrier.h new file mode 100644 index ..ea24ea856b07 --- /dev/null +++ b/arch/arm64/include/asm/vdso/compat_barrier.h @@ -0,0 +1,51 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2018 ARM Limited + */ +#ifndef __COMPAT_BARRIER_H +#define __COMPAT_BARRIER_H + +#ifndef __ASSEMBLY__ +/* + * Warning: This code is meant to be used with + * ENABLE_COMPAT_VDSO only. + */ +#ifndef ENABLE_COMPAT_VDSO +#error This header is meant to be used with ENABLE_COMPAT_VDSO only +#endif + +#ifdef dmb +#undef dmb +#endif + +#if __LINUX_ARM_ARCH__ >= 7 +#define dmb(option) __asm__ __volatile__ ("dmb " #option : : : "memory") +#elif __LINUX_ARM_ARCH__ == 6 +#define dmb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" \ + : : "r" (0) : "memory") +#else +#define dmb(x) __asm__ __volatile__ ("" : : : "memory") +#endif + +#if __LINUX_ARM_ARCH__ >= 8 +#define aarch32_smp_mb() dmb(ish) +#define aarch32_smp_rmb() dmb(ishld) +#define aarch32_smp_wmb() dmb(ishst) +#else +#define aarch32_smp_mb() dmb(ish) +#define aarch32_smp_rmb() aarch32_smp_mb() +#define aarch32_smp_wmb() dmb(ishst) +#endif + + +#undef smp_mb +#undef smp_rmb +#undef smp_wmb + +#define smp_mb() aarch32_smp_mb() +#define smp_rmb() aarch32_smp_rmb() +#define smp_wmb() aarch32_smp_wmb() + +#endif /* !__ASSEMBLY__ */ + +#endif /* __COMPAT_BARRIER_H */ diff --git a/arch/arm64/include/asm/vdso/compat_gettimeofday.h b/arch/arm64/include/asm/vdso/compat_gettimeofday.h new file mode 100644 index ..7a39c8340936 --- /dev/null +++ b/arch/arm64/include/asm/vdso/compat_gettimeofday.h @@ -0,0 +1,110 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2018 ARM Limited + */ +#ifndef __ASM_VDSO_GETTIMEOFDAY_H +#define __ASM_VDSO_GETTIMEOFDAY_H + +#ifndef __ASSEMBLY__ + +#include +#include + +#include + +#define VDSO_HAS_CLOCK_GETRES 1 + +static __always_inline int gettimeofday_fallback( + struct __kernel_old_timeval *_tv, + struct timezone *_tz) +{ + register struct timezone *tz asm("r1") = _tz; + register struct __kernel_old_timeval *tv asm("r0") = _tv; + register long ret asm ("r0"); + register long nr asm("r7") = __NR_compat_gettimeofday; + + asm volatile( + " swi #0\n" + : "=r" (ret) + : "r" (tv), "r" (tz), "r" (nr) + : "memory"); + + return ret; +} + +static __always_inline long clock_gettime_fallback( + clockid_t _clkid, + struct __kernel_timespec *_ts) +{ + register struct __kernel_timespec *ts asm("r1") = _ts; + register clockid_t clkid asm("r0") = _clkid; + register long ret asm ("r0"); + register long nr asm("r7") = __NR_compat_clock_gettime64; + + asm volatile( + " swi #0\n" + : "=r" (ret) + : "r" (clkid), "r" (ts), "r" (nr) + : "memory"); + + return ret; +} + +static