posix_clocks: Prepare syscalls for 64 bit time_t conversion
Subsystems (23)
cover posix_clocks: Prepare syscalls for 64 bit time_t conversion
The series is a preparation series for individual architectures to use 64 bit time_t syscalls in compat and 32 bit emulation modes.
This is a follow up to the series Arnd Bergmann posted:
https://sourceware.org/ml/libc-alpha/2015-05/msg00070.html
Big picture is as per the lwn article:
https://lwn.net/Articles/643234/
The series is directed at converting posix clock syscalls:clock_gettime, clock_settime, clock_getres and clock_nanosleep to use a new data structure __kernel_timespec at syscall boundaries. __kernel_timespec maintains 64 bit time_t across all execution modes.
vdso will be handled as part of each architecture when they enable support for 64 bit time_t.
The compat syscalls are repurposed to provide backward compatibility by using them as native syscalls as well for 32 bit architectures. They will continue to use timespec at syscall boundaries.
CONFIG_64_BIT_TIME controls whether the syscalls use __kernel_timespec or timespec at syscall boundaries.
The series does the following:
1. Enable compat syscalls unconditionally.
2. Add a new __kernel_timespec type to be used as the data structure for all the new syscalls.
3. Add new config CONFIG_64BIT_TIME(intead of the CONFIG_COMPAT_TIME in
[1] and [2] to switch to new definition of __kernel_timespec. It is the same as struct timespec otherwise.
Arnd Bergmann (1):
y2038: introduce CONFIG_64BIT_TIME
Deepa Dinamani (8):
include: Move compat_timespec/ timeval to compat_time.h
compat: Make compat helpers independent of CONFIG_COMPAT
compat: enable compat_get/put_timespec64 always
posix-clocks: Enable compat syscalls always
include: Add new y2038 safe __kernel_timespec fix get_timespec64() for y2038 safe compat interfaces change time types to new y2038 safe __kernel_* types
nanosleep: change time types to safe __kernel_* types
arch/Kconfig | 11 ++++ arch/arm64/include/asm/compat.h | 11 ---- arch/arm64/include/asm/stat.h | 1 + arch/arm64/kernel/hw_breakpoint.c | 1 - arch/arm64/kernel/perf_regs.c | 2 +- arch/arm64/kernel/process.c | 1 - arch/mips/include/asm/compat.h | 11 ---- arch/mips/kernel/signal32.c | 2 +- arch/parisc/include/asm/compat.h | 11 ---- arch/powerpc/include/asm/compat.h | 11 ---- arch/powerpc/kernel/asm-offsets.c | 2 +- arch/powerpc/oprofile/backtrace.c | 2 +- arch/s390/hypfs/hypfs_sprp.c | 1 - arch/s390/include/asm/compat.h | 11 ---- arch/s390/include/asm/elf.h | 3 +- arch/s390/kvm/priv.c | 1 - arch/s390/pci/pci_clp.c | 1 - arch/sparc/include/asm/compat.h | 11 ---- arch/tile/include/asm/compat.h | 11 ---- arch/x86/events/core.c | 2 +- arch/x86/include/asm/compat.h | 11 ---- arch/x86/include/asm/ftrace.h | 2 +- arch/x86/include/asm/sys_ia32.h | 2 +- arch/x86/kernel/sys_x86_64.c | 2 +- drivers/s390/block/dasd_ioctl.c | 1 - drivers/s390/char/fs3270.c | 1 - drivers/s390/char/sclp_ctl.c | 1 - drivers/s390/char/vmcp.c | 1 - drivers/s390/cio/chsc_sch.c | 1 - drivers/s390/net/qeth_core_main.c | 2 +- drivers/staging/pi433/pi433_if.c | 2 +- include/linux/compat.h | 7 ++- include/linux/compat_time.h | 23 +++++++++ include/linux/restart_block.h | 7 +-- include/linux/syscalls.h | 12 ++--- include/linux/time.h | 4 +- include/linux/time64.h | 10 +++- include/uapi/asm-generic/posix_types.h | 1 + include/uapi/linux/time.h | 7 +++ kernel/Makefile | 2 +- kernel/compat.c | 92 ++++++++++++++++++---------------- kernel/time/hrtimer.c | 7 +-- kernel/time/posix-stubs.c | 12 ++--- kernel/time/posix-timers.c | 20 ++++---- kernel/time/time.c | 10 +++- 45 files changed, 152 insertions(+), 195 deletions(-) create mode 100644 include/linux/compat_time.h
base-commit: d9e0e63d9a6f88440eb201e1491fcf730272c706
Signature · 42 lines
2.11.0 Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected] Cc: [email protected]
PATCH 1/9 include: Move compat_timespec/ timeval to compat_time.h
All the current architecture specific defines for these are the same. Refactor these common defines to a common header file.
The new common linux/compat_time.h is also useful as it will eventually be used to hold all the defines that are needed for compat time types that support non y2038 safe types. New architectures need not have to define these new types as they will only use new y2038 safe syscalls. This file can be deleted after y2038 when we stop supporting non y2038 safe syscalls.
The patch also requires an operation similar to:
git grep "asm/compat\.h" | cut -d ":" -f 1 | xargs -n 1 sed -i -e "s%asm/compat.h%linux/compat.h%g"
--- arch/arm64/include/asm/compat.h | 11 ----------- arch/arm64/include/asm/stat.h | 1 + arch/arm64/kernel/hw_breakpoint.c | 1 - arch/arm64/kernel/perf_regs.c | 2 +- arch/arm64/kernel/process.c | 1 - arch/mips/include/asm/compat.h | 11 ----------- arch/mips/kernel/signal32.c | 2 +- arch/parisc/include/asm/compat.h | 11 ----------- arch/powerpc/include/asm/compat.h | 11 ----------- arch/powerpc/kernel/asm-offsets.c | 2 +- arch/powerpc/oprofile/backtrace.c | 2 +- arch/s390/hypfs/hypfs_sprp.c | 1 - arch/s390/include/asm/compat.h | 11 ----------- arch/s390/include/asm/elf.h | 3 +-- arch/s390/kvm/priv.c | 1 - arch/s390/pci/pci_clp.c | 1 - arch/sparc/include/asm/compat.h | 11 ----------- arch/tile/include/asm/compat.h | 11 ----------- arch/x86/events/core.c | 2 +- arch/x86/include/asm/compat.h | 11 ----------- arch/x86/include/asm/ftrace.h | 2 +- arch/x86/include/asm/sys_ia32.h | 2 +- arch/x86/kernel/sys_x86_64.c | 2 +- drivers/s390/block/dasd_ioctl.c | 1 - drivers/s390/char/fs3270.c | 1 - drivers/s390/char/sclp_ctl.c | 1 - drivers/s390/char/vmcp.c | 1 - drivers/s390/cio/chsc_sch.c | 1 - drivers/s390/net/qeth_core_main.c | 2 +- drivers/staging/pi433/pi433_if.c | 2 +- include/linux/compat.h | 1 + include/linux/compat_time.h | 19 +++++++++++++++++++ 32 files changed, 32 insertions(+), 110 deletions(-) create mode 100644 include/linux/compat_time.h
arch/arm64/include/asm/compat.h +0 -11
@@ -34,7 +34,6 @@typedef u32 compat_size_t ;typedef s32 compat_ssize_t ; -typedef s32 compat_time_t ;typedef s32 compat_clock_t ;typedef s32 compat_pid_t ;typedef u16 __compat_uid_t ;
@@ -66,16 +65,6 @@ typedef u32 compat_ulong_t;typedef u64 compat_u64 ;typedef u32 compat_uptr_t ; -struct compat_timespec { -compat_time_t tv_sec; -s32 tv_nsec; -}; - -struct compat_timeval { -compat_time_t tv_sec; -s32 tv_usec; -}; -struct compat_stat {#ifdef __AARCH64EB__short st_dev;
arch/arm64/include/asm/stat.h +1 -0
@@ -20,6 +20,7 @@#ifdef CONFIG_COMPAT +#include <linux/compat_time.h> #include <asm/compat.h> /*
arch/arm64/kernel/hw_breakpoint.c +0 -1
@@ -29,7 +29,6 @@#include <linux/ptrace.h> #include <linux/smp.h> -#include <asm/compat.h> #include <asm/current.h> #include <asm/debug-monitors.h> #include <asm/hw_breakpoint.h>
arch/arm64/kernel/perf_regs.c +1 -1
@@ -5,7 +5,7 @@#include <linux/bug.h> #include <linux/sched/task_stack.h> -#include <asm/compat.h> +#include <linux/compat.h> #include <asm/perf_regs.h> #include <asm/ptrace.h>
arch/arm64/kernel/process.c +0 -1
@@ -52,7 +52,6 @@#include <linux/thread_info.h> #include <asm/alternative.h> -#include <asm/compat.h> #include <asm/cacheflush.h> #include <asm/exec.h> #include <asm/fpsimd.h>
arch/mips/include/asm/compat.h +0 -11
@@ -14,7 +14,6 @@typedef u32 compat_size_t ;typedef s32 compat_ssize_t ; -typedef s32 compat_time_t ;typedef s32 compat_clock_t ;typedef s32 compat_suseconds_t ;
@@ -46,16 +45,6 @@ typedef u32 compat_ulong_t;typedef u64 compat_u64 ;typedef u32 compat_uptr_t ; -struct compat_timespec { -compat_time_t tv_sec; -s32 tv_nsec; -}; - -struct compat_timeval { -compat_time_t tv_sec; -s32 tv_usec; -}; -struct compat_stat {compat_dev_t st_dev;s32 st_pad1[3 ];
arch/mips/kernel/signal32.c +1 -1
@@ -14,7 +14,7 @@#include <linux/signal.h> #include <linux/syscalls.h> -#include <asm/compat.h> +#include <linux/compat.h> #include <asm/compat-signal.h> #include <linux/uaccess.h> #include <asm/unistd.h>
arch/parisc/include/asm/compat.h +0 -11
@@ -13,7 +13,6 @@typedef u32 compat_size_t ;typedef s32 compat_ssize_t ; -typedef s32 compat_time_t ;typedef s32 compat_clock_t ;typedef s32 compat_pid_t ;typedef u32 __compat_uid_t ;
@@ -40,16 +39,6 @@ typedef u32 compat_ulong_t;typedef u64 compat_u64 ;typedef u32 compat_uptr_t ; -struct compat_timespec { -compat_time_t tv_sec; -s32 tv_nsec; -}; - -struct compat_timeval { -compat_time_t tv_sec; -s32 tv_usec; -}; -struct compat_stat {compat_dev_t st_dev;/* dev_t is 32 bits on parisc */ compat_ino_t st_ino;/* 32 bits */
arch/powerpc/include/asm/compat.h +0 -11
@@ -17,7 +17,6 @@typedef u32 compat_size_t ;typedef s32 compat_ssize_t ; -typedef s32 compat_time_t ;typedef s32 compat_clock_t ;typedef s32 compat_pid_t ;typedef u32 __compat_uid_t ;
@@ -45,16 +44,6 @@ typedef u32 compat_ulong_t;typedef u64 compat_u64 ;typedef u32 compat_uptr_t ; -struct compat_timespec { -compat_time_t tv_sec; -s32 tv_nsec; -}; - -struct compat_timeval { -compat_time_t tv_sec; -s32 tv_usec; -}; -struct compat_stat {compat_dev_t st_dev;compat_ino_t st_ino;
arch/powerpc/kernel/asm-offsets.c +1 -1
@@ -42,7 +42,7 @@#include <asm/paca.h> #include <asm/lppaca.h> #include <asm/cache.h> -#include <asm/compat.h> +#include <linux/compat.h> #include <asm/mmu.h> #include <asm/hvcall.h> #include <asm/xics.h>
arch/powerpc/oprofile/backtrace.c +1 -1
@@ -11,7 +11,7 @@#include <linux/sched.h> #include <asm/processor.h> #include <linux/uaccess.h> -#include <asm/compat.h> +#include <linux/compat.h> #include <asm/oprofile_impl.h> #define STACK_SP (STACK ) *(STACK)
arch/s390/hypfs/hypfs_sprp.c +0 -1
@@ -13,7 +13,6 @@#include <linux/string.h> #include <linux/types.h> #include <linux/uaccess.h> -#include <asm/compat.h> #include <asm/diag.h> #include <asm/sclp.h> #include "hypfs.h"
arch/s390/include/asm/compat.h +0 -11
@@ -53,7 +53,6 @@typedef u32 compat_size_t ;typedef s32 compat_ssize_t ; -typedef s32 compat_time_t ;typedef s32 compat_clock_t ;typedef s32 compat_pid_t ;typedef u16 __compat_uid_t ;
@@ -97,16 +96,6 @@ typedef struct {u32 gprs_high[NUM_GPRS ]; } s390_compat_regs_high; -struct compat_timespec { -compat_time_t tv_sec; -s32 tv_nsec; -}; - -struct compat_timeval { -compat_time_t tv_sec; -s32 tv_usec; -}; -struct compat_stat {compat_dev_t st_dev;u16 __pad1;
arch/s390/include/asm/elf.h +1 -2
@@ -126,7 +126,7 @@*/ #include <asm/ptrace.h> -#include <asm/compat.h> +#include <linux/compat.h> #include <asm/syscall.h> #include <asm/user.h>
@@ -136,7 +136,6 @@ typedef s390_regs elf_gregset_t;typedef s390_fp_regs compat_elf_fpregset_t ;typedef s390_compat_regs compat_elf_gregset_t ; -#include <linux/compat.h> #include <linux/sched/mm.h> /* for task_struct */ #include <asm/mmu_context.h>
arch/s390/kvm/priv.c +0 -1
@@ -29,7 +29,6 @@#include <asm/gmap.h> #include <asm/io.h> #include <asm/ptrace.h> -#include <asm/compat.h> #include <asm/sclp.h> #include "gaccess.h" #include "kvm-s390.h"
arch/s390/pci/pci_clp.c +0 -1
@@ -19,7 +19,6 @@#include <linux/uaccess.h> #include <asm/pci_debug.h> #include <asm/pci_clp.h> -#include <asm/compat.h> #include <asm/clp.h> #include <uapi/asm/clp.h>
arch/sparc/include/asm/compat.h +0 -11
@@ -11,7 +11,6 @@typedef u32 compat_size_t ;typedef s32 compat_ssize_t ; -typedef s32 compat_time_t ;typedef s32 compat_clock_t ;typedef s32 compat_pid_t ;typedef u16 __compat_uid_t ;
@@ -39,16 +38,6 @@ typedef u32 compat_ulong_t;typedef u64 compat_u64 ;typedef u32 compat_uptr_t ; -struct compat_timespec { -compat_time_t tv_sec; -s32 tv_nsec; -}; - -struct compat_timeval { -compat_time_t tv_sec; -s32 tv_usec; -}; -struct compat_stat {compat_dev_t st_dev;compat_ino_t st_ino;
arch/tile/include/asm/compat.h +0 -11
@@ -29,7 +29,6 @@ typedef u32 compat_ulong_t;typedef u32 compat_size_t ;typedef s32 compat_ssize_t ;typedef s32 compat_off_t ; -typedef s32 compat_time_t ;typedef s32 compat_clock_t ;typedef u32 compat_ino_t ;typedef u32 compat_caddr_t ;
@@ -59,16 +58,6 @@ typedef unsigned long compat_elf_greg_t;#define COMPAT_ELF_NGREG (sizeof(struct pt_regs) / sizeof(compat_elf_greg_t))typedef compat_elf_greg_t compat_elf_gregset_t [COMPAT_ELF_NGREG ]; -struct compat_timespec { -compat_time_t tv_sec; -s32 tv_nsec; -}; - -struct compat_timeval { -compat_time_t tv_sec; -s32 tv_usec; -}; -#define compat_stat stat#define compat_statfs statfs
arch/x86/events/core.c +1 -1
@@ -2391,7 +2391,7 @@ static unsigned long get_segment_base(unsigned int segment)#ifdef CONFIG_IA32_EMULATION -#include <asm/compat.h> +#include <linux/compat.h> static inline int perf_callchain_user32 (struct pt_regs *regs,struct perf_callchain_entry_ctx *entry)
arch/x86/include/asm/compat.h +0 -11
@@ -17,7 +17,6 @@typedef u32 compat_size_t ;typedef s32 compat_ssize_t ; -typedef s32 compat_time_t ;typedef s32 compat_clock_t ;typedef s32 compat_pid_t ;typedef u16 __compat_uid_t ;
@@ -46,16 +45,6 @@ typedef u32 compat_u32; typedef u64 __attribute__((aligned(4))) compat_u64;typedef u32 compat_uptr_t ; -struct compat_timespec { -compat_time_t tv_sec; -s32 tv_nsec; -}; - -struct compat_timeval { -compat_time_t tv_sec; -s32 tv_usec; -}; -struct compat_stat {compat_dev_t st_dev;u16 __pad1;
arch/x86/include/asm/ftrace.h +1 -1
@@ -49,7 +49,7 @@ int ftrace_int3_handler(struct pt_regs *regs);#if !defined(__ASSEMBLY__) && !defined(COMPILE_OFFSETS )#if defined(CONFIG_FTRACE_SYSCALLS ) && defined(CONFIG_IA32_EMULATION ) -#include <asm/compat.h> +#include <linux/compat.h> /* * Because ia32 syscalls do not map to x86_64 syscall numbers
arch/x86/include/asm/sys_ia32.h +1 -1
@@ -16,7 +16,7 @@#include <linux/linkage.h> #include <linux/types.h> #include <linux/signal.h> -#include <asm/compat.h> +#include <linux/compat.h> #include <asm/ia32.h> /* ia32/sys_ia32.c */
arch/x86/kernel/sys_x86_64.c +1 -1
@@ -19,7 +19,7 @@#include <linux/elf.h> #include <asm/elf.h> -#include <asm/compat.h> +#include <linux/compat.h> #include <asm/ia32.h> #include <asm/syscalls.h> #include <asm/mpx.h>
drivers/s390/block/dasd_ioctl.c +0 -1
@@ -18,7 +18,6 @@#include <linux/fs.h> #include <linux/blkpg.h> #include <linux/slab.h> -#include <asm/compat.h> #include <asm/ccwdev.h> #include <asm/schid.h> #include <asm/cmb.h>
drivers/s390/char/fs3270.c +0 -1
@@ -18,7 +18,6 @@#include <linux/slab.h> #include <linux/types.h> -#include <asm/compat.h> #include <asm/ccwdev.h> #include <asm/cio.h> #include <asm/ebcdic.h>
drivers/s390/char/sclp_ctl.c +0 -1
@@ -14,7 +14,6 @@#include <linux/init.h> #include <linux/ioctl.h> #include <linux/fs.h> -#include <asm/compat.h> #include <asm/sclp_ctl.h> #include <asm/sclp.h>
drivers/s390/char/vmcp.c +0 -1
@@ -23,7 +23,6 @@#include <linux/mutex.h> #include <linux/cma.h> #include <linux/mm.h> -#include <asm/compat.h> #include <asm/cpcmd.h> #include <asm/debug.h> #include <asm/vmcp.h>
drivers/s390/cio/chsc_sch.c +0 -1
@@ -15,7 +15,6 @@#include <linux/miscdevice.h> #include <linux/kernel_stat.h> -#include <asm/compat.h> #include <asm/cio.h> #include <asm/chsc.h> #include <asm/isc.h>
drivers/s390/net/qeth_core_main.c +1 -1
@@ -26,7 +26,7 @@#include <asm/chpid.h> #include <asm/io.h> #include <asm/sysinfo.h> -#include <asm/compat.h> +#include <linux/compat.h> #include <asm/diag.h> #include <asm/cio.h> #include <asm/ccwdev.h>
drivers/staging/pi433/pi433_if.c +1 -1
@@ -48,7 +48,7 @@#include <linux/wait.h> #include <linux/spi/spi.h> #ifdef CONFIG_COMPAT -#include <asm/compat.h> +#include <linux/compat.h> #endif #include "pi433_if.h"
include/linux/compat.h +1 -0
@@ -7,6 +7,7 @@*/ #include <linux/types.h> +#include <linux/compat_time.h> #ifdef CONFIG_COMPAT
include/linux/compat_time.h new file +19 -0
@@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_COMPAT_TIME_H +#define _LINUX_COMPAT_TIME_H + +#include <linux/types.h> + +typedef s32 compat_time_t ; + +struct compat_timespec { +compat_time_t tv_sec; +s32 tv_nsec; +}; + +struct compat_timeval { +compat_time_t tv_sec; +s32 tv_usec; +}; + +#endif /* _LINUX_COMPAT_TIME_H */
Signature · 1 line
2.11.0
Re: [PATCH 1/9] include: Move compat_timespec/ timeval to compat_time.h
arch/x86/include/asm/ftrace.h int ftrace_int3_handler(struct pt_regs *regs); · line 53
Quoted 11 lines · On Fri, 10 Nov 2017 14:42:51 -0800 Deepa Dinamani <[email protected]>…
arch/x86/include/asm/ftrace.h +1
-1@@ -49,7 +49,7 @@ int ftrace_int3_handler(struct pt_regs *regs);#if !defined(__ASSEMBLY__) && !defined(COMPILE_OFFSETS )#if defined(CONFIG_FTRACE_SYSCALLS ) && defined(CONFIG_IA32_EMULATION ) -#include <asm/compat.h> +#include <linux/compat.h>
-- Steve
PATCH 2/9 compat: Make compat helpers independent of CONFIG_COMPAT
In reply to Deepa DinamaniMany of the compat time syscalls are also repurposed as 32 bit native syscalls to provide backward compatibility while adding new y2038 safe sycalls.
Enabling the helpers makes this possible.
--- include/linux/compat.h | 4 ++++ 1 file changed, 4 insertions(+)
include/linux/compat.h +4 -0
@@ -24,6 +24,8 @@#include <asm/siginfo.h> #include <asm/signal.h> +#endif +#ifndef COMPAT_USE_64BIT_TIME #define COMPAT_USE_64BIT_TIME 0#endif
@@ -59,6 +61,8 @@ } \ static inline long C_SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__)) +#ifdef CONFIG_COMPAT +#ifndef compat_user_stack_pointer#define compat_user_stack_pointer () current_user_stack_pointer()#endif
Signature · 1 line
2.11.0
Arnd Bergmann
maintainerRe: [PATCH 2/9] compat: Make compat helpers independent of CONFIG_COMPAT
Quoted 6 lines · Deepa Dinamani
Many of the compat time syscalls are also repurposed as 32 bit native syscalls to provide backward compatibility while adding new y2038 safe sycalls.
Enabling the helpers makes this possible.Signed-off-by Deepa Dinamani <[email protected]>
I ran into a build error on ARM64 with CONFIG_COMPAT=n with this patch, here is a fixup that makes it build cleanly and should also work on other architectures. Unfortunately, including asm/compat.h has a number of dependencies on other headers, so I decided to just include them all for the fixup.
Alternatively, we could change the architecture code to always include asm/compat.h when using is_compat_thread(), or to replace is_compat_thread() calls with in_compat_syscall(), but the approach below should be more likely to work on the 64-bit architectures that I did not try.
Arnd
include/linux/compat.h +2 -4
@@ -9,8 +9,6 @@#include <linux/types.h> #include <linux/compat_time.h> -#ifdef CONFIG_COMPAT -#include <linux/stat.h> #include <linux/param.h> /* for HZ */ #include <linux/sem.h>
@@ -20,12 +18,12 @@#include <linux/aio_abi.h> /* for aio_context_t */ #include <linux/unistd.h> +#ifdef CONFIG_64BIT #include <asm/compat.h> +#endif #include <asm/siginfo.h> #include <asm/signal.h> -#endif -#ifndef COMPAT_USE_64BIT_TIME #define COMPAT_USE_64BIT_TIME 0#endif
@@ -774,7 +772,9 @@ static inline struct compat_timeval
ns_to_compat_timeval(s64 nsec)
#else /* !CONFIG_COMPAT */
#define is_compat_task() (0)
+#ifndef in_compat_syscall
static inline bool in_compat_syscall(void) { return false; }
+#endif
#endif /* CONFIG_COMPAT */
Re: [PATCH 2/9] compat: Make compat helpers independent of CONFIG_COMPAT
Thanks, I will include the patch in the update.
PATCH 3/9 compat: enable compat_get/put_timespec64 always
In reply to Deepa DinamaniThese functions are used in the repurposed compat syscalls to provide backward compatibility for using 32 bit time_t on 32 bit systems.
--- include/linux/compat.h | 2 - include/linux/compat_time.h | 4 ++ kernel/Makefile | 2 +- kernel/compat.c | 92 +++++++++++++++++++++++---------------------- 4 files changed, 53 insertions(+), 47 deletions(-)
include/linux/compat.h +0 -2
@@ -170,8 +170,6 @@ extern int compat_get_timespec(struct timespec *, const void __user *);extern int compat_put_timespec (const struct timespec *,void __user *);extern int compat_get_timeval (struct timeval *,const void __user *);extern int compat_put_timeval (const struct timeval *,void __user *); -extern int compat_get_timespec64 (struct timespec64 *,const void __user *); -extern int compat_put_timespec64 (const struct timespec64 *,void __user *);extern int get_compat_itimerspec64 (struct itimerspec64 *its,const struct compat_itimerspec __user *uits); extern int put_compat_itimerspec64(const struct itimerspec64 *its,
include/linux/compat_time.h +4 -0
@@ -3,6 +3,7 @@#define _LINUX_COMPAT_TIME_H#include <linux/types.h> +#include <linux/time64.h> typedef s32 compat_time_t ;
@@ -16,4 +17,7 @@ struct compat_timeval { s32 tv_usec; }; +extern int compat_get_timespec64 (struct timespec64 *,const void __user *); +extern int compat_put_timespec64 (const struct timespec64 *,void __user *); +#endif /* _LINUX_COMPAT_TIME_H */
kernel/Makefile +1 -1
@@ -66,7 +66,7 @@ obj-$(CONFIG_KEXEC_CORE) += kexec_core.o obj-$(CONFIG_KEXEC) += kexec.o obj-$(CONFIG_KEXEC_FILE) += kexec_file.o obj-$(CONFIG_BACKTRACE_SELF_TEST) += backtracetest.o -obj-$(CONFIG_COMPAT) += compat.o +obj-y += compat.o obj-$(CONFIG_CGROUPS) += cgroup/ obj-$(CONFIG_UTS_NS) += utsname.o obj-$(CONFIG_USER_NS) += user_namespace.o
kernel/compat.c +48 -44
107 lines not on this page · raw message
Signature · 1 line
2.11.0
PATCH 4/9 posix-clocks: Enable compat syscalls always
In reply to Deepa Dinamaniclock_gettime, clock_settime, clock_getres and clock_nanosleep compat syscalls are also repurposed to provide backward compatibility to support 32 bit time_t on 32 bit systems.
Note that nanosleep compat syscall will also be treated the same way as the above syscalls as it shares common handler funtions with clock_nanosleep. But, there is no plan to provide y2038 safe solution for nanosleep.
--- kernel/time/hrtimer.c | 3 --- kernel/time/posix-stubs.c | 2 +- kernel/time/posix-timers.c | 10 ++++------ 3 files changed, 5 insertions(+), 10 deletions(-)
kernel/time/hrtimer.c +0 -3
@@ -1557,8 +1557,6 @@ SYSCALL_DEFINE2(nanosleep, struct timespec __user *, rqtp,return hrtimer_nanosleep (&tu,HRTIMER_MODE_REL ,CLOCK_MONOTONIC ); } -#ifdef CONFIG_COMPAT - COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, struct compat_timespec __user *, rmtp) {
@@ -1574,7 +1572,6 @@ COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, current->restart_block.nanosleep.compat_rmtp = rmtp;return hrtimer_nanosleep (&tu,HRTIMER_MODE_REL ,CLOCK_MONOTONIC ); } -#endif /* * Functions related to boot-time initialization:
kernel/time/posix-stubs.c +1 -1
@@ -148,6 +148,7 @@ COMPAT_SYS_NI(timer_settime);COMPAT_SYS_NI (timer_gettime);COMPAT_SYS_NI (getitimer);COMPAT_SYS_NI (setitimer); +#endif COMPAT_SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock, struct compat_timespec __user *, tp)
@@ -224,4 +225,3 @@ COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags, HRTIMER_MODE_ABS :HRTIMER_MODE_REL , which_clock); } -#endif
kernel/time/posix-timers.c +4 -6
@@ -1107,8 +1107,6 @@ SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock,return error; } -#ifdef CONFIG_COMPAT -COMPAT_SYSCALL_DEFINE2 (clock_settime, clockid_t, which_clock, struct compat_timespec __user *, tp) {
@@ -1142,6 +1140,8 @@ COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,return err; } +#ifdef CONFIG_COMPAT +COMPAT_SYSCALL_DEFINE2 (clock_adjtime, clockid_t, which_clock, struct compat_timex __user *, utp) {
@@ -1166,6 +1166,8 @@ COMPAT_SYSCALL_DEFINE2(clock_adjtime, clockid_t, which_clock,return err; } +#endif +COMPAT_SYSCALL_DEFINE2 (clock_getres, clockid_t, which_clock, struct compat_timespec __user *, tp) {
@@ -1183,8 +1185,6 @@ COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,return err; } -#endif -/* * nanosleep for monotonic and realtime clocks */
@@ -1221,7 +1221,6 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,return kc->nsleep (which_clock, flags, &t); } -#ifdef CONFIG_COMPAT COMPAT_SYSCALL_DEFINE4 (clock_nanosleep, clockid_t, which_clock, int, flags, struct compat_timespec __user *, rqtp, struct compat_timespec __user *, rmtp)
@@ -1246,7 +1245,6 @@ COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags,return kc->nsleep (which_clock, flags, &t); } -#endif static const struct k_clock clock_realtime = { .clock_getres = posix_get_hrtimer_res,
Signature · 1 line
2.11.0
Re: [PATCH 4/9] posix-clocks: Enable compat syscalls always
kernel/time/hrtimer.c COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, · line 1577
Quoted 11 lines · Deepa Dinamani
kernel/time/hrtimer.c +0
-3-#ifdef CONFIG_COMPAT - COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, struct compat_timespec __user *, rmtp) {@@ -1574,7 +1572,6 @@ COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, current->restart_block.nanosleep.compat_rmtp = rmtp;return hrtimer_nanosleep (&tu,HRTIMER_MODE_REL ,CLOCK_MONOTONIC ); } -#endif
So if I'm not missing something important this will make the compat syscall define available even for
CONFIG_X86_64=yCONFIG_IA32_EMULATION=nCONFIG_X86_X32=n
which is wrong because in that configuration we don't have any 32bit executable support. So why would we need a compat syscall in that case?
Thanks,
tglx
Re: [PATCH 4/9] posix-clocks: Enable compat syscalls always
Quoted 16 lines · Thomas Gleixner
kernel/time/hrtimer.c COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, · line 1577
Quoted 11 lines · Deepa Dinamani
kernel/time/hrtimer.c +0
-3-#ifdef CONFIG_COMPAT - COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, struct compat_timespec __user *, rmtp) {@@ -1574,7 +1572,6 @@ COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, current->restart_block.nanosleep.compat_rmtp = rmtp;return hrtimer_nanosleep (&tu,HRTIMER_MODE_REL ,CLOCK_MONOTONIC ); } -#endif So if I'm not missing something important this will make the compat syscall define available even for
Quoted 6 lines
CONFIG_X86_64=yCONFIG_IA32_EMULATION=nCONFIG_X86_X32=nwhich is wrong because in that configuration we don't have any 32bit executable support. So why would we need a compat syscall in that case?
I was thinking that we would switch the meaning of CONFIG_64BIT_TIME after all architectures have enabled support for 64 bit time_t syscalls.
After that, I was going to use the config to mean enable only 64 bit time_t support and so all compat syscalls would have #ifndef CONFIG_64BIT_TIME around them.
Compat syscalls do not mean compat anymore for these time syscalls as the data structure is defined in a way that they are the same on 64 bit and 32 bit architectures.
But, you are right. It will leave in compat syscalls when it is not required now.
I could add a dependency on CONFIG_COMPAT and __BITS_PER_LONG for now if you prefer. I could introduce additional dependencies later on.
-Deepa
Arnd Bergmann
maintainerRe: [PATCH 4/9] posix-clocks: Enable compat syscalls always
Quoted 21 lines · Deepa Dinamani
Quoted 20 lines · Thomas Gleixner
kernel/time/hrtimer.c COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, · line 1577
Quoted 11 lines · Deepa Dinamani
kernel/time/hrtimer.c +0
-3-#ifdef CONFIG_COMPAT - COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, struct compat_timespec __user *, rmtp) {@@ -1574,7 +1572,6 @@ COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, current->restart_block.nanosleep.compat_rmtp = rmtp;return hrtimer_nanosleep (&tu,HRTIMER_MODE_REL ,CLOCK_MONOTONIC ); } -#endif So if I'm not missing something important this will make the compat syscall define available even for
CONFIG_X86_64=yCONFIG_IA32_EMULATION=nCONFIG_X86_X32=n
Quoted 6 lines
Quoted 2 lines
which is wrong because in that configuration we don't have any 32bit executable support. So why would we need a compat syscall in that case?
I was thinking that we would switch the meaning of
CONFIG_64BIT_TIMEafter all architectures have enabled support for 64 bittime_tsyscalls.
I think at that point the CONFIG_64BIT_TIME symbol can just go away, the name would not express any useful meaning any more once all architectures use 64-bit time types.
Quoted 11 lines
After that, I was going to use the config to mean enable only 64 bit
time_tsupport and so all compat syscalls would have #ifndefCONFIG_64BIT_TIMEaround them.
Compat syscalls do not mean compat anymore for these time syscalls as the data structure is defined in a way that they are the same on 64 bit and 32 bit architectures.But, you are right. It will leave in compat syscalls when it is not required now.
I could add a dependency onCONFIG_COMPATand__BITS_PER_LONGfor now if you prefer. I could introduce additional dependencies later on.
In kernel uapi headers, checking for __BITS_PER_LONG is appropriate, but we can't check for CONFIG_COMPAT there, since user space does not see the CONFIG_ namespace.
In the kernel, checking for 64-bit architectures is better done using the CONFIG_64BIT symbol.
So we could do
-#ifdef CONFIG_COMPAT
+#if defined(CONFIG_COMPAT) || !defined(CONFIG_64BIT)
-
COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp,
struct compat_timespec __user *, rmtp)
The trick with renaming the Kconfig symbol worked better with the old CONFIG_COMPAT_TIME name that I had in an earlier draft of the series, it would also enable us to leave out the 32-bit time compat syscall implementation for future architectures that never had the old uapi.
Arnd
PATCH 5/9 y2038: introduce CONFIG_64BIT_TIME
In reply to Deepa DinamaniFrom: Arnd Bergmann <[email protected]>
There are a total of 53 system calls (aside from ioctl) that pass a time_t or derived data structure as an argument, and in order to extend time_t to 64-bit, we have to replace them with new system calls and keep providing backwards compatibility.
To avoid adding completely new and untested code for this purpose, we introduce a new CONFIG_64BIT_TIME symbol. Every architecture that supports new 64 bit time_t syscalls enables this config via ARCH_HAS_64BIT_TIME.
After this is done for all architectures, the CONFIG_64BIT_TIME symbol can be made a user-selected option, to enable users to build a kernel that only provides y2038-safe system calls by making 32 time_t syscalls conditionally included based on the above config.
--- arch/Kconfig | 11 +++++++++++ 1 file changed, 11 insertions(+)
arch/Kconfig +11 -0
@@ -875,6 +875,17 @@ config OLD_SIGACTION config COMPAT_OLD_SIGACTION bool +config ARCH_HAS_64BIT_TIME + def_bool n + +config CONFIG_64BIT_TIME + def_bool ARCH_HAS_64BIT_TIME + help + This should be selected by all architectures that need to support + new system calls with a 64-bit time_t. This is relevant on all 32-bit + architectures, and 64-bit architectures as part of compat syscall + handling. + config ARCH_NO_COHERENT_DMA_MMAP bool
Signature · 1 line
2.11.0
Re: [Y2038] [PATCH 5/9] y2038: introduce CONFIG_64BIT_TIME
Quoted 7 lines · Deepa Dinamani
From: Arnd Bergmann <[email protected]>
There are a total of 53 system calls (aside from ioctl) that pass a
time_tor derived data structure as an argument, and in order to extendtime_tto 64-bit, we have to replace them with new system calls and keep providing backwards compatibility.
Quoted 8 lines
To avoid adding completely new and untested code for this purpose, we introduce a new
CONFIG_64BIT_TIMEsymbol. Every architecture that supports new 64 bittime_tsyscalls enables this config viaARCH_HAS_64BIT_TIME.After this is done for all architectures, the
CONFIG_64BIT_TIMEsymbol can be made a user-selected option, to enable users to build a kernel that only provides y2038-safe system calls by making 32time_tsyscalls conditionally included based on the above config.
I don't understand why we would want to change the semantics of CONFIG_64BIT_TIME symbol from "enable 64-bit time support" to "disable 32-bit time support".
Why not add two config symbols:
config 32BIT_TIME
def_bool COMPAT || !64BIT
config 64BIT_TIME
def_bool ARCH_HAS_64BIT_TIME
and then make 32BIT_TIME user-configurable later?
Quoted 14 lines
Signed-off-by Arnd Bergmann <[email protected]>Signed-off-by Deepa Dinamani <[email protected]>---
arch/Kconfig | 11 +++++++++++1 file changed, 11 insertions(+)arch/Kconfig +0
-0@@ -875,6 +875,17 @@ config OLD_SIGACTIONconfig
COMPAT_OLD_SIGACTION
bool
arch/Kconfig config OLD_SIGACTION · line 881
Quoted 4 lines
arch/Kconfig +4
-0+config ARCH_HAS_64BIT_TIME + def_bool n + +config CONFIG_64BIT_TIME
The CONFIG_ prefix is added by kconfig scripts and shouldn't be used in the Kconfig file.
Ben.
Quoted 10 lines
arch/Kconfig +7
-0+ def_bool ARCH_HAS_64BIT_TIME + help + This should be selected by all architectures that need to support + new system calls with a 64-bit time_t. This is relevant on all 32-bit + architectures, and 64-bit architectures as part of compat syscall + handling. +config
ARCH_NO_COHERENT_DMA_MMAP
bool
Signature · 2 lines
Ben Hutchings Software Developer, Codethink Ltd.
Re: [Y2038] [PATCH 5/9] y2038: introduce CONFIG_64BIT_TIME
Quoted 23 lines · Ben Hutchings
Quoted 7 lines · Deepa Dinamani
From: Arnd Bergmann <[email protected]>
There are a total of 53 system calls (aside from ioctl) that pass a
time_tor derived data structure as an argument, and in order to extendtime_tto 64-bit, we have to replace them with new system calls and keep providing backwards compatibility.Quoted 8 lines
To avoid adding completely new and untested code for this purpose, we introduce a new
CONFIG_64BIT_TIMEsymbol. Every architecture that supports new 64 bittime_tsyscalls enables this config viaARCH_HAS_64BIT_TIME.After this is done for all architectures, the
CONFIG_64BIT_TIMEsymbol can be made a user-selected option, to enable users to build a kernel that only provides y2038-safe system calls by making 32time_tsyscalls conditionally included based on the above config.I don't understand why we would want to change the semantics of
CONFIG_64BIT_TIMEsymbol from "enable 64-bit time support" to "disable 32-bit time support".Why not add two config symbols:
Quoted 7 lines
config 32BIT_TIME
def_bool COMPAT || !64BITconfig 64BIT_TIME
def_boolARCH_HAS_64BIT_TIMEand then make 32BIT_TIME user-configurable later?
This was already discussed on the review and we have an updated version:
https://lkml.org/lkml/2017/11/27/938
Quoted 14 lines
Quoted 14 lines
Signed-off-by Arnd Bergmann <[email protected]>Signed-off-by Deepa Dinamani <[email protected]>--- arch/Kconfig | 11 +++++++++++ 1 file changed, 11 insertions(+)arch/Kconfig +0
-0@@ -875,6 +875,17 @@ config OLD_SIGACTION config COMPAT_OLD_SIGACTION bool
Quoted 7 lines
arch/Kconfig config OLD_SIGACTION · line 881
Quoted 4 lines
arch/Kconfig +4
-0+config ARCH_HAS_64BIT_TIME + def_bool n + +config CONFIG_64BIT_TIMEThe
CONFIG_prefix is added by kconfig scripts and shouldn't be used in theKconfigfile.
Yes, this was a typo and was fixed by the next revision which has already been posted:
https://lkml.org/lkml/2017/11/27/938
-Deepa
Re: [Y2038] [PATCH 5/9] y2038: introduce CONFIG_64BIT_TIME
Quoted 28 lines · Deepa Dinamani
On Fri, Dec 8, 2017 at 8:53 AM, Ben Hutchings
Quoted 27 lines
<[email protected]> wrote:
Quoted 7 lines · Deepa Dinamani
From: Arnd Bergmann <[email protected]>
There are a total of 53 system calls (aside from ioctl) that pass a
time_tor derived data structure as an argument, and in order to extendtime_tto 64-bit, we have to replace them with new system calls and keep providing backwards compatibility.Quoted 8 lines
To avoid adding completely new and untested code for this purpose, we introduce a new
CONFIG_64BIT_TIMEsymbol. Every architecture that supports new 64 bittime_tsyscalls enables this config viaARCH_HAS_64BIT_TIME.After this is done for all architectures, the
CONFIG_64BIT_TIMEsymbol can be made a user-selected option, to enable users to build a kernel that only provides y2038-safe system calls by making 32time_tsyscalls conditionally included based on the above config.I don't understand why we would want to change the semantics of
CONFIG_64BIT_TIMEsymbol from "enable 64-bit time support" to "disable 32-bit time support".Why not add two config symbols:
config 32BIT_TIME
def_bool COMPAT || !64BIT
Quoted 8 lines
Quoted 4 lines
config 64BIT_TIME
def_boolARCH_HAS_64BIT_TIMEand then make 32BIT_TIME user-configurable later?
This was already discussed on the review and we have an updated version:
Sorry, I'll move on to reviewing that.
Ben.
Signature · 2 lines
Ben Hutchings Software Developer, Codethink Ltd.
PATCH 6/9 include: Add new y2038 safe __kernel_timespec
In reply to Deepa DinamaniThe new struct __kernel_timespec is similar to current internal kernel struct timespec64 on 64 bit architecture. The compat structure however is similar to below on little endian systems (padding and tv_nsec are switched for big endian systems):
typedef s32 compat_long_t;
typedef s64 compat_kernel_time64_t;
struct compat_kernel_timespec {
compat_kernel_time64_t tv_sec;
compat_long_t tv_nsec;
compat_long_t padding;
};This allows for both the native and compat representations to be the same and syscalls using this type as part of their ABI can have a single entry point to both.
Note that the compat define is not included anywhere in the kernel explicitly to avoid confusion.
These types will be used by the new syscalls that will be introduced in the consequent patches.
Most of the new syscalls are just an update to the existing native ones with this new type. Hence, put this new type under an ifdef so that the architectures can define CONFIG_64BIT_TIME when they are ready to handle this switch.
--- include/linux/time64.h | 10 +++++++++- include/uapi/asm-generic/posix_types.h | 1 + include/uapi/linux/time.h | 7 +++++++ 3 files changed, 17 insertions(+), 1 deletion(-)
include/linux/time64.h +9 -1
@@ -2,12 +2,20 @@#ifndef _LINUX_TIME64_H#define _LINUX_TIME64_H -#include <uapi/linux/time.h> #include <linux/math64.h> typedef __s64 time64_t ;typedef __u64 timeu64_t ; +/* CONFIG_64BIT_TIME enables new 64 bit time_t syscalls in the compat path +* and 32-bit emulation. +*/ +#ifndef CONFIG_64BIT_TIME +#define __kernel_timespec timespec +#endif + +#include <uapi/linux/time.h> +#if __BITS_PER_LONG ==64 /* this trick allows us to optimize out timespec64_to_timespec */ # define timespec64 timespec
include/uapi/asm-generic/posix_types.h +1 -0
@@ -87,6 +87,7 @@ typedef struct {typedef __kernel_long_t __kernel_off_t ;typedef long long __kernel_loff_t ;typedef __kernel_long_t __kernel_time_t ; +typedef long long __kernel_time64_t ;typedef __kernel_long_t __kernel_clock_t ;typedef int __kernel_timer_t ;typedef int __kernel_clockid_t ;
include/uapi/linux/time.h +7 -0
@@ -42,6 +42,13 @@ struct itimerval {struct timeval it_value;/* current value */ }; +#ifndef __kernel_timespec +struct __kernel_timespec { +__kernel_time64_t tv_sec;/* seconds */ +long long tv_nsec;/* nanoseconds */ +}; +#endif +/* * The IDs of the various system clocks (for POSIX.1b interval timers): */
Signature · 1 line
2.11.0
PATCH 7/9 fix get_timespec64() for y2038 safe compat interfaces
In reply to Deepa Dinamaniget/put_timespec64() interfaces will eventually be used for conversions between the new y2038 safe struct __kernel_timespec and struct timespec64.
The new y2038 safe syscalls have a common entry for native and compat interfaces.
On compat interfaces, the high order bits of nanoseconds are should to be zeroed out. This is because the application code or the libc do not garuntee zeroing of these. If used without zeroing, kernel might be at risk of using timespec values incorrectly.
--- include/linux/time.h | 4 ++-- kernel/time/time.c | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-)
include/linux/time.h +2 -2
@@ -10,9 +10,9 @@extern struct timezone sys_tz;int get_timespec64 (struct timespec64 *ts, -const struct timespec __user *uts); +const struct __kernel_timespec __user *uts);int put_timespec64 (const struct timespec64 *ts, -struct timespec __user *uts); +struct __kernel_timespec __user *uts);int get_itimerspec64 (struct itimerspec64 *it,const struct itimerspec __user *uit); int put_itimerspec64(const struct itimerspec64 *it,
kernel/time/time.c +8 -2
@@ -841,7 +841,7 @@ struct timespec64 timespec64_add_safe(const struct timespec64 lhs, }int get_timespec64 (struct timespec64 *ts, -const struct timespec __user *uts) +const struct __kernel_timespec __user *uts) {struct timespec kts;int ret;
@@ -851,6 +851,11 @@ int get_timespec64(struct timespec64 *ts,return -EFAULT ; ts->tv_sec = kts.tv_sec; + +/* Zero out the padding for 32 bit systems or in compat mode */ +if (!IS_ENABLED (CONFIG_64BIT ) ||in_compat_syscall ()) + kts.tv_nsec &=0xFFFFFFFFUL ; + ts->tv_nsec = kts.tv_nsec;return 0 ;
@@ -858,12 +863,13 @@ int get_timespec64(struct timespec64 *ts,EXPORT_SYMBOL_GPL (get_timespec64);int put_timespec64 (const struct timespec64 *ts, -struct timespec __user *uts) +struct __kernel_timespec __user *uts) {struct timespec kts = { .tv_sec = ts->tv_sec, .tv_nsec = ts->tv_nsec }; +return copy_to_user (uts, &kts,sizeof (kts)) ? -EFAULT :0 ; }EXPORT_SYMBOL_GPL (put_timespec64);
Signature · 1 line
2.11.0
Arnd Bergmann
maintainerRe: [PATCH 7/9] fix get_timespec64() for y2038 safe compat interfaces
kernel/time/time.c int get_timespec64(struct timespec64 *ts, · line 857
Quoted 4 lines · Deepa Dinamani
kernel/time/time.c +4
-0+ +/* Zero out the padding for 32 bit systems or in compat mode */ +if (!IS_ENABLED (CONFIG_64BIT ) ||in_compat_syscall ()) + kts.tv_nsec &=0xFFFFFFFFUL ;
Is this correct for x32? Since x32 has a 64-bit tv_nsec, I think we currently return an error in timespec64_valid when e.g. you pass 0xffffffff00000000 as the tv_nsec value, while after this patch x32 would behave the same way as other 32-bit architectures and silently clear the upper bits.
Arnd
PATCH 8/9 change time types to new y2038 safe __kernel_* types
In reply to Deepa DinamaniChange over clock_settime, clock_gettime and clock_getres syscalls to use __kernel_timespec times. This will enable changing over of these syscalls to use new y2038 safe syscalls when the architectures define the CONFIG_64BIT_TIME.
--- include/linux/syscalls.h | 6 +++--- kernel/time/posix-stubs.c | 6 +++--- kernel/time/posix-timers.c | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-)
include/linux/syscalls.h +3 -3
@@ -309,13 +309,13 @@ asmlinkage long sys_timer_settime(timer_t timer_id, int flags, struct itimerspec __user *old_setting);asmlinkage long sys_timer_delete (timer_t timer_id);asmlinkage long sys_clock_settime (clockid_t which_clock, -const struct timespec __user *tp); +const struct __kernel_timespec __user *tp);asmlinkage long sys_clock_gettime (clockid_t which_clock, -struct timespec __user *tp); +struct __kernel_timespec __user *tp);asmlinkage long sys_clock_adjtime (clockid_t which_clock,struct timex __user *tx);asmlinkage long sys_clock_getres (clockid_t which_clock, -struct timespec __user *tp); +struct __kernel_timespec __user *tp);asmlinkage long sys_clock_nanosleep (clockid_t which_clock,int flags,const struct timespec __user *rqtp,struct timespec __user *rmtp);
kernel/time/posix-stubs.c +3 -3
@@ -49,7 +49,7 @@ SYS_NI(alarm);*/ SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock, - const struct timespec __user *, tp) + const struct __kernel_timespec __user *, tp) {struct timespec64 new_tp;
@@ -80,7 +80,7 @@ int do_clock_gettime(clockid_t which_clock, struct timespec64 *tp)return 0 ; } SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock, - struct timespec __user *, tp) + struct __kernel_timespec __user *, tp) {int ret;struct timespec64 kernel_tp;
@@ -94,7 +94,7 @@ SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,return 0 ; } -SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock, struct timespec __user *, tp) +SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock, struct __kernel_timespec __user *, tp) {struct timespec64 rtn_tp = { .tv_sec =0 ,
kernel/time/posix-timers.c +3 -3
@@ -1034,7 +1034,7 @@ void exit_itimers(struct signal_struct *sig) } SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock, - const struct timespec __user *, tp) + const struct __kernel_timespec __user *, tp) {const struct k_clock *kc =clockid_to_kclock (which_clock);struct timespec64 new_tp;
@@ -1049,7 +1049,7 @@ SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock, } SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock, - struct timespec __user *,tp) + struct __kernel_timespec __user *, tp) {const struct k_clock *kc =clockid_to_kclock (which_clock);struct timespec64 kernel_tp;
@@ -1090,7 +1090,7 @@ SYSCALL_DEFINE2(clock_adjtime, const clockid_t, which_clock, } SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock, - struct timespec __user *, tp) + struct __kernel_timespec __user *, tp) {const struct k_clock *kc =clockid_to_kclock (which_clock);struct timespec64 rtn_tp;
Signature · 1 line
2.11.0
PATCH 9/9 nanosleep: change time types to safe __kernel_* types
In reply to Deepa DinamaniChange over clock_nanosleep syscalls to use y2038 safe __kernel_timespec times. This will enable changing over of these syscalls to use new y2038 safe syscalls when the architectures define the CONFIG_64BIT_TIME.
Note that nanosleep syscall is deprecated and does not have a plan for making it y2038 safe. But, the syscall should work as before on 64 bit machines and on 32 bit machines, the syscall works correctly until y2038 as before using the existing compat syscall version. There is no new syscall for supporting 64 bit time_t on 32 bit architectures.
--- include/linux/restart_block.h | 7 ++----- include/linux/syscalls.h | 6 +++--- kernel/time/hrtimer.c | 4 ++-- kernel/time/posix-stubs.c | 4 ++-- kernel/time/posix-timers.c | 4 ++-- 5 files changed, 11 insertions(+), 14 deletions(-)
include/linux/restart_block.h +2 -5
@@ -7,6 +7,7 @@#include <linux/compiler.h> #include <linux/types.h> +#include <linux/time64.h> struct timespec ;struct compat_timespec ;
@@ -15,9 +16,7 @@ struct pollfd;enum timespec_type {TT_NONE =0 ,TT_NATIVE =1 , -#ifdef CONFIG_COMPAT TT_COMPAT =2 , -#endif };/*
@@ -40,10 +39,8 @@ struct restart_block {clockid_t clockid;enum timespec_type type;union { -struct timespec __user *rmtp; -#ifdef CONFIG_COMPAT +struct __kernel_timespec __user *rmtp;struct compat_timespec __user *compat_rmtp; -#endif };u64 expires; } nanosleep;
include/linux/syscalls.h +3 -3
@@ -254,7 +254,7 @@ asmlinkage long sys_adjtimex(struct timex __user *txc_p);asmlinkage long sys_times (struct tms __user *tbuf);asmlinkage long sys_gettid (void ); -asmlinkage long sys_nanosleep (struct timespec __user *rqtp,struct timespec __user *rmtp); +asmlinkage long sys_nanosleep (struct __kernel_timespec __user *rqtp,struct __kernel_timespec __user *rmtp);asmlinkage long sys_alarm (unsigned int seconds);asmlinkage long sys_getpid (void );asmlinkage long sys_getppid (void );
@@ -317,8 +317,8 @@ asmlinkage long sys_clock_adjtime(clockid_t which_clock,asmlinkage long sys_clock_getres (clockid_t which_clock,struct __kernel_timespec __user *tp);asmlinkage long sys_clock_nanosleep (clockid_t which_clock,int flags, -const struct timespec __user *rqtp, -struct timespec __user *rmtp); +const struct __kernel_timespec __user *rqtp, +struct __kernel_timespec __user *rmtp);asmlinkage long sys_nice (int increment); asmlinkage long sys_sched_setscheduler(pid_t pid, int policy,
kernel/time/hrtimer.c +2 -2
@@ -1541,8 +1541,8 @@ long hrtimer_nanosleep(const struct timespec64 *rqtp,return ret; } -SYSCALL_DEFINE2(nanosleep, struct timespec __user *, rqtp, - struct timespec __user *, rmtp) +SYSCALL_DEFINE2(nanosleep, struct __kernel_timespec __user *, rqtp, + struct __kernel_timespec __user *, rmtp) {struct timespec64 tu;
kernel/time/posix-stubs.c +2 -2
@@ -114,8 +114,8 @@ SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock, struct __kernel_time } SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags, - const struct timespec __user *, rqtp, - struct timespec __user *, rmtp) + const struct __kernel_timespec __user *, rqtp, + struct __kernel_timespec __user *, rmtp) {struct timespec64 t;
kernel/time/posix-timers.c +2 -2
@@ -1197,8 +1197,8 @@ static int common_nsleep(const clockid_t which_clock, int flags, } SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags, - const struct timespec __user *, rqtp, - struct timespec __user *, rmtp) + const struct __kernel_timespec __user *, rqtp, + struct __kernel_timespec __user *, rmtp) {const struct k_clock *kc =clockid_to_kclock (which_clock);struct timespec64 t;
Signature · 1 line
2.11.0
Arnd Bergmann
maintainerQuoted 32 lines · Deepa Dinamani
The series is a preparation series for individual architectures to use 64 bit
time_tsyscalls in compat and 32 bit emulation modes.This is a follow up to the series Arnd Bergmann posted:
https://sourceware.org/ml/libc-alpha/2015-05/msg00070.htmlBig picture is as per the lwn article:
https://lwn.net/Articles/643234/The series is directed at converting posix clock syscalls:
clock_gettime,clock_settime,clock_getresandclock_nanosleepto use a new data structure__kernel_timespecat syscall boundaries.__kernel_timespecmaintains 64 bittime_tacross all execution modes.vdso will be handled as part of each architecture when they enable support for 64 bit
time_t.The compat syscalls are repurposed to provide backward compatibility by using them as native syscalls as well for 32 bit architectures. They will continue to use timespec at syscall boundaries.
CONFIG_64_BIT_TIMEcontrols whether the syscalls use__kernel_timespecor timespec at syscall boundaries.The series does the following:
1. Enable compat syscalls unconditionally.
2. Add a new__kernel_timespectype to be used as the data structure for all the new syscalls.
3. Add new config CONFIG_64BIT_TIME(intead of theCONFIG_COMPAT_TIMEin
[1] and [2] to switch to new definition of__kernel_timespec. It is the same as struct timespec otherwise.
Quoted 2 lines
Arnd Bergmann (1):
y2038: introduceCONFIG_64BIT_TIME
The series looks good to me overall, and I've added it to my build-testing tree to see if it shows any regressions in random configurations.
I had on concern about x32, maybe we should check for "COMPAT_USE_64BIT_TIME" before zeroing out the tv_nsec bits.
Regarding CONFIG_COMPAT_TIME/CONFIG_64BIT_TIME, would it help to just leave out that part for now and unconditionally define '__kernel_timespec' as 'timespec' until we are ready to convert the architectures?
Arnd
Quoted 3 lines
I had on concern about x32, maybe we should check for "
COMPAT_USE_64BIT_TIME" before zeroing out thetv_nsecbits.
Thanks, I think you are right. I had the check conditional on CONFIG_64BIT_TIME and then removed as I forgot why I added it. :)
Quoted 4 lines
Regarding CONFIG_COMPAT_TIME/CONFIG_64BIT_TIME, would it help to just leave out that part for now and unconditionally define '
__kernel_timespec' as 'timespec' until we are ready to convert the architectures?
Another approach would be to use separate configs:
1. To indicate 64 bit time_t syscall support. This will be dependent on architectures as CONFIG_64BIT_TIME.
We can delete this once all architectures have provided support for this.
2. Another config (maybe COMPAT_32BIT_TIME?) to be introduced later, which will compile out all syscalls/ features that use 32 bit time_t. This can help build a y2038 safe kernel later.
Would this work for everyone?
-Deepa
Quoted 18 lines · Deepa Dinamani
Quoted 3 lines
I had on concern about x32, maybe we should check for "
COMPAT_USE_64BIT_TIME" before zeroing out thetv_nsecbits.Thanks, I think you are right. I had the check conditional on
CONFIG_64BIT_TIMEand then removed as I forgot why I added it. :)Quoted 4 lines
Regarding CONFIG_COMPAT_TIME/CONFIG_64BIT_TIME, would it help to just leave out that part for now and unconditionally define '
__kernel_timespec' as 'timespec' until we are ready to convert the architectures?Another approach would be to use separate configs:
1. To indicate 64 bit
time_tsyscall support. This will be dependent on architectures asCONFIG_64BIT_TIME.
We can delete this once all architectures have provided support for this.
Quoted 5 lines
2. Another config (maybe
COMPAT_32BIT_TIME?) to be introduced later, which will compile out all syscalls/ features that use 32 bittime_t. This can help build a y2038 safe kernel later.Would this work for everyone?
Having extra config switches which are selectable by architectures and removed when everything is converted is definitely the right way to go.
That allows you to gradually convert stuff w/o inflicting wreckage all over the place.
Thanks,
tglx
Arnd Bergmann
maintainerQuoted 23 lines · Thomas Gleixner
Quoted 22 lines · Deepa Dinamani
Quoted 3 lines
I had on concern about x32, maybe we should check for "
COMPAT_USE_64BIT_TIME" before zeroing out thetv_nsecbits.Thanks, I think you are right. I had the check conditional on
CONFIG_64BIT_TIMEand then removed as I forgot why I added it. :)Quoted 4 lines
Regarding CONFIG_COMPAT_TIME/CONFIG_64BIT_TIME, would it help to just leave out that part for now and unconditionally define '
__kernel_timespec' as 'timespec' until we are ready to convert the architectures?Another approach would be to use separate configs:
1. To indicate 64 bit
time_tsyscall support. This will be dependent on architectures asCONFIG_64BIT_TIME.
We can delete this once all architectures have provided support for this.2. Another config (maybe
COMPAT_32BIT_TIME?) to be introduced later, which will compile out all syscalls/ features that use 32 bittime_t. This can help build a y2038 safe kernel later.
Quoted 7 lines
Quoted 1 line
Would this work for everyone?
Having extra config switches which are selectable by architectures and removed when everything is converted is definitely the right way to go.
That allows you to gradually convert stuff w/o inflicting wreckage all over the place.
The CONFIG_64BIT_TIME would do that nicely for the new stuff like the conditional definition of __kernel_timespec, this one would get removed after we convert all architectures.
A second issue is how to control the compilation of the compat syscalls. CONFIG_COMPAT_32BIT_TIME handles that and could be defined in Kconfig as 'def_bool (!64BIT && CONFIG_64BIT_TIME) || COMPAT', this is then just a more readable way of expressing exactly when the functions should be built.
For completeness, there may be a third category, depending on how we handle things like sys_nanosleep(): Here, we want the native sys_nanosleep on 64-bit architectures, and compat_sys_nanosleep() to handle the 32-bit time_t variant on both 32-bit and 64-bit targets, but our plan is to not have a native 32-bit sys_nanosleep on 32-bit architectures any more, as new glibc should call clock_nanosleep() with a new syscall number instead. Should we then enclose sys_nanosleep in "#if !defined(CONFIG_64BIT_TIME) || defined(CONFIG_64BIT)", or should we try to come up with another Kconfig symbol name that expresses this better?
Arnd
Quoted 20 lines · Arnd Bergmann
Quoted 8 lines · Thomas Gleixner
Quoted 1 line · Deepa Dinamani
Would this work for everyone?
Having extra config switches which are selectable by architectures and removed when everything is converted is definitely the right way to go.
That allows you to gradually convert stuff w/o inflicting wreckage all over the place.
The
CONFIG_64BIT_TIMEwould do that nicely for the new stuff like the conditional definition of__kernel_timespec, this one would get removed after we convert all architectures.A second issue is how to control the compilation of the compat syscalls.
CONFIG_COMPAT_32BIT_TIMEhandles that and could be defined inKconfigas 'def_bool(!64BIT &&CONFIG_64BIT_TIME) || COMPAT', this is then just a more readable way of expressing exactly when the functions should be built.
Quoted 7 lines
For completeness, there may be a third category, depending on how we handle things like
sys_nanosleep(): Here, we want the nativesys_nanosleepon 64-bit architectures, andcompat_sys_nanosleep()to handle the 32-bittime_tvariant on both 32-bit and 64-bit targets, but our plan is to not have a native 32-bitsys_nanosleepon 32-bit architectures any more, as new glibc should callclock_nanosleep()with a new syscall number instead. Should we then enclose
Isn't that going to break existing userspace?
Thanks
tglx
_______________________________________________
Y2038 mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/y2038
Arnd Bergmann
maintainerQuoted 29 lines · Thomas Gleixner
Quoted 20 lines · Arnd Bergmann
Quoted 8 lines · Thomas Gleixner
Quoted 1 line · Deepa Dinamani
Would this work for everyone?
Having extra config switches which are selectable by architectures and removed when everything is converted is definitely the right way to go.
That allows you to gradually convert stuff w/o inflicting wreckage all over the place.
The
CONFIG_64BIT_TIMEwould do that nicely for the new stuff like the conditional definition of__kernel_timespec, this one would get removed after we convert all architectures.A second issue is how to control the compilation of the compat syscalls.
CONFIG_COMPAT_32BIT_TIMEhandles that and could be defined inKconfigas 'def_bool(!64BIT &&CONFIG_64BIT_TIME) || COMPAT', this is then just a more readable way of expressing exactly when the functions should be built.Quoted 7 lines
For completeness, there may be a third category, depending on how we handle things like
sys_nanosleep(): Here, we want the nativesys_nanosleepon 64-bit architectures, andcompat_sys_nanosleep()to handle the 32-bittime_tvariant on both 32-bit and 64-bit targets, but our plan is to not have a native 32-bitsys_nanosleepon 32-bit architectures any more, as new glibc should callclock_nanosleep()with a new syscall number instead. Should we then enclose
Quoted 1 line
Isn't that going to break existing userspace?
No, syscall that existing 32-bit user space enters would be handled by compat_sys_nanosleep() on both 32-bit and 64-bit kernels at that point. The idea here is to make the code path more uniform between 32-bit and 64-bit kernels.
Arnd
_______________________________________________
Y2038 mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/y2038
Quoted 30 lines · Arnd Bergmann
Quoted 29 lines · Thomas Gleixner
Quoted 27 lines · Arnd Bergmann
Quoted 8 lines · Thomas Gleixner
Quoted 1 line · Deepa Dinamani
Would this work for everyone?
Having extra config switches which are selectable by architectures and removed when everything is converted is definitely the right way to go.
That allows you to gradually convert stuff w/o inflicting wreckage all over the place.
The
CONFIG_64BIT_TIMEwould do that nicely for the new stuff like the conditional definition of__kernel_timespec, this one would get removed after we convert all architectures.A second issue is how to control the compilation of the compat syscalls.
CONFIG_COMPAT_32BIT_TIMEhandles that and could be defined inKconfigas 'def_bool(!64BIT &&CONFIG_64BIT_TIME) || COMPAT', this is then just a more readable way of expressing exactly when the functions should be built.For completeness, there may be a third category, depending on how we handle things like
sys_nanosleep(): Here, we want the nativesys_nanosleepon 64-bit architectures, andcompat_sys_nanosleep()to handle the 32-bittime_tvariant on both 32-bit and 64-bit targets, but our plan is to not have a native 32-bitsys_nanosleepon 32-bit architectures any more, as new glibc should callclock_nanosleep()with a new syscall number instead. Should we then enclose
Quoted 6 lines
Quoted 1 line
Isn't that going to break existing userspace?
No, syscall that existing 32-bit user space enters would be handled by
compat_sys_nanosleep()on both 32-bit and 64-bit kernels at that point. The idea here is to make the code path more uniform between 32-bit and 64-bit kernels.
So on a 32bit system compat_sys_nanosleep() would be the legacy sys_nanosleep() with the existing syscall number, but you don't want to introduce a new sys_nanosleep64() for 32bit. That makes a lot of sense.
So back to your original question whether to use #if (MAGIC logic) or a separate config symbol. Please use the latter, these magic logic constructs are harder to read and prone to get wrong at some point. Having the decision logic in one place is always the right thing to do.
Thanks,
tglx
_______________________________________________
Y2038 mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/y2038
Arnd Bergmann
maintainerQuoted 8 lines · Thomas Gleixner
Quoted 6 lines · Arnd Bergmann
On Fri, Nov 17, 2017 at 9:58 AM, Thomas Gleixner <[email protected]> wrote:
No, syscall that existing 32-bit user space enters would be handled by
compat_sys_nanosleep()on both 32-bit and 64-bit kernels at that point. The idea here is to make the code path more uniform between 32-bit and 64-bit kernels.
Quoted 8 lines
So on a 32bit system
compat_sys_nanosleep()would be the legacysys_nanosleep()with the existing syscall number, but you don't want to introduce a newsys_nanosleep64()for 32bit. That makes a lot of sense.So back to your original question whether to use #if (MAGIC logic) or a separate config symbol. Please use the latter, these magic logic constructs are harder to read and prone to get wrong at some point. Having the decision logic in one place is always the right thing to do.
How about this:
config LEGACY_TIME_SYSCALLS
def_bool 64BIT || !64BIT_TIME
help
This controls the compilation of the following system calls:
time, stime,
gettimeofday, settimeofday, adjtimex, nanosleep, alarm, getitimer, setitimer, select, utime, utimes, futimesat, and
{old,new}{l,f,}stat{,64}.
These all pass 32-bit time_t arguments on 32-bit architectures and are replaced by other interfaces (e.g. posix timers and clocks, statx). C libraries implementing 64-bit time_t in 32-bit architectures have to implement the handles by wrapping around the newer interfaces. New architectures should not explicitly disable this.
Arnd
Quoted 20 lines · Arnd Bergmann
Quoted 8 lines · Thomas Gleixner
Quoted 6 lines · Arnd Bergmann
On Fri, Nov 17, 2017 at 9:58 AM, Thomas Gleixner <[email protected]> wrote:
No, syscall that existing 32-bit user space enters would be handled by
compat_sys_nanosleep()on both 32-bit and 64-bit kernels at that point. The idea here is to make the code path more uniform between 32-bit and 64-bit kernels.Quoted 8 lines
So on a 32bit system
compat_sys_nanosleep()would be the legacysys_nanosleep()with the existing syscall number, but you don't want to introduce a newsys_nanosleep64()for 32bit. That makes a lot of sense.So back to your original question whether to use #if (MAGIC logic) or a separate config symbol. Please use the latter, these magic logic constructs are harder to read and prone to get wrong at some point. Having the decision logic in one place is always the right thing to do.
How about this:
Quoted 12 lines
config
LEGACY_TIME_SYSCALLS
def_bool64BIT || !64BIT_TIME
help
This controls the compilation of the following system calls:
time, stime,
gettimeofday, settimeofday, adjtimex, nanosleep, alarm, getitimer, setitimer, select, utime, utimes, futimesat, and
{old,new}{l,f,}stat{,64}.
These all pass 32-bittime_targuments on 32-bit architectures and are replaced by other interfaces (e.g. posix timers and clocks, statx). C libraries implementing 64-bittime_tin 32-bit architectures have to implement the handles by wrapping around the newer interfaces.
s/handles/handling/ ????
Quoted 1 line
New architectures should not explicitly disable this.
New architectures should never enable this, right?
Thanks,
tglx
_______________________________________________
Y2038 mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/y2038
Arnd Bergmann
maintainerQuoted 34 lines · Thomas Gleixner
Quoted 20 lines · Arnd Bergmann
Quoted 8 lines · Thomas Gleixner
Quoted 6 lines · Arnd Bergmann
On Fri, Nov 17, 2017 at 9:58 AM, Thomas Gleixner <[email protected]> wrote:
No, syscall that existing 32-bit user space enters would be handled by
compat_sys_nanosleep()on both 32-bit and 64-bit kernels at that point. The idea here is to make the code path more uniform between 32-bit and 64-bit kernels.Quoted 8 lines
So on a 32bit system
compat_sys_nanosleep()would be the legacysys_nanosleep()with the existing syscall number, but you don't want to introduce a newsys_nanosleep64()for 32bit. That makes a lot of sense.So back to your original question whether to use #if (MAGIC logic) or a separate config symbol. Please use the latter, these magic logic constructs are harder to read and prone to get wrong at some point. Having the decision logic in one place is always the right thing to do.
How about this:
Quoted 12 lines
config
LEGACY_TIME_SYSCALLS
def_bool64BIT || !64BIT_TIME
help
This controls the compilation of the following system calls:
time, stime,
gettimeofday, settimeofday, adjtimex, nanosleep, alarm, getitimer, setitimer, select, utime, utimes, futimesat, and
{old,new}{l,f,}stat{,64}.
These all pass 32-bittime_targuments on 32-bit architectures and are replaced by other interfaces (e.g. posix timers and clocks, statx). C libraries implementing 64-bittime_tin 32-bit architectures have to implement the handles by wrapping around the newer interfaces.
Quoted 1 line
s/handles/handling/ ????
I meant "handlers".
Quoted 3 lines
Quoted 1 line
New architectures should not explicitly disable this.
New architectures should never enable this, right?
Right, I got an extra "not". I guess if Deepa incorporates the new option, she can also improve my English ;-)
Arnd
_______________________________________________
Y2038 mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/y2038