]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
y2038: vdso: powerpc: avoid timespec references
authorArnd Bergmann <arnd@arndb.de>
Sun, 27 Oct 2019 16:26:55 +0000 (17:26 +0100)
committerArnd Bergmann <arnd@arndb.de>
Fri, 15 Nov 2019 13:38:28 +0000 (14:38 +0100)
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>
arch/powerpc/include/asm/vdso_datapage.h
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kernel/time.c
arch/powerpc/kernel/vdso32/gettimeofday.S
arch/powerpc/kernel/vdso64/gettimeofday.S

index c61d59ed3b45ff70ae2efae89852daa70394e1db..a115970a68090146329f2d4cde8e15c77f5bfe46 100644 (file)
@@ -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     */
index 827f4c354e13ef36cf0f403f8dd3da5ea44ca0e3..f22bd6d1fe9331331715c37b11f0d302a4fae266 100644 (file)
@@ -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);
index 694522308cd51d616740e3ea05a1f0c95a834f16..f1db1bf2dd91dfcf8a0f11c26baf28283ba95f25 100644 (file)
@@ -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);
index becd9f8767ede449df1434620b19e99805bb34bb..a7180b0f4aa10e82594bb6e307742d4ca1cb439e 100644 (file)
 /* 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
index 07bfe33fe8745f48e9d2d3916dedc7d28a43d5d1..1f24e411af80102df223ae0add899ce5a68893d8 100644 (file)
@@ -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