Message ID | 20201126131006.2431205-1-mpe@ellerman.id.au (mailing list archive) |
---|---|
State | Accepted |
Commit | 8d1eeabf253657ae3e76970514f30b7e53a6898f |
Headers | show |
Series | [v14,1/9] powerpc/feature: Use CONFIG_PPC64 instead of __powerpc64__ to define possible features | expand |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/apply_patch | success | Successfully applied on branch powerpc/merge (4c202167192a77481310a3cacae9f12618b92216) |
snowpatch_ozlabs/checkpatch | warning | total: 0 errors, 1 warnings, 0 checks, 16 lines checked |
snowpatch_ozlabs/needsstable | success | Patch has no Fixes tags |
On Fri, 27 Nov 2020 00:09:58 +1100, Michael Ellerman wrote: > In order to build VDSO32 for PPC64, we need to have CPU_FTRS_POSSIBLE > and CPU_FTRS_ALWAYS independant of whether we are building the > 32 bits VDSO or the 64 bits VDSO. > > Use #ifdef CONFIG_PPC64 instead of #ifdef __powerpc64__ Applied to powerpc/next. [1/9] powerpc/feature: Use CONFIG_PPC64 instead of __powerpc64__ to define possible features https://git.kernel.org/powerpc/c/8d1eeabf253657ae3e76970514f30b7e53a6898f [2/9] powerpc/processor: Move cpu_relax() into asm/vdso/processor.h https://git.kernel.org/powerpc/c/8f8cffd9df81612b5b06d2c57ebf74f8961b41be [3/9] powerpc/time: Move timebase functions into new asm/vdso/timebase.h https://git.kernel.org/powerpc/c/d26b3817d9eefae6b777739c1ea5daba5e72624e [4/9] powerpc/time: Fix mftb()/get_tb() for use with the compat VDSO https://git.kernel.org/powerpc/c/5c189c523e78d4a70e874477e4b0628fd74207e4 [5/9] powerpc/barrier: Use CONFIG_PPC64 for barrier selection https://git.kernel.org/powerpc/c/1f1676bb2dd52c1054db8476d6387e6dcf62a1ba [6/9] powerpc/vdso: Prepare for switching VDSO to generic C implementation. https://git.kernel.org/powerpc/c/ce7d8056e38b770f070fc4499c577322b6ccb9c7 [7/9] powerpc/vdso: Save and restore TOC pointer on PPC64 https://git.kernel.org/powerpc/c/7fec9f5d41979dbe273ec337327d5939449562e7 [8/9] powerpc/vdso: Switch VDSO to generic C implementation. https://git.kernel.org/powerpc/c/ab037dd87a2f946556850e204c06cbd7a2a19390 [9/9] powerpc/vdso: Provide __kernel_clock_gettime64() on vdso32 https://git.kernel.org/powerpc/c/d0e3fc69d00d1f50d22d6b6acfc555ccda80ad1e cheers
On Nov 27 2020, Michael Ellerman wrote: > diff --git a/arch/powerpc/include/asm/vdso/gettimeofday.h b/arch/powerpc/include/asm/vdso/gettimeofday.h > new file mode 100644 > index 000000000000..43dd1dc47c37 > --- /dev/null > +++ b/arch/powerpc/include/asm/vdso/gettimeofday.h > @@ -0,0 +1,187 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#ifndef _ASM_POWERPC_VDSO_GETTIMEOFDAY_H > +#define _ASM_POWERPC_VDSO_GETTIMEOFDAY_H > + > +#ifdef __ASSEMBLY__ > + > +#include <asm/ppc_asm.h> > + > +/* > + * The macros sets two stack frames, one for the caller and one for the callee > + * because there are no requirement for the caller to set a stack frame when > + * calling VDSO so it may have omitted to set one, especially on PPC64 > + */ > + > +.macro cvdso_call funct > + .cfi_startproc > + PPC_STLU r1, -PPC_MIN_STKFRM(r1) > + mflr r0 > + .cfi_register lr, r0 > + PPC_STLU r1, -PPC_MIN_STKFRM(r1) > + PPC_STL r0, PPC_MIN_STKFRM + PPC_LR_STKOFF(r1) > + get_datapage r5, r0 > + addi r5, r5, VDSO_DATA_OFFSET > + bl DOTSYM(\funct) > + PPC_LL r0, PPC_MIN_STKFRM + PPC_LR_STKOFF(r1) > + cmpwi r3, 0 > + mtlr r0 > + .cfi_restore lr > + addi r1, r1, 2 * PPC_MIN_STKFRM > + crclr so > + beqlr+ > + crset so > + neg r3, r3 > + blr > + .cfi_endproc > +.endm > + > +.macro cvdso_call_time funct > + .cfi_startproc > + PPC_STLU r1, -PPC_MIN_STKFRM(r1) > + mflr r0 > + .cfi_register lr, r0 > + PPC_STLU r1, -PPC_MIN_STKFRM(r1) > + PPC_STL r0, PPC_MIN_STKFRM + PPC_LR_STKOFF(r1) > + get_datapage r4, r0 > + addi r4, r4, VDSO_DATA_OFFSET > + bl DOTSYM(\funct) > + PPC_LL r0, PPC_MIN_STKFRM + PPC_LR_STKOFF(r1) > + crclr so > + mtlr r0 > + .cfi_restore lr > + addi r1, r1, 2 * PPC_MIN_STKFRM > + blr > + .cfi_endproc > +.endm > + > +#else > + > +#include <asm/vdso/timebase.h> > +#include <asm/barrier.h> > +#include <asm/unistd.h> > +#include <uapi/linux/time.h> > + > +#define VDSO_HAS_CLOCK_GETRES 1 > + > +#define VDSO_HAS_TIME 1 > + > +static __always_inline int do_syscall_2(const unsigned long _r0, const unsigned long _r3, > + const unsigned long _r4) > +{ > + register long r0 asm("r0") = _r0; > + register unsigned long r3 asm("r3") = _r3; > + register unsigned long r4 asm("r4") = _r4; > + register int ret asm ("r3"); > + > + asm volatile( > + " sc\n" > + " bns+ 1f\n" > + " neg %0, %0\n" > + "1:\n" > + : "=r" (ret), "+r" (r4), "+r" (r0) > + : "r" (r3) > + : "memory", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cr0", "ctr"); > + > + return ret; > +} > + > +static __always_inline > +int gettimeofday_fallback(struct __kernel_old_timeval *_tv, struct timezone *_tz) > +{ > + return do_syscall_2(__NR_gettimeofday, (unsigned long)_tv, (unsigned long)_tz); > +} > + > +static __always_inline > +int clock_gettime_fallback(clockid_t _clkid, struct __kernel_timespec *_ts) > +{ > + return do_syscall_2(__NR_clock_gettime, _clkid, (unsigned long)_ts); Doesn't that need to be __NR_clock_gettime64 for ppc32? > +} > + > +static __always_inline > +int clock_getres_fallback(clockid_t _clkid, struct __kernel_timespec *_ts) > +{ > + return do_syscall_2(__NR_clock_getres, _clkid, (unsigned long)_ts); And here __NR_clock_getres_time64? Andreas.
diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h index 5e31960a56a9..e069a2d9f7c1 100644 --- a/arch/powerpc/include/asm/cputable.h +++ b/arch/powerpc/include/asm/cputable.h @@ -488,7 +488,7 @@ static inline void cpu_feature_keys_init(void) { } CPU_FTR_PURR | CPU_FTR_REAL_LE | CPU_FTR_DABRX) #define CPU_FTRS_COMPATIBLE (CPU_FTR_PPCAS_ARCH_V2) -#ifdef __powerpc64__ +#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC_BOOK3E #define CPU_FTRS_POSSIBLE (CPU_FTRS_E6500 | CPU_FTRS_E5500) #else @@ -545,7 +545,7 @@ enum { }; #endif /* __powerpc64__ */ -#ifdef __powerpc64__ +#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC_BOOK3E #define CPU_FTRS_ALWAYS (CPU_FTRS_E6500 & CPU_FTRS_E5500) #else