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. -- Andreas Schwab, sch...@linux-m68k.org GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510 2552 DF73 E780 A9DA AEC1 "And now for something completely different."