Commit 176ed98c authored by Arnd Bergmann's avatar Arnd Bergmann
Browse files

y2038: vdso: powerpc: avoid timespec references



As a preparation to stop using 'struct timespec' in the kernel,
change the powerpc vdso implementation:

- split up the vdso data definition to have equivalent members
   for seconds and nanoseconds instead of an xtime structure

- use timespec64 as an intermediate for the xtime update

- change the asm-offsets definition to be based the appropriate
  fixed-length types

This is only a temporary fix for changing the types, in order
to actually support a 64-bit safe vdso32 version of clock_gettime(),
the entire powerpc vdso should be replaced with the generic
lib/vdso/ implementation. If that happens first, this patch
becomes obsolete.

Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent e6071b18
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -81,7 +81,8 @@ struct vdso_data {
	__u32 stamp_sec_fraction;		/* fractional seconds of stamp_xtime */
	__s32 wtom_clock_nsec;			/* Wall to monotonic clock nsec */
	__s64 wtom_clock_sec;			/* Wall to monotonic clock sec */
	struct timespec stamp_xtime;		/* xtime as at tb_orig_stamp */
	__s64 stamp_xtime_sec;			/* xtime secs as at tb_orig_stamp */
	__s64 stamp_xtime_nsec;			/* xtime nsecs as at tb_orig_stamp */
   	__u32 syscall_map_64[SYSCALL_MAP_SIZE]; /* map of syscalls  */
   	__u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of syscalls */
};
@@ -101,7 +102,8 @@ struct vdso_data {
	__u32 tz_dsttime;		/* Type of dst correction	0x5C */
	__s32 wtom_clock_sec;			/* Wall to monotonic clock */
	__s32 wtom_clock_nsec;
	struct timespec stamp_xtime;	/* xtime as at tb_orig_stamp */
	__s32 stamp_xtime_sec;		/* xtime seconds as at tb_orig_stamp */
	__s32 stamp_xtime_nsec;		/* xtime nsecs as at tb_orig_stamp */
	__u32 stamp_sec_fraction;	/* fractional seconds of stamp_xtime */
   	__u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of syscalls */
	__u32 dcache_block_size;	/* L1 d-cache block size     */
+5 −9
Original line number Diff line number Diff line
@@ -385,7 +385,8 @@ int main(void)
	OFFSET(CFG_SYSCALL_MAP32, vdso_data, syscall_map_32);
	OFFSET(WTOM_CLOCK_SEC, vdso_data, wtom_clock_sec);
	OFFSET(WTOM_CLOCK_NSEC, vdso_data, wtom_clock_nsec);
	OFFSET(STAMP_XTIME, vdso_data, stamp_xtime);
	OFFSET(STAMP_XTIME_SEC, vdso_data, stamp_xtime_sec);
	OFFSET(STAMP_XTIME_NSEC, vdso_data, stamp_xtime_nsec);
	OFFSET(STAMP_SEC_FRAC, vdso_data, stamp_sec_fraction);
	OFFSET(CFG_ICACHE_BLOCKSZ, vdso_data, icache_block_size);
	OFFSET(CFG_DCACHE_BLOCKSZ, vdso_data, dcache_block_size);
@@ -395,18 +396,13 @@ int main(void)
	OFFSET(CFG_SYSCALL_MAP64, vdso_data, syscall_map_64);
	OFFSET(TVAL64_TV_SEC, __kernel_old_timeval, tv_sec);
	OFFSET(TVAL64_TV_USEC, __kernel_old_timeval, tv_usec);
#endif
	OFFSET(TSPC64_TV_SEC, __kernel_timespec, tv_sec);
	OFFSET(TSPC64_TV_NSEC, __kernel_timespec, tv_nsec);
	OFFSET(TVAL32_TV_SEC, old_timeval32, tv_sec);
	OFFSET(TVAL32_TV_USEC, old_timeval32, tv_usec);
	OFFSET(TSPC64_TV_SEC, timespec, tv_sec);
	OFFSET(TSPC64_TV_NSEC, timespec, tv_nsec);
	OFFSET(TSPC32_TV_SEC, old_timespec32, tv_sec);
	OFFSET(TSPC32_TV_NSEC, old_timespec32, tv_nsec);
#else
	OFFSET(TVAL32_TV_SEC, __kernel_old_timeval, tv_sec);
	OFFSET(TVAL32_TV_USEC, __kernel_old_timeval, tv_usec);
	OFFSET(TSPC32_TV_SEC, timespec, tv_sec);
	OFFSET(TSPC32_TV_NSEC, timespec, tv_nsec);
#endif
	/* timeval/timezone offsets for use by vdso */
	OFFSET(TZONE_TZ_MINWEST, timezone, tz_minuteswest);
	OFFSET(TZONE_TZ_DSTTIME, timezone, tz_dsttime);
+3 −2
Original line number Diff line number Diff line
@@ -885,7 +885,7 @@ static notrace u64 timebase_read(struct clocksource *cs)

void update_vsyscall(struct timekeeper *tk)
{
	struct timespec xt;
	struct timespec64 xt;
	struct clocksource *clock = tk->tkr_mono.clock;
	u32 mult = tk->tkr_mono.mult;
	u32 shift = tk->tkr_mono.shift;
@@ -957,7 +957,8 @@ void update_vsyscall(struct timekeeper *tk)
	vdso_data->tb_to_xs = new_tb_to_xs;
	vdso_data->wtom_clock_sec = tk->wall_to_monotonic.tv_sec;
	vdso_data->wtom_clock_nsec = tk->wall_to_monotonic.tv_nsec;
	vdso_data->stamp_xtime = xt;
	vdso_data->stamp_xtime_sec = xt.tv_sec;
	vdso_data->stamp_xtime_nsec = xt.tv_nsec;
	vdso_data->stamp_sec_fraction = frac_sec;
	smp_wmb();
	++(vdso_data->tb_update_count);
+2 −4
Original line number Diff line number Diff line
@@ -15,10 +15,8 @@
/* Offset for the low 32-bit part of a field of long type */
#ifdef CONFIG_PPC64
#define LOPART	4
#define TSPEC_TV_SEC	TSPC64_TV_SEC+LOPART
#else
#define LOPART	0
#define TSPEC_TV_SEC	TSPC32_TV_SEC
#endif

	.text
@@ -192,7 +190,7 @@ V_FUNCTION_BEGIN(__kernel_time)
	bl	__get_datapage@local
	mr	r9, r3			/* datapage ptr in r9 */

	lwz	r3,STAMP_XTIME+TSPEC_TV_SEC(r9)
	lwz	r3,STAMP_XTIME_SEC+LOWPART(r9)

	cmplwi	r11,0			/* check if t is NULL */
	beq	2f
@@ -268,7 +266,7 @@ __do_get_tspec:
	 * as a 32.32 fixed-point number in r3 and r4.
	 * Load & add the xtime stamp.
	 */
	lwz	r5,STAMP_XTIME+TSPEC_TV_SEC(r9)
	lwz	r5,STAMP_XTIME_SEC+LOWPART(r9)
	lwz	r6,STAMP_SEC_FRAC(r9)
	addc	r4,r4,r6
	adde	r3,r3,r5
+4 −4
Original line number Diff line number Diff line
@@ -116,8 +116,8 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
	 * CLOCK_REALTIME_COARSE, below values are needed for MONOTONIC_COARSE
	 * too
	 */
	ld      r4,STAMP_XTIME+TSPC64_TV_SEC(r3)
	ld      r5,STAMP_XTIME+TSPC64_TV_NSEC(r3)
	ld      r4,STAMP_XTIME_SEC(r3)
	ld      r5,STAMP_XTIME_NSEC(r3)
	bne     cr6,75f

	/* CLOCK_MONOTONIC_COARSE */
@@ -220,7 +220,7 @@ V_FUNCTION_BEGIN(__kernel_time)
	mr	r11,r3			/* r11 holds t */
	bl	V_LOCAL_FUNC(__get_datapage)

	ld	r4,STAMP_XTIME+TSPC64_TV_SEC(r3)
	ld	r4,STAMP_XTIME_SEC(r3)

	cmpldi	r11,0			/* check if t is NULL */
	beq	2f
@@ -265,7 +265,7 @@ V_FUNCTION_BEGIN(__do_get_tspec)
	mulhdu	r6,r6,r5		/* in units of 2^-32 seconds */

	/* Add stamp since epoch */
	ld	r4,STAMP_XTIME+TSPC64_TV_SEC(r3)
	ld	r4,STAMP_XTIME_SEC(r3)
	lwz	r5,STAMP_SEC_FRAC(r3)
	or	r0,r4,r5
	or	r0,r0,r6