mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	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: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
		
							parent
							
								
									e6071b182d
								
							
						
					
					
						commit
						176ed98c8a
					
				| @ -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     */ | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Arnd Bergmann
						Arnd Bergmann