Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timekeeping updates from Thomas Gleixner: "The timers and timekeeping departement provides: - Another large y2038 update with further preparations for providing the y2038 safe timespecs closer to the syscalls. - An overhaul of the SHCMT clocksource driver - SPDX license identifier updates - Small cleanups and fixes all over the place" * 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (31 commits) tick/sched : Remove redundant cpu_online() check clocksource/drivers/dw_apb: Add reset control clocksource: Remove obsolete CLOCKSOURCE_OF_DECLARE clocksource/drivers: Unify the names to timer-* format clocksource/drivers/sh_cmt: Add R-Car gen3 support dt-bindings: timer: renesas: cmt: document R-Car gen3 support clocksource/drivers/sh_cmt: Properly line-wrap sh_cmt_of_table[] initializer clocksource/drivers/sh_cmt: Fix clocksource width for 32-bit machines clocksource/drivers/sh_cmt: Fixup for 64-bit machines clocksource/drivers/sh_tmu: Convert to SPDX identifiers clocksource/drivers/sh_mtu2: Convert to SPDX identifiers clocksource/drivers/sh_cmt: Convert to SPDX identifiers clocksource/drivers/renesas-ostm: Convert to SPDX identifiers clocksource: Convert to using %pOFn instead of device_node.name tick/broadcast: Remove redundant check RISC-V: Request newstat syscalls y2038: signal: Change rt_sigtimedwait to use __kernel_timespec y2038: socket: Change recvmmsg to use __kernel_timespec y2038: sched: Change sched_rr_get_interval to use __kernel_timespec y2038: utimes: Rework #ifdef guards for compat syscalls ...
This commit is contained in:
commit
4dcb9239da
|
@ -34,6 +34,10 @@ Required Properties:
|
||||||
- "renesas,r8a7793-cmt1" for the 48-bit CMT1 device included in r8a7793.
|
- "renesas,r8a7793-cmt1" for the 48-bit CMT1 device included in r8a7793.
|
||||||
- "renesas,r8a7794-cmt0" for the 32-bit CMT0 device included in r8a7794.
|
- "renesas,r8a7794-cmt0" for the 32-bit CMT0 device included in r8a7794.
|
||||||
- "renesas,r8a7794-cmt1" for the 48-bit CMT1 device included in r8a7794.
|
- "renesas,r8a7794-cmt1" for the 48-bit CMT1 device included in r8a7794.
|
||||||
|
- "renesas,r8a77970-cmt0" for the 32-bit CMT0 device included in r8a77970.
|
||||||
|
- "renesas,r8a77970-cmt1" for the 48-bit CMT1 device included in r8a77970.
|
||||||
|
- "renesas,r8a77980-cmt0" for the 32-bit CMT0 device included in r8a77980.
|
||||||
|
- "renesas,r8a77980-cmt1" for the 48-bit CMT1 device included in r8a77980.
|
||||||
|
|
||||||
- "renesas,rcar-gen2-cmt0" for 32-bit CMT0 devices included in R-Car Gen2
|
- "renesas,rcar-gen2-cmt0" for 32-bit CMT0 devices included in R-Car Gen2
|
||||||
and RZ/G1.
|
and RZ/G1.
|
||||||
|
@ -41,6 +45,9 @@ Required Properties:
|
||||||
and RZ/G1.
|
and RZ/G1.
|
||||||
These are fallbacks for r8a73a4, R-Car Gen2 and RZ/G1 entries
|
These are fallbacks for r8a73a4, R-Car Gen2 and RZ/G1 entries
|
||||||
listed above.
|
listed above.
|
||||||
|
- "renesas,rcar-gen3-cmt0" for 32-bit CMT0 devices included in R-Car Gen3.
|
||||||
|
- "renesas,rcar-gen3-cmt1" for 48-bit CMT1 devices included in R-Car Gen3.
|
||||||
|
These are fallbacks for R-Car Gen3 entries listed above.
|
||||||
|
|
||||||
- reg: base address and length of the registers block for the timer module.
|
- reg: base address and length of the registers block for the timer module.
|
||||||
- interrupts: interrupt-specifier for the timer, one per channel.
|
- interrupts: interrupt-specifier for the timer, one per channel.
|
||||||
|
|
10
MAINTAINERS
10
MAINTAINERS
|
@ -1180,7 +1180,7 @@ N: owl
|
||||||
F: arch/arm/mach-actions/
|
F: arch/arm/mach-actions/
|
||||||
F: arch/arm/boot/dts/owl-*
|
F: arch/arm/boot/dts/owl-*
|
||||||
F: arch/arm64/boot/dts/actions/
|
F: arch/arm64/boot/dts/actions/
|
||||||
F: drivers/clocksource/owl-*
|
F: drivers/clocksource/timer-owl*
|
||||||
F: drivers/pinctrl/actions/*
|
F: drivers/pinctrl/actions/*
|
||||||
F: drivers/soc/actions/
|
F: drivers/soc/actions/
|
||||||
F: include/dt-bindings/power/owl-*
|
F: include/dt-bindings/power/owl-*
|
||||||
|
@ -1603,7 +1603,7 @@ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/boot/dts/lpc43*
|
F: arch/arm/boot/dts/lpc43*
|
||||||
F: drivers/clk/nxp/clk-lpc18xx*
|
F: drivers/clk/nxp/clk-lpc18xx*
|
||||||
F: drivers/clocksource/time-lpc32xx.c
|
F: drivers/clocksource/timer-lpc32xx.c
|
||||||
F: drivers/i2c/busses/i2c-lpc2k.c
|
F: drivers/i2c/busses/i2c-lpc2k.c
|
||||||
F: drivers/memory/pl172.c
|
F: drivers/memory/pl172.c
|
||||||
F: drivers/mtd/spi-nor/nxp-spifi.c
|
F: drivers/mtd/spi-nor/nxp-spifi.c
|
||||||
|
@ -2220,7 +2220,7 @@ F: arch/arm/mach-vexpress/
|
||||||
F: */*/vexpress*
|
F: */*/vexpress*
|
||||||
F: */*/*/vexpress*
|
F: */*/*/vexpress*
|
||||||
F: drivers/clk/versatile/clk-vexpress-osc.c
|
F: drivers/clk/versatile/clk-vexpress-osc.c
|
||||||
F: drivers/clocksource/versatile.c
|
F: drivers/clocksource/timer-versatile.c
|
||||||
N: mps2
|
N: mps2
|
||||||
|
|
||||||
ARM/VFP SUPPORT
|
ARM/VFP SUPPORT
|
||||||
|
@ -2242,7 +2242,7 @@ M: Tony Prisk <linux@prisktech.co.nz>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-vt8500/
|
F: arch/arm/mach-vt8500/
|
||||||
F: drivers/clocksource/vt8500_timer.c
|
F: drivers/clocksource/timer-vt8500.c
|
||||||
F: drivers/i2c/busses/i2c-wmt.c
|
F: drivers/i2c/busses/i2c-wmt.c
|
||||||
F: drivers/mmc/host/wmt-sdmmc.c
|
F: drivers/mmc/host/wmt-sdmmc.c
|
||||||
F: drivers/pwm/pwm-vt8500.c
|
F: drivers/pwm/pwm-vt8500.c
|
||||||
|
@ -2307,7 +2307,7 @@ F: drivers/cpuidle/cpuidle-zynq.c
|
||||||
F: drivers/block/xsysace.c
|
F: drivers/block/xsysace.c
|
||||||
N: zynq
|
N: zynq
|
||||||
N: xilinx
|
N: xilinx
|
||||||
F: drivers/clocksource/cadence_ttc_timer.c
|
F: drivers/clocksource/timer-cadence-ttc.c
|
||||||
F: drivers/i2c/busses/i2c-cadence.c
|
F: drivers/i2c/busses/i2c-cadence.c
|
||||||
F: drivers/mmc/host/sdhci-of-arasan.c
|
F: drivers/mmc/host/sdhci-of-arasan.c
|
||||||
F: drivers/edac/synopsys_edac.c
|
F: drivers/edac/synopsys_edac.c
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#define NR_SYSCALLS 523
|
#define NR_SYSCALLS 523
|
||||||
|
|
||||||
|
#define __ARCH_WANT_NEW_STAT
|
||||||
#define __ARCH_WANT_OLD_READDIR
|
#define __ARCH_WANT_OLD_READDIR
|
||||||
#define __ARCH_WANT_STAT64
|
#define __ARCH_WANT_STAT64
|
||||||
#define __ARCH_WANT_SYS_GETHOSTNAME
|
#define __ARCH_WANT_SYS_GETHOSTNAME
|
||||||
|
@ -13,6 +14,7 @@
|
||||||
#define __ARCH_WANT_SYS_GETPGRP
|
#define __ARCH_WANT_SYS_GETPGRP
|
||||||
#define __ARCH_WANT_SYS_OLDUMOUNT
|
#define __ARCH_WANT_SYS_OLDUMOUNT
|
||||||
#define __ARCH_WANT_SYS_SIGPENDING
|
#define __ARCH_WANT_SYS_SIGPENDING
|
||||||
|
#define __ARCH_WANT_SYS_UTIME
|
||||||
#define __ARCH_WANT_SYS_FORK
|
#define __ARCH_WANT_SYS_FORK
|
||||||
#define __ARCH_WANT_SYS_VFORK
|
#define __ARCH_WANT_SYS_VFORK
|
||||||
#define __ARCH_WANT_SYS_CLONE
|
#define __ARCH_WANT_SYS_CLONE
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#define _UAPI_ASM_ARC_UNISTD_H
|
#define _UAPI_ASM_ARC_UNISTD_H
|
||||||
|
|
||||||
#define __ARCH_WANT_RENAMEAT
|
#define __ARCH_WANT_RENAMEAT
|
||||||
|
#define __ARCH_WANT_STAT64
|
||||||
#define __ARCH_WANT_SYS_EXECVE
|
#define __ARCH_WANT_SYS_EXECVE
|
||||||
#define __ARCH_WANT_SYS_CLONE
|
#define __ARCH_WANT_SYS_CLONE
|
||||||
#define __ARCH_WANT_SYS_VFORK
|
#define __ARCH_WANT_SYS_VFORK
|
||||||
|
|
|
@ -16,23 +16,23 @@
|
||||||
#include <uapi/asm/unistd.h>
|
#include <uapi/asm/unistd.h>
|
||||||
#include <asm/unistd-nr.h>
|
#include <asm/unistd-nr.h>
|
||||||
|
|
||||||
|
#define __ARCH_WANT_NEW_STAT
|
||||||
#define __ARCH_WANT_STAT64
|
#define __ARCH_WANT_STAT64
|
||||||
#define __ARCH_WANT_SYS_GETHOSTNAME
|
#define __ARCH_WANT_SYS_GETHOSTNAME
|
||||||
#define __ARCH_WANT_SYS_PAUSE
|
#define __ARCH_WANT_SYS_PAUSE
|
||||||
#define __ARCH_WANT_SYS_GETPGRP
|
#define __ARCH_WANT_SYS_GETPGRP
|
||||||
#define __ARCH_WANT_SYS_LLSEEK
|
|
||||||
#define __ARCH_WANT_SYS_NICE
|
#define __ARCH_WANT_SYS_NICE
|
||||||
#define __ARCH_WANT_SYS_SIGPENDING
|
#define __ARCH_WANT_SYS_SIGPENDING
|
||||||
#define __ARCH_WANT_SYS_SIGPROCMASK
|
#define __ARCH_WANT_SYS_SIGPROCMASK
|
||||||
#define __ARCH_WANT_SYS_OLD_MMAP
|
#define __ARCH_WANT_SYS_OLD_MMAP
|
||||||
#define __ARCH_WANT_SYS_OLD_SELECT
|
#define __ARCH_WANT_SYS_OLD_SELECT
|
||||||
|
#define __ARCH_WANT_SYS_UTIME
|
||||||
|
|
||||||
#if !defined(CONFIG_AEABI) || defined(CONFIG_OABI_COMPAT)
|
#if !defined(CONFIG_AEABI) || defined(CONFIG_OABI_COMPAT)
|
||||||
#define __ARCH_WANT_SYS_TIME
|
#define __ARCH_WANT_SYS_TIME
|
||||||
#define __ARCH_WANT_SYS_IPC
|
#define __ARCH_WANT_SYS_IPC
|
||||||
#define __ARCH_WANT_SYS_OLDUMOUNT
|
#define __ARCH_WANT_SYS_OLDUMOUNT
|
||||||
#define __ARCH_WANT_SYS_ALARM
|
#define __ARCH_WANT_SYS_ALARM
|
||||||
#define __ARCH_WANT_SYS_UTIME
|
|
||||||
#define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
#define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
||||||
#define __ARCH_WANT_OLD_READDIR
|
#define __ARCH_WANT_OLD_READDIR
|
||||||
#define __ARCH_WANT_SYS_SOCKETCALL
|
#define __ARCH_WANT_SYS_SOCKETCALL
|
||||||
|
|
|
@ -25,6 +25,8 @@
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/sched/task_stack.h>
|
#include <linux/sched/task_stack.h>
|
||||||
|
|
||||||
|
#include <asm-generic/compat.h>
|
||||||
|
|
||||||
#define COMPAT_USER_HZ 100
|
#define COMPAT_USER_HZ 100
|
||||||
#ifdef __AARCH64EB__
|
#ifdef __AARCH64EB__
|
||||||
#define COMPAT_UTS_MACHINE "armv8b\0\0"
|
#define COMPAT_UTS_MACHINE "armv8b\0\0"
|
||||||
|
@ -32,10 +34,6 @@
|
||||||
#define COMPAT_UTS_MACHINE "armv8l\0\0"
|
#define COMPAT_UTS_MACHINE "armv8l\0\0"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef u32 compat_size_t;
|
|
||||||
typedef s32 compat_ssize_t;
|
|
||||||
typedef s32 compat_clock_t;
|
|
||||||
typedef s32 compat_pid_t;
|
|
||||||
typedef u16 __compat_uid_t;
|
typedef u16 __compat_uid_t;
|
||||||
typedef u16 __compat_gid_t;
|
typedef u16 __compat_gid_t;
|
||||||
typedef u16 __compat_uid16_t;
|
typedef u16 __compat_uid16_t;
|
||||||
|
@ -43,27 +41,13 @@ typedef u16 __compat_gid16_t;
|
||||||
typedef u32 __compat_uid32_t;
|
typedef u32 __compat_uid32_t;
|
||||||
typedef u32 __compat_gid32_t;
|
typedef u32 __compat_gid32_t;
|
||||||
typedef u16 compat_mode_t;
|
typedef u16 compat_mode_t;
|
||||||
typedef u32 compat_ino_t;
|
|
||||||
typedef u32 compat_dev_t;
|
typedef u32 compat_dev_t;
|
||||||
typedef s32 compat_off_t;
|
|
||||||
typedef s64 compat_loff_t;
|
|
||||||
typedef s32 compat_nlink_t;
|
typedef s32 compat_nlink_t;
|
||||||
typedef u16 compat_ipc_pid_t;
|
typedef u16 compat_ipc_pid_t;
|
||||||
typedef s32 compat_daddr_t;
|
|
||||||
typedef u32 compat_caddr_t;
|
typedef u32 compat_caddr_t;
|
||||||
typedef __kernel_fsid_t compat_fsid_t;
|
typedef __kernel_fsid_t compat_fsid_t;
|
||||||
typedef s32 compat_key_t;
|
|
||||||
typedef s32 compat_timer_t;
|
|
||||||
|
|
||||||
typedef s16 compat_short_t;
|
|
||||||
typedef s32 compat_int_t;
|
|
||||||
typedef s32 compat_long_t;
|
|
||||||
typedef s64 compat_s64;
|
typedef s64 compat_s64;
|
||||||
typedef u16 compat_ushort_t;
|
|
||||||
typedef u32 compat_uint_t;
|
|
||||||
typedef u32 compat_ulong_t;
|
|
||||||
typedef u64 compat_u64;
|
typedef u64 compat_u64;
|
||||||
typedef u32 compat_uptr_t;
|
|
||||||
|
|
||||||
struct compat_stat {
|
struct compat_stat {
|
||||||
#ifdef __AARCH64EB__
|
#ifdef __AARCH64EB__
|
||||||
|
@ -86,11 +70,11 @@ struct compat_stat {
|
||||||
compat_off_t st_size;
|
compat_off_t st_size;
|
||||||
compat_off_t st_blksize;
|
compat_off_t st_blksize;
|
||||||
compat_off_t st_blocks;
|
compat_off_t st_blocks;
|
||||||
compat_time_t st_atime;
|
old_time32_t st_atime;
|
||||||
compat_ulong_t st_atime_nsec;
|
compat_ulong_t st_atime_nsec;
|
||||||
compat_time_t st_mtime;
|
old_time32_t st_mtime;
|
||||||
compat_ulong_t st_mtime_nsec;
|
compat_ulong_t st_mtime_nsec;
|
||||||
compat_time_t st_ctime;
|
old_time32_t st_ctime;
|
||||||
compat_ulong_t st_ctime_nsec;
|
compat_ulong_t st_ctime_nsec;
|
||||||
compat_ulong_t __unused4[2];
|
compat_ulong_t __unused4[2];
|
||||||
};
|
};
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
|
|
||||||
#include <linux/compat_time.h>
|
#include <linux/time.h>
|
||||||
#include <asm/compat.h>
|
#include <asm/compat.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -18,11 +18,11 @@
|
||||||
#define __ARCH_WANT_SYS_GETHOSTNAME
|
#define __ARCH_WANT_SYS_GETHOSTNAME
|
||||||
#define __ARCH_WANT_SYS_PAUSE
|
#define __ARCH_WANT_SYS_PAUSE
|
||||||
#define __ARCH_WANT_SYS_GETPGRP
|
#define __ARCH_WANT_SYS_GETPGRP
|
||||||
#define __ARCH_WANT_SYS_LLSEEK
|
|
||||||
#define __ARCH_WANT_SYS_NICE
|
#define __ARCH_WANT_SYS_NICE
|
||||||
#define __ARCH_WANT_SYS_SIGPENDING
|
#define __ARCH_WANT_SYS_SIGPENDING
|
||||||
#define __ARCH_WANT_SYS_SIGPROCMASK
|
#define __ARCH_WANT_SYS_SIGPROCMASK
|
||||||
#define __ARCH_WANT_COMPAT_SYS_SENDFILE
|
#define __ARCH_WANT_COMPAT_SYS_SENDFILE
|
||||||
|
#define __ARCH_WANT_SYS_UTIME32
|
||||||
#define __ARCH_WANT_SYS_FORK
|
#define __ARCH_WANT_SYS_FORK
|
||||||
#define __ARCH_WANT_SYS_VFORK
|
#define __ARCH_WANT_SYS_VFORK
|
||||||
|
|
||||||
|
|
|
@ -16,5 +16,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define __ARCH_WANT_RENAMEAT
|
#define __ARCH_WANT_RENAMEAT
|
||||||
|
#define __ARCH_WANT_NEW_STAT
|
||||||
|
|
||||||
#include <asm-generic/unistd.h>
|
#include <asm-generic/unistd.h>
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define __ARCH_WANT_RENAMEAT
|
#define __ARCH_WANT_RENAMEAT
|
||||||
|
#define __ARCH_WANT_STAT64
|
||||||
#define __ARCH_WANT_SYS_CLONE
|
#define __ARCH_WANT_SYS_CLONE
|
||||||
|
|
||||||
/* Use the standard ABI for syscalls. */
|
/* Use the standard ABI for syscalls. */
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#define __ARCH_NOMMU
|
#define __ARCH_NOMMU
|
||||||
|
|
||||||
#define __ARCH_WANT_RENAMEAT
|
#define __ARCH_WANT_RENAMEAT
|
||||||
|
#define __ARCH_WANT_STAT64
|
||||||
|
|
||||||
#include <asm-generic/unistd.h>
|
#include <asm-generic/unistd.h>
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
|
|
||||||
#define sys_mmap2 sys_mmap_pgoff
|
#define sys_mmap2 sys_mmap_pgoff
|
||||||
#define __ARCH_WANT_RENAMEAT
|
#define __ARCH_WANT_RENAMEAT
|
||||||
|
#define __ARCH_WANT_STAT64
|
||||||
#define __ARCH_WANT_SYS_EXECVE
|
#define __ARCH_WANT_SYS_EXECVE
|
||||||
#define __ARCH_WANT_SYS_CLONE
|
#define __ARCH_WANT_SYS_CLONE
|
||||||
#define __ARCH_WANT_SYS_VFORK
|
#define __ARCH_WANT_SYS_VFORK
|
||||||
|
|
|
@ -28,6 +28,9 @@
|
||||||
#define __IGNORE_vfork /* clone() */
|
#define __IGNORE_vfork /* clone() */
|
||||||
#define __IGNORE_umount2 /* umount() */
|
#define __IGNORE_umount2 /* umount() */
|
||||||
|
|
||||||
|
#define __ARCH_WANT_NEW_STAT
|
||||||
|
#define __ARCH_WANT_SYS_UTIME
|
||||||
|
|
||||||
#if !defined(__ASSEMBLY__) && !defined(ASSEMBLER)
|
#if !defined(__ASSEMBLY__) && !defined(ASSEMBLER)
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
#define NR_syscalls 380
|
#define NR_syscalls 380
|
||||||
|
|
||||||
|
#define __ARCH_WANT_NEW_STAT
|
||||||
#define __ARCH_WANT_OLD_READDIR
|
#define __ARCH_WANT_OLD_READDIR
|
||||||
#define __ARCH_WANT_OLD_STAT
|
#define __ARCH_WANT_OLD_STAT
|
||||||
#define __ARCH_WANT_STAT64
|
#define __ARCH_WANT_STAT64
|
||||||
|
@ -21,7 +22,6 @@
|
||||||
#define __ARCH_WANT_SYS_SOCKETCALL
|
#define __ARCH_WANT_SYS_SOCKETCALL
|
||||||
#define __ARCH_WANT_SYS_FADVISE64
|
#define __ARCH_WANT_SYS_FADVISE64
|
||||||
#define __ARCH_WANT_SYS_GETPGRP
|
#define __ARCH_WANT_SYS_GETPGRP
|
||||||
#define __ARCH_WANT_SYS_LLSEEK
|
|
||||||
#define __ARCH_WANT_SYS_NICE
|
#define __ARCH_WANT_SYS_NICE
|
||||||
#define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
#define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
||||||
#define __ARCH_WANT_SYS_OLD_MMAP
|
#define __ARCH_WANT_SYS_OLD_MMAP
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
/* #define __ARCH_WANT_OLD_READDIR */
|
/* #define __ARCH_WANT_OLD_READDIR */
|
||||||
/* #define __ARCH_WANT_OLD_STAT */
|
/* #define __ARCH_WANT_OLD_STAT */
|
||||||
|
#define __ARCH_WANT_NEW_STAT
|
||||||
#define __ARCH_WANT_STAT64
|
#define __ARCH_WANT_STAT64
|
||||||
#define __ARCH_WANT_SYS_ALARM
|
#define __ARCH_WANT_SYS_ALARM
|
||||||
#define __ARCH_WANT_SYS_GETHOSTNAME
|
#define __ARCH_WANT_SYS_GETHOSTNAME
|
||||||
|
@ -26,7 +27,6 @@
|
||||||
#define __ARCH_WANT_SYS_SOCKETCALL
|
#define __ARCH_WANT_SYS_SOCKETCALL
|
||||||
#define __ARCH_WANT_SYS_FADVISE64
|
#define __ARCH_WANT_SYS_FADVISE64
|
||||||
#define __ARCH_WANT_SYS_GETPGRP
|
#define __ARCH_WANT_SYS_GETPGRP
|
||||||
#define __ARCH_WANT_SYS_LLSEEK
|
|
||||||
#define __ARCH_WANT_SYS_NICE
|
#define __ARCH_WANT_SYS_NICE
|
||||||
/* #define __ARCH_WANT_SYS_OLD_GETRLIMIT */
|
/* #define __ARCH_WANT_SYS_OLD_GETRLIMIT */
|
||||||
#define __ARCH_WANT_SYS_OLDUMOUNT
|
#define __ARCH_WANT_SYS_OLDUMOUNT
|
||||||
|
|
|
@ -9,43 +9,25 @@
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
|
|
||||||
|
#include <asm-generic/compat.h>
|
||||||
|
|
||||||
#define COMPAT_USER_HZ 100
|
#define COMPAT_USER_HZ 100
|
||||||
#define COMPAT_UTS_MACHINE "mips\0\0\0"
|
#define COMPAT_UTS_MACHINE "mips\0\0\0"
|
||||||
|
|
||||||
typedef u32 compat_size_t;
|
|
||||||
typedef s32 compat_ssize_t;
|
|
||||||
typedef s32 compat_clock_t;
|
|
||||||
typedef s32 compat_suseconds_t;
|
|
||||||
|
|
||||||
typedef s32 compat_pid_t;
|
|
||||||
typedef s32 __compat_uid_t;
|
typedef s32 __compat_uid_t;
|
||||||
typedef s32 __compat_gid_t;
|
typedef s32 __compat_gid_t;
|
||||||
typedef __compat_uid_t __compat_uid32_t;
|
typedef __compat_uid_t __compat_uid32_t;
|
||||||
typedef __compat_gid_t __compat_gid32_t;
|
typedef __compat_gid_t __compat_gid32_t;
|
||||||
typedef u32 compat_mode_t;
|
typedef u32 compat_mode_t;
|
||||||
typedef u32 compat_ino_t;
|
|
||||||
typedef u32 compat_dev_t;
|
typedef u32 compat_dev_t;
|
||||||
typedef s32 compat_off_t;
|
|
||||||
typedef s64 compat_loff_t;
|
|
||||||
typedef u32 compat_nlink_t;
|
typedef u32 compat_nlink_t;
|
||||||
typedef s32 compat_ipc_pid_t;
|
typedef s32 compat_ipc_pid_t;
|
||||||
typedef s32 compat_daddr_t;
|
|
||||||
typedef s32 compat_caddr_t;
|
typedef s32 compat_caddr_t;
|
||||||
typedef struct {
|
typedef struct {
|
||||||
s32 val[2];
|
s32 val[2];
|
||||||
} compat_fsid_t;
|
} compat_fsid_t;
|
||||||
typedef s32 compat_timer_t;
|
|
||||||
typedef s32 compat_key_t;
|
|
||||||
|
|
||||||
typedef s16 compat_short_t;
|
|
||||||
typedef s32 compat_int_t;
|
|
||||||
typedef s32 compat_long_t;
|
|
||||||
typedef s64 compat_s64;
|
typedef s64 compat_s64;
|
||||||
typedef u16 compat_ushort_t;
|
|
||||||
typedef u32 compat_uint_t;
|
|
||||||
typedef u32 compat_ulong_t;
|
|
||||||
typedef u64 compat_u64;
|
typedef u64 compat_u64;
|
||||||
typedef u32 compat_uptr_t;
|
|
||||||
|
|
||||||
struct compat_stat {
|
struct compat_stat {
|
||||||
compat_dev_t st_dev;
|
compat_dev_t st_dev;
|
||||||
|
@ -59,11 +41,11 @@ struct compat_stat {
|
||||||
s32 st_pad2[2];
|
s32 st_pad2[2];
|
||||||
compat_off_t st_size;
|
compat_off_t st_size;
|
||||||
s32 st_pad3;
|
s32 st_pad3;
|
||||||
compat_time_t st_atime;
|
old_time32_t st_atime;
|
||||||
s32 st_atime_nsec;
|
s32 st_atime_nsec;
|
||||||
compat_time_t st_mtime;
|
old_time32_t st_mtime;
|
||||||
s32 st_mtime_nsec;
|
s32 st_mtime_nsec;
|
||||||
compat_time_t st_ctime;
|
old_time32_t st_ctime;
|
||||||
s32 st_ctime_nsec;
|
s32 st_ctime_nsec;
|
||||||
s32 st_blksize;
|
s32 st_blksize;
|
||||||
s32 st_blocks;
|
s32 st_blocks;
|
||||||
|
|
|
@ -24,16 +24,17 @@
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
#define __ARCH_WANT_NEW_STAT
|
||||||
#define __ARCH_WANT_OLD_READDIR
|
#define __ARCH_WANT_OLD_READDIR
|
||||||
#define __ARCH_WANT_SYS_ALARM
|
#define __ARCH_WANT_SYS_ALARM
|
||||||
#define __ARCH_WANT_SYS_GETHOSTNAME
|
#define __ARCH_WANT_SYS_GETHOSTNAME
|
||||||
#define __ARCH_WANT_SYS_IPC
|
#define __ARCH_WANT_SYS_IPC
|
||||||
#define __ARCH_WANT_SYS_PAUSE
|
#define __ARCH_WANT_SYS_PAUSE
|
||||||
#define __ARCH_WANT_SYS_UTIME
|
#define __ARCH_WANT_SYS_UTIME
|
||||||
|
#define __ARCH_WANT_SYS_UTIME32
|
||||||
#define __ARCH_WANT_SYS_WAITPID
|
#define __ARCH_WANT_SYS_WAITPID
|
||||||
#define __ARCH_WANT_SYS_SOCKETCALL
|
#define __ARCH_WANT_SYS_SOCKETCALL
|
||||||
#define __ARCH_WANT_SYS_GETPGRP
|
#define __ARCH_WANT_SYS_GETPGRP
|
||||||
#define __ARCH_WANT_SYS_LLSEEK
|
|
||||||
#define __ARCH_WANT_SYS_NICE
|
#define __ARCH_WANT_SYS_NICE
|
||||||
#define __ARCH_WANT_SYS_OLD_UNAME
|
#define __ARCH_WANT_SYS_OLD_UNAME
|
||||||
#define __ARCH_WANT_SYS_OLDUMOUNT
|
#define __ARCH_WANT_SYS_OLDUMOUNT
|
||||||
|
|
|
@ -54,10 +54,10 @@ struct elf_prstatus32
|
||||||
pid_t pr_ppid;
|
pid_t pr_ppid;
|
||||||
pid_t pr_pgrp;
|
pid_t pr_pgrp;
|
||||||
pid_t pr_sid;
|
pid_t pr_sid;
|
||||||
struct compat_timeval pr_utime; /* User time */
|
struct old_timeval32 pr_utime; /* User time */
|
||||||
struct compat_timeval pr_stime; /* System time */
|
struct old_timeval32 pr_stime; /* System time */
|
||||||
struct compat_timeval pr_cutime;/* Cumulative user time */
|
struct old_timeval32 pr_cutime;/* Cumulative user time */
|
||||||
struct compat_timeval pr_cstime;/* Cumulative system time */
|
struct old_timeval32 pr_cstime;/* Cumulative system time */
|
||||||
elf_gregset_t pr_reg; /* GP registers */
|
elf_gregset_t pr_reg; /* GP registers */
|
||||||
int pr_fpvalid; /* True if math co-processor being used. */
|
int pr_fpvalid; /* True if math co-processor being used. */
|
||||||
};
|
};
|
||||||
|
@ -81,9 +81,9 @@ struct elf_prpsinfo32
|
||||||
#define elf_caddr_t u32
|
#define elf_caddr_t u32
|
||||||
#define init_elf_binfmt init_elfn32_binfmt
|
#define init_elf_binfmt init_elfn32_binfmt
|
||||||
|
|
||||||
#define jiffies_to_timeval jiffies_to_compat_timeval
|
#define jiffies_to_timeval jiffies_to_old_timeval32
|
||||||
static __inline__ void
|
static __inline__ void
|
||||||
jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value)
|
jiffies_to_old_timeval32(unsigned long jiffies, struct old_timeval32 *value)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Convert jiffies to nanoseconds and separate with
|
* Convert jiffies to nanoseconds and separate with
|
||||||
|
@ -101,6 +101,6 @@ jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value)
|
||||||
#define TASK_SIZE TASK_SIZE32
|
#define TASK_SIZE TASK_SIZE32
|
||||||
|
|
||||||
#undef ns_to_timeval
|
#undef ns_to_timeval
|
||||||
#define ns_to_timeval ns_to_compat_timeval
|
#define ns_to_timeval ns_to_old_timeval32
|
||||||
|
|
||||||
#include "../../../fs/binfmt_elf.c"
|
#include "../../../fs/binfmt_elf.c"
|
||||||
|
|
|
@ -59,10 +59,10 @@ struct elf_prstatus32
|
||||||
pid_t pr_ppid;
|
pid_t pr_ppid;
|
||||||
pid_t pr_pgrp;
|
pid_t pr_pgrp;
|
||||||
pid_t pr_sid;
|
pid_t pr_sid;
|
||||||
struct compat_timeval pr_utime; /* User time */
|
struct old_timeval32 pr_utime; /* User time */
|
||||||
struct compat_timeval pr_stime; /* System time */
|
struct old_timeval32 pr_stime; /* System time */
|
||||||
struct compat_timeval pr_cutime;/* Cumulative user time */
|
struct old_timeval32 pr_cutime;/* Cumulative user time */
|
||||||
struct compat_timeval pr_cstime;/* Cumulative system time */
|
struct old_timeval32 pr_cstime;/* Cumulative system time */
|
||||||
elf_gregset_t pr_reg; /* GP registers */
|
elf_gregset_t pr_reg; /* GP registers */
|
||||||
int pr_fpvalid; /* True if math co-processor being used. */
|
int pr_fpvalid; /* True if math co-processor being used. */
|
||||||
};
|
};
|
||||||
|
@ -86,9 +86,9 @@ struct elf_prpsinfo32
|
||||||
#define elf_caddr_t u32
|
#define elf_caddr_t u32
|
||||||
#define init_elf_binfmt init_elf32_binfmt
|
#define init_elf_binfmt init_elf32_binfmt
|
||||||
|
|
||||||
#define jiffies_to_timeval jiffies_to_compat_timeval
|
#define jiffies_to_timeval jiffies_to_old_timeval32
|
||||||
static inline void
|
static inline void
|
||||||
jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value)
|
jiffies_to_old_timeval32(unsigned long jiffies, struct old_timeval32 *value)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Convert jiffies to nanoseconds and separate with
|
* Convert jiffies to nanoseconds and separate with
|
||||||
|
@ -104,6 +104,6 @@ jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value)
|
||||||
#define TASK_SIZE TASK_SIZE32
|
#define TASK_SIZE TASK_SIZE32
|
||||||
|
|
||||||
#undef ns_to_timeval
|
#undef ns_to_timeval
|
||||||
#define ns_to_timeval ns_to_compat_timeval
|
#define ns_to_timeval ns_to_old_timeval32
|
||||||
|
|
||||||
#include "../../../fs/binfmt_elf.c"
|
#include "../../../fs/binfmt_elf.c"
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
// SPDX-License-Identifier: GPL-2.0
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
// Copyright (C) 2005-2017 Andes Technology Corporation
|
// Copyright (C) 2005-2017 Andes Technology Corporation
|
||||||
|
|
||||||
|
#define __ARCH_WANT_STAT64
|
||||||
#define __ARCH_WANT_SYNC_FILE_RANGE2
|
#define __ARCH_WANT_SYNC_FILE_RANGE2
|
||||||
|
|
||||||
/* Use the standard ABI for syscalls */
|
/* Use the standard ABI for syscalls */
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#define sys_mmap2 sys_mmap_pgoff
|
#define sys_mmap2 sys_mmap_pgoff
|
||||||
|
|
||||||
#define __ARCH_WANT_RENAMEAT
|
#define __ARCH_WANT_RENAMEAT
|
||||||
|
#define __ARCH_WANT_STAT64
|
||||||
|
|
||||||
/* Use the standard ABI for syscalls */
|
/* Use the standard ABI for syscalls */
|
||||||
#include <asm-generic/unistd.h>
|
#include <asm-generic/unistd.h>
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#define sys_mmap2 sys_mmap_pgoff
|
#define sys_mmap2 sys_mmap_pgoff
|
||||||
|
|
||||||
#define __ARCH_WANT_RENAMEAT
|
#define __ARCH_WANT_RENAMEAT
|
||||||
|
#define __ARCH_WANT_STAT64
|
||||||
#define __ARCH_WANT_SYS_FORK
|
#define __ARCH_WANT_SYS_FORK
|
||||||
#define __ARCH_WANT_SYS_CLONE
|
#define __ARCH_WANT_SYS_CLONE
|
||||||
|
|
||||||
|
|
|
@ -8,36 +8,22 @@
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/thread_info.h>
|
#include <linux/thread_info.h>
|
||||||
|
|
||||||
|
#include <asm-generic/compat.h>
|
||||||
|
|
||||||
#define COMPAT_USER_HZ 100
|
#define COMPAT_USER_HZ 100
|
||||||
#define COMPAT_UTS_MACHINE "parisc\0\0"
|
#define COMPAT_UTS_MACHINE "parisc\0\0"
|
||||||
|
|
||||||
typedef u32 compat_size_t;
|
|
||||||
typedef s32 compat_ssize_t;
|
|
||||||
typedef s32 compat_clock_t;
|
|
||||||
typedef s32 compat_pid_t;
|
|
||||||
typedef u32 __compat_uid_t;
|
typedef u32 __compat_uid_t;
|
||||||
typedef u32 __compat_gid_t;
|
typedef u32 __compat_gid_t;
|
||||||
typedef u32 __compat_uid32_t;
|
typedef u32 __compat_uid32_t;
|
||||||
typedef u32 __compat_gid32_t;
|
typedef u32 __compat_gid32_t;
|
||||||
typedef u16 compat_mode_t;
|
typedef u16 compat_mode_t;
|
||||||
typedef u32 compat_ino_t;
|
|
||||||
typedef u32 compat_dev_t;
|
typedef u32 compat_dev_t;
|
||||||
typedef s32 compat_off_t;
|
|
||||||
typedef s64 compat_loff_t;
|
|
||||||
typedef u16 compat_nlink_t;
|
typedef u16 compat_nlink_t;
|
||||||
typedef u16 compat_ipc_pid_t;
|
typedef u16 compat_ipc_pid_t;
|
||||||
typedef s32 compat_daddr_t;
|
|
||||||
typedef u32 compat_caddr_t;
|
typedef u32 compat_caddr_t;
|
||||||
typedef s32 compat_key_t;
|
|
||||||
typedef s32 compat_timer_t;
|
|
||||||
|
|
||||||
typedef s32 compat_int_t;
|
|
||||||
typedef s32 compat_long_t;
|
|
||||||
typedef s64 compat_s64;
|
typedef s64 compat_s64;
|
||||||
typedef u32 compat_uint_t;
|
|
||||||
typedef u32 compat_ulong_t;
|
|
||||||
typedef u64 compat_u64;
|
typedef u64 compat_u64;
|
||||||
typedef u32 compat_uptr_t;
|
|
||||||
|
|
||||||
struct compat_stat {
|
struct compat_stat {
|
||||||
compat_dev_t st_dev; /* dev_t is 32 bits on parisc */
|
compat_dev_t st_dev; /* dev_t is 32 bits on parisc */
|
||||||
|
@ -48,11 +34,11 @@ struct compat_stat {
|
||||||
u16 st_reserved2; /* old st_gid */
|
u16 st_reserved2; /* old st_gid */
|
||||||
compat_dev_t st_rdev;
|
compat_dev_t st_rdev;
|
||||||
compat_off_t st_size;
|
compat_off_t st_size;
|
||||||
compat_time_t st_atime;
|
old_time32_t st_atime;
|
||||||
u32 st_atime_nsec;
|
u32 st_atime_nsec;
|
||||||
compat_time_t st_mtime;
|
old_time32_t st_mtime;
|
||||||
u32 st_mtime_nsec;
|
u32 st_mtime_nsec;
|
||||||
compat_time_t st_ctime;
|
old_time32_t st_ctime;
|
||||||
u32 st_ctime_nsec;
|
u32 st_ctime_nsec;
|
||||||
s32 st_blksize;
|
s32 st_blksize;
|
||||||
s32 st_blocks;
|
s32 st_blocks;
|
||||||
|
|
|
@ -141,6 +141,7 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
|
||||||
return K_INLINE_SYSCALL(name, 5, arg1, arg2, arg3, arg4, arg5); \
|
return K_INLINE_SYSCALL(name, 5, arg1, arg2, arg3, arg4, arg5); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define __ARCH_WANT_NEW_STAT
|
||||||
#define __ARCH_WANT_OLD_READDIR
|
#define __ARCH_WANT_OLD_READDIR
|
||||||
#define __ARCH_WANT_STAT64
|
#define __ARCH_WANT_STAT64
|
||||||
#define __ARCH_WANT_SYS_ALARM
|
#define __ARCH_WANT_SYS_ALARM
|
||||||
|
@ -151,11 +152,11 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
|
||||||
#define __ARCH_WANT_COMPAT_SYS_TIME
|
#define __ARCH_WANT_COMPAT_SYS_TIME
|
||||||
#define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL
|
#define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL
|
||||||
#define __ARCH_WANT_SYS_UTIME
|
#define __ARCH_WANT_SYS_UTIME
|
||||||
|
#define __ARCH_WANT_SYS_UTIME32
|
||||||
#define __ARCH_WANT_SYS_WAITPID
|
#define __ARCH_WANT_SYS_WAITPID
|
||||||
#define __ARCH_WANT_SYS_SOCKETCALL
|
#define __ARCH_WANT_SYS_SOCKETCALL
|
||||||
#define __ARCH_WANT_SYS_FADVISE64
|
#define __ARCH_WANT_SYS_FADVISE64
|
||||||
#define __ARCH_WANT_SYS_GETPGRP
|
#define __ARCH_WANT_SYS_GETPGRP
|
||||||
#define __ARCH_WANT_SYS_LLSEEK
|
|
||||||
#define __ARCH_WANT_SYS_NICE
|
#define __ARCH_WANT_SYS_NICE
|
||||||
#define __ARCH_WANT_SYS_OLDUMOUNT
|
#define __ARCH_WANT_SYS_OLDUMOUNT
|
||||||
#define __ARCH_WANT_SYS_SIGPENDING
|
#define __ARCH_WANT_SYS_SIGPENDING
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
|
||||||
|
#include <asm-generic/compat.h>
|
||||||
|
|
||||||
#define COMPAT_USER_HZ 100
|
#define COMPAT_USER_HZ 100
|
||||||
#ifdef __BIG_ENDIAN__
|
#ifdef __BIG_ENDIAN__
|
||||||
#define COMPAT_UTS_MACHINE "ppc\0\0"
|
#define COMPAT_UTS_MACHINE "ppc\0\0"
|
||||||
|
@ -15,34 +17,18 @@
|
||||||
#define COMPAT_UTS_MACHINE "ppcle\0\0"
|
#define COMPAT_UTS_MACHINE "ppcle\0\0"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef u32 compat_size_t;
|
|
||||||
typedef s32 compat_ssize_t;
|
|
||||||
typedef s32 compat_clock_t;
|
|
||||||
typedef s32 compat_pid_t;
|
|
||||||
typedef u32 __compat_uid_t;
|
typedef u32 __compat_uid_t;
|
||||||
typedef u32 __compat_gid_t;
|
typedef u32 __compat_gid_t;
|
||||||
typedef u32 __compat_uid32_t;
|
typedef u32 __compat_uid32_t;
|
||||||
typedef u32 __compat_gid32_t;
|
typedef u32 __compat_gid32_t;
|
||||||
typedef u32 compat_mode_t;
|
typedef u32 compat_mode_t;
|
||||||
typedef u32 compat_ino_t;
|
|
||||||
typedef u32 compat_dev_t;
|
typedef u32 compat_dev_t;
|
||||||
typedef s32 compat_off_t;
|
|
||||||
typedef s64 compat_loff_t;
|
|
||||||
typedef s16 compat_nlink_t;
|
typedef s16 compat_nlink_t;
|
||||||
typedef u16 compat_ipc_pid_t;
|
typedef u16 compat_ipc_pid_t;
|
||||||
typedef s32 compat_daddr_t;
|
|
||||||
typedef u32 compat_caddr_t;
|
typedef u32 compat_caddr_t;
|
||||||
typedef __kernel_fsid_t compat_fsid_t;
|
typedef __kernel_fsid_t compat_fsid_t;
|
||||||
typedef s32 compat_key_t;
|
|
||||||
typedef s32 compat_timer_t;
|
|
||||||
|
|
||||||
typedef s32 compat_int_t;
|
|
||||||
typedef s32 compat_long_t;
|
|
||||||
typedef s64 compat_s64;
|
typedef s64 compat_s64;
|
||||||
typedef u32 compat_uint_t;
|
|
||||||
typedef u32 compat_ulong_t;
|
|
||||||
typedef u64 compat_u64;
|
typedef u64 compat_u64;
|
||||||
typedef u32 compat_uptr_t;
|
|
||||||
|
|
||||||
struct compat_stat {
|
struct compat_stat {
|
||||||
compat_dev_t st_dev;
|
compat_dev_t st_dev;
|
||||||
|
@ -55,11 +41,11 @@ struct compat_stat {
|
||||||
compat_off_t st_size;
|
compat_off_t st_size;
|
||||||
compat_off_t st_blksize;
|
compat_off_t st_blksize;
|
||||||
compat_off_t st_blocks;
|
compat_off_t st_blocks;
|
||||||
compat_time_t st_atime;
|
old_time32_t st_atime;
|
||||||
u32 st_atime_nsec;
|
u32 st_atime_nsec;
|
||||||
compat_time_t st_mtime;
|
old_time32_t st_mtime;
|
||||||
u32 st_mtime_nsec;
|
u32 st_mtime_nsec;
|
||||||
compat_time_t st_ctime;
|
old_time32_t st_ctime;
|
||||||
u32 st_ctime_nsec;
|
u32 st_ctime_nsec;
|
||||||
u32 __unused4[2];
|
u32 __unused4[2];
|
||||||
};
|
};
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
|
#define __ARCH_WANT_NEW_STAT
|
||||||
#define __ARCH_WANT_OLD_READDIR
|
#define __ARCH_WANT_OLD_READDIR
|
||||||
#define __ARCH_WANT_STAT64
|
#define __ARCH_WANT_STAT64
|
||||||
#define __ARCH_WANT_SYS_ALARM
|
#define __ARCH_WANT_SYS_ALARM
|
||||||
|
@ -35,7 +36,6 @@
|
||||||
#define __ARCH_WANT_SYS_SOCKETCALL
|
#define __ARCH_WANT_SYS_SOCKETCALL
|
||||||
#define __ARCH_WANT_SYS_FADVISE64
|
#define __ARCH_WANT_SYS_FADVISE64
|
||||||
#define __ARCH_WANT_SYS_GETPGRP
|
#define __ARCH_WANT_SYS_GETPGRP
|
||||||
#define __ARCH_WANT_SYS_LLSEEK
|
|
||||||
#define __ARCH_WANT_SYS_NICE
|
#define __ARCH_WANT_SYS_NICE
|
||||||
#define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
#define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
||||||
#define __ARCH_WANT_SYS_OLD_UNAME
|
#define __ARCH_WANT_SYS_OLD_UNAME
|
||||||
|
@ -47,6 +47,7 @@
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_PPC64
|
#ifdef CONFIG_PPC64
|
||||||
#define __ARCH_WANT_COMPAT_SYS_TIME
|
#define __ARCH_WANT_COMPAT_SYS_TIME
|
||||||
|
#define __ARCH_WANT_SYS_UTIME32
|
||||||
#define __ARCH_WANT_SYS_NEWFSTATAT
|
#define __ARCH_WANT_SYS_NEWFSTATAT
|
||||||
#define __ARCH_WANT_COMPAT_SYS_SENDFILE
|
#define __ARCH_WANT_COMPAT_SYS_SENDFILE
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -387,12 +387,12 @@ int main(void)
|
||||||
OFFSET(CFG_SYSCALL_MAP64, vdso_data, syscall_map_64);
|
OFFSET(CFG_SYSCALL_MAP64, vdso_data, syscall_map_64);
|
||||||
OFFSET(TVAL64_TV_SEC, timeval, tv_sec);
|
OFFSET(TVAL64_TV_SEC, timeval, tv_sec);
|
||||||
OFFSET(TVAL64_TV_USEC, timeval, tv_usec);
|
OFFSET(TVAL64_TV_USEC, timeval, tv_usec);
|
||||||
OFFSET(TVAL32_TV_SEC, compat_timeval, tv_sec);
|
OFFSET(TVAL32_TV_SEC, old_timeval32, tv_sec);
|
||||||
OFFSET(TVAL32_TV_USEC, compat_timeval, tv_usec);
|
OFFSET(TVAL32_TV_USEC, old_timeval32, tv_usec);
|
||||||
OFFSET(TSPC64_TV_SEC, timespec, tv_sec);
|
OFFSET(TSPC64_TV_SEC, timespec, tv_sec);
|
||||||
OFFSET(TSPC64_TV_NSEC, timespec, tv_nsec);
|
OFFSET(TSPC64_TV_NSEC, timespec, tv_nsec);
|
||||||
OFFSET(TSPC32_TV_SEC, compat_timespec, tv_sec);
|
OFFSET(TSPC32_TV_SEC, old_timespec32, tv_sec);
|
||||||
OFFSET(TSPC32_TV_NSEC, compat_timespec, tv_nsec);
|
OFFSET(TSPC32_TV_NSEC, old_timespec32, tv_nsec);
|
||||||
#else
|
#else
|
||||||
OFFSET(TVAL32_TV_SEC, timeval, tv_sec);
|
OFFSET(TVAL32_TV_SEC, timeval, tv_sec);
|
||||||
OFFSET(TVAL32_TV_USEC, timeval, tv_usec);
|
OFFSET(TVAL32_TV_USEC, timeval, tv_usec);
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
* 2 of the License, or (at your option) any later version.
|
* 2 of the License, or (at your option) any later version.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#include <linux/compat_time.h>
|
#include <linux/time.h>
|
||||||
#include <linux/oprofile.h>
|
#include <linux/oprofile.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
* be included multiple times. See uapi/asm/syscalls.h for more info.
|
* be included multiple times. See uapi/asm/syscalls.h for more info.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define __ARCH_WANT_NEW_STAT
|
||||||
#define __ARCH_WANT_SYS_CLONE
|
#define __ARCH_WANT_SYS_CLONE
|
||||||
#include <uapi/asm/unistd.h>
|
#include <uapi/asm/unistd.h>
|
||||||
#include <uapi/asm/syscalls.h>
|
#include <uapi/asm/syscalls.h>
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
#include <linux/sched/task_stack.h>
|
#include <linux/sched/task_stack.h>
|
||||||
#include <linux/thread_info.h>
|
#include <linux/thread_info.h>
|
||||||
|
|
||||||
|
#include <asm-generic/compat.h>
|
||||||
|
|
||||||
#define __TYPE_IS_PTR(t) (!__builtin_types_compatible_p( \
|
#define __TYPE_IS_PTR(t) (!__builtin_types_compatible_p( \
|
||||||
typeof(0?(__force t)0:0ULL), u64))
|
typeof(0?(__force t)0:0ULL), u64))
|
||||||
|
|
||||||
|
@ -51,34 +53,18 @@
|
||||||
#define COMPAT_USER_HZ 100
|
#define COMPAT_USER_HZ 100
|
||||||
#define COMPAT_UTS_MACHINE "s390\0\0\0\0"
|
#define COMPAT_UTS_MACHINE "s390\0\0\0\0"
|
||||||
|
|
||||||
typedef u32 compat_size_t;
|
|
||||||
typedef s32 compat_ssize_t;
|
|
||||||
typedef s32 compat_clock_t;
|
|
||||||
typedef s32 compat_pid_t;
|
|
||||||
typedef u16 __compat_uid_t;
|
typedef u16 __compat_uid_t;
|
||||||
typedef u16 __compat_gid_t;
|
typedef u16 __compat_gid_t;
|
||||||
typedef u32 __compat_uid32_t;
|
typedef u32 __compat_uid32_t;
|
||||||
typedef u32 __compat_gid32_t;
|
typedef u32 __compat_gid32_t;
|
||||||
typedef u16 compat_mode_t;
|
typedef u16 compat_mode_t;
|
||||||
typedef u32 compat_ino_t;
|
|
||||||
typedef u16 compat_dev_t;
|
typedef u16 compat_dev_t;
|
||||||
typedef s32 compat_off_t;
|
|
||||||
typedef s64 compat_loff_t;
|
|
||||||
typedef u16 compat_nlink_t;
|
typedef u16 compat_nlink_t;
|
||||||
typedef u16 compat_ipc_pid_t;
|
typedef u16 compat_ipc_pid_t;
|
||||||
typedef s32 compat_daddr_t;
|
|
||||||
typedef u32 compat_caddr_t;
|
typedef u32 compat_caddr_t;
|
||||||
typedef __kernel_fsid_t compat_fsid_t;
|
typedef __kernel_fsid_t compat_fsid_t;
|
||||||
typedef s32 compat_key_t;
|
|
||||||
typedef s32 compat_timer_t;
|
|
||||||
|
|
||||||
typedef s32 compat_int_t;
|
|
||||||
typedef s32 compat_long_t;
|
|
||||||
typedef s64 compat_s64;
|
typedef s64 compat_s64;
|
||||||
typedef u32 compat_uint_t;
|
|
||||||
typedef u32 compat_ulong_t;
|
|
||||||
typedef u64 compat_u64;
|
typedef u64 compat_u64;
|
||||||
typedef u32 compat_uptr_t;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
u32 mask;
|
u32 mask;
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#define __IGNORE_pkey_alloc
|
#define __IGNORE_pkey_alloc
|
||||||
#define __IGNORE_pkey_free
|
#define __IGNORE_pkey_free
|
||||||
|
|
||||||
|
#define __ARCH_WANT_NEW_STAT
|
||||||
#define __ARCH_WANT_OLD_READDIR
|
#define __ARCH_WANT_OLD_READDIR
|
||||||
#define __ARCH_WANT_SYS_ALARM
|
#define __ARCH_WANT_SYS_ALARM
|
||||||
#define __ARCH_WANT_SYS_GETHOSTNAME
|
#define __ARCH_WANT_SYS_GETHOSTNAME
|
||||||
|
@ -25,7 +26,6 @@
|
||||||
#define __ARCH_WANT_SYS_IPC
|
#define __ARCH_WANT_SYS_IPC
|
||||||
#define __ARCH_WANT_SYS_FADVISE64
|
#define __ARCH_WANT_SYS_FADVISE64
|
||||||
#define __ARCH_WANT_SYS_GETPGRP
|
#define __ARCH_WANT_SYS_GETPGRP
|
||||||
#define __ARCH_WANT_SYS_LLSEEK
|
|
||||||
#define __ARCH_WANT_SYS_NICE
|
#define __ARCH_WANT_SYS_NICE
|
||||||
#define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
#define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
||||||
#define __ARCH_WANT_SYS_OLD_MMAP
|
#define __ARCH_WANT_SYS_OLD_MMAP
|
||||||
|
@ -34,6 +34,7 @@
|
||||||
#define __ARCH_WANT_SYS_SIGPROCMASK
|
#define __ARCH_WANT_SYS_SIGPROCMASK
|
||||||
# ifdef CONFIG_COMPAT
|
# ifdef CONFIG_COMPAT
|
||||||
# define __ARCH_WANT_COMPAT_SYS_TIME
|
# define __ARCH_WANT_COMPAT_SYS_TIME
|
||||||
|
# define __ARCH_WANT_SYS_UTIME32
|
||||||
# endif
|
# endif
|
||||||
#define __ARCH_WANT_SYS_FORK
|
#define __ARCH_WANT_SYS_FORK
|
||||||
#define __ARCH_WANT_SYS_VFORK
|
#define __ARCH_WANT_SYS_VFORK
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
# include <asm/unistd_64.h>
|
# include <asm/unistd_64.h>
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# define __ARCH_WANT_NEW_STAT
|
||||||
# define __ARCH_WANT_OLD_READDIR
|
# define __ARCH_WANT_OLD_READDIR
|
||||||
# define __ARCH_WANT_OLD_STAT
|
# define __ARCH_WANT_OLD_STAT
|
||||||
# define __ARCH_WANT_STAT64
|
# define __ARCH_WANT_STAT64
|
||||||
|
@ -19,7 +20,6 @@
|
||||||
# define __ARCH_WANT_SYS_SOCKETCALL
|
# define __ARCH_WANT_SYS_SOCKETCALL
|
||||||
# define __ARCH_WANT_SYS_FADVISE64
|
# define __ARCH_WANT_SYS_FADVISE64
|
||||||
# define __ARCH_WANT_SYS_GETPGRP
|
# define __ARCH_WANT_SYS_GETPGRP
|
||||||
# define __ARCH_WANT_SYS_LLSEEK
|
|
||||||
# define __ARCH_WANT_SYS_NICE
|
# define __ARCH_WANT_SYS_NICE
|
||||||
# define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
# define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
||||||
# define __ARCH_WANT_SYS_OLD_UNAME
|
# define __ARCH_WANT_SYS_OLD_UNAME
|
||||||
|
|
|
@ -6,38 +6,23 @@
|
||||||
*/
|
*/
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
#include <asm-generic/compat.h>
|
||||||
|
|
||||||
#define COMPAT_USER_HZ 100
|
#define COMPAT_USER_HZ 100
|
||||||
#define COMPAT_UTS_MACHINE "sparc\0\0"
|
#define COMPAT_UTS_MACHINE "sparc\0\0"
|
||||||
|
|
||||||
typedef u32 compat_size_t;
|
|
||||||
typedef s32 compat_ssize_t;
|
|
||||||
typedef s32 compat_clock_t;
|
|
||||||
typedef s32 compat_pid_t;
|
|
||||||
typedef u16 __compat_uid_t;
|
typedef u16 __compat_uid_t;
|
||||||
typedef u16 __compat_gid_t;
|
typedef u16 __compat_gid_t;
|
||||||
typedef u32 __compat_uid32_t;
|
typedef u32 __compat_uid32_t;
|
||||||
typedef u32 __compat_gid32_t;
|
typedef u32 __compat_gid32_t;
|
||||||
typedef u16 compat_mode_t;
|
typedef u16 compat_mode_t;
|
||||||
typedef u32 compat_ino_t;
|
|
||||||
typedef u16 compat_dev_t;
|
typedef u16 compat_dev_t;
|
||||||
typedef s32 compat_off_t;
|
|
||||||
typedef s64 compat_loff_t;
|
|
||||||
typedef s16 compat_nlink_t;
|
typedef s16 compat_nlink_t;
|
||||||
typedef u16 compat_ipc_pid_t;
|
typedef u16 compat_ipc_pid_t;
|
||||||
typedef s32 compat_daddr_t;
|
|
||||||
typedef u32 compat_caddr_t;
|
typedef u32 compat_caddr_t;
|
||||||
typedef __kernel_fsid_t compat_fsid_t;
|
typedef __kernel_fsid_t compat_fsid_t;
|
||||||
typedef s32 compat_key_t;
|
|
||||||
typedef s32 compat_timer_t;
|
|
||||||
|
|
||||||
typedef s32 compat_int_t;
|
|
||||||
typedef s32 compat_long_t;
|
|
||||||
typedef s64 compat_s64;
|
typedef s64 compat_s64;
|
||||||
typedef u32 compat_uint_t;
|
|
||||||
typedef u32 compat_ulong_t;
|
|
||||||
typedef u64 compat_u64;
|
typedef u64 compat_u64;
|
||||||
typedef u32 compat_uptr_t;
|
|
||||||
|
|
||||||
struct compat_stat {
|
struct compat_stat {
|
||||||
compat_dev_t st_dev;
|
compat_dev_t st_dev;
|
||||||
compat_ino_t st_ino;
|
compat_ino_t st_ino;
|
||||||
|
@ -47,11 +32,11 @@ struct compat_stat {
|
||||||
__compat_gid_t st_gid;
|
__compat_gid_t st_gid;
|
||||||
compat_dev_t st_rdev;
|
compat_dev_t st_rdev;
|
||||||
compat_off_t st_size;
|
compat_off_t st_size;
|
||||||
compat_time_t st_atime;
|
old_time32_t st_atime;
|
||||||
compat_ulong_t st_atime_nsec;
|
compat_ulong_t st_atime_nsec;
|
||||||
compat_time_t st_mtime;
|
old_time32_t st_mtime;
|
||||||
compat_ulong_t st_mtime_nsec;
|
compat_ulong_t st_mtime_nsec;
|
||||||
compat_time_t st_ctime;
|
old_time32_t st_ctime;
|
||||||
compat_ulong_t st_ctime_nsec;
|
compat_ulong_t st_ctime_nsec;
|
||||||
compat_off_t st_blksize;
|
compat_off_t st_blksize;
|
||||||
compat_off_t st_blocks;
|
compat_off_t st_blocks;
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#else
|
#else
|
||||||
#define __NR_time 231 /* Linux sparc32 */
|
#define __NR_time 231 /* Linux sparc32 */
|
||||||
#endif
|
#endif
|
||||||
|
#define __ARCH_WANT_NEW_STAT
|
||||||
#define __ARCH_WANT_OLD_READDIR
|
#define __ARCH_WANT_OLD_READDIR
|
||||||
#define __ARCH_WANT_STAT64
|
#define __ARCH_WANT_STAT64
|
||||||
#define __ARCH_WANT_SYS_ALARM
|
#define __ARCH_WANT_SYS_ALARM
|
||||||
|
@ -33,7 +34,6 @@
|
||||||
#define __ARCH_WANT_SYS_SOCKETCALL
|
#define __ARCH_WANT_SYS_SOCKETCALL
|
||||||
#define __ARCH_WANT_SYS_FADVISE64
|
#define __ARCH_WANT_SYS_FADVISE64
|
||||||
#define __ARCH_WANT_SYS_GETPGRP
|
#define __ARCH_WANT_SYS_GETPGRP
|
||||||
#define __ARCH_WANT_SYS_LLSEEK
|
|
||||||
#define __ARCH_WANT_SYS_NICE
|
#define __ARCH_WANT_SYS_NICE
|
||||||
#define __ARCH_WANT_SYS_OLDUMOUNT
|
#define __ARCH_WANT_SYS_OLDUMOUNT
|
||||||
#define __ARCH_WANT_SYS_SIGPENDING
|
#define __ARCH_WANT_SYS_SIGPENDING
|
||||||
|
@ -42,6 +42,7 @@
|
||||||
#define __ARCH_WANT_SYS_IPC
|
#define __ARCH_WANT_SYS_IPC
|
||||||
#else
|
#else
|
||||||
#define __ARCH_WANT_COMPAT_SYS_TIME
|
#define __ARCH_WANT_COMPAT_SYS_TIME
|
||||||
|
#define __ARCH_WANT_SYS_UTIME32
|
||||||
#define __ARCH_WANT_COMPAT_SYS_SENDFILE
|
#define __ARCH_WANT_COMPAT_SYS_SENDFILE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -15,4 +15,5 @@
|
||||||
|
|
||||||
/* Use the standard ABI for syscalls. */
|
/* Use the standard ABI for syscalls. */
|
||||||
#include <asm-generic/unistd.h>
|
#include <asm-generic/unistd.h>
|
||||||
|
#define __ARCH_WANT_STAT64
|
||||||
#define __ARCH_WANT_SYS_CLONE
|
#define __ARCH_WANT_SYS_CLONE
|
||||||
|
|
|
@ -12,38 +12,23 @@
|
||||||
#include <asm/user32.h>
|
#include <asm/user32.h>
|
||||||
#include <asm/unistd.h>
|
#include <asm/unistd.h>
|
||||||
|
|
||||||
|
#include <asm-generic/compat.h>
|
||||||
|
|
||||||
#define COMPAT_USER_HZ 100
|
#define COMPAT_USER_HZ 100
|
||||||
#define COMPAT_UTS_MACHINE "i686\0\0"
|
#define COMPAT_UTS_MACHINE "i686\0\0"
|
||||||
|
|
||||||
typedef u32 compat_size_t;
|
|
||||||
typedef s32 compat_ssize_t;
|
|
||||||
typedef s32 compat_clock_t;
|
|
||||||
typedef s32 compat_pid_t;
|
|
||||||
typedef u16 __compat_uid_t;
|
typedef u16 __compat_uid_t;
|
||||||
typedef u16 __compat_gid_t;
|
typedef u16 __compat_gid_t;
|
||||||
typedef u32 __compat_uid32_t;
|
typedef u32 __compat_uid32_t;
|
||||||
typedef u32 __compat_gid32_t;
|
typedef u32 __compat_gid32_t;
|
||||||
typedef u16 compat_mode_t;
|
typedef u16 compat_mode_t;
|
||||||
typedef u32 compat_ino_t;
|
|
||||||
typedef u16 compat_dev_t;
|
typedef u16 compat_dev_t;
|
||||||
typedef s32 compat_off_t;
|
|
||||||
typedef s64 compat_loff_t;
|
|
||||||
typedef u16 compat_nlink_t;
|
typedef u16 compat_nlink_t;
|
||||||
typedef u16 compat_ipc_pid_t;
|
typedef u16 compat_ipc_pid_t;
|
||||||
typedef s32 compat_daddr_t;
|
|
||||||
typedef u32 compat_caddr_t;
|
typedef u32 compat_caddr_t;
|
||||||
typedef __kernel_fsid_t compat_fsid_t;
|
typedef __kernel_fsid_t compat_fsid_t;
|
||||||
typedef s32 compat_timer_t;
|
|
||||||
typedef s32 compat_key_t;
|
|
||||||
|
|
||||||
typedef s32 compat_int_t;
|
|
||||||
typedef s32 compat_long_t;
|
|
||||||
typedef s64 __attribute__((aligned(4))) compat_s64;
|
typedef s64 __attribute__((aligned(4))) compat_s64;
|
||||||
typedef u32 compat_uint_t;
|
|
||||||
typedef u32 compat_ulong_t;
|
|
||||||
typedef u32 compat_u32;
|
|
||||||
typedef u64 __attribute__((aligned(4))) compat_u64;
|
typedef u64 __attribute__((aligned(4))) compat_u64;
|
||||||
typedef u32 compat_uptr_t;
|
|
||||||
|
|
||||||
struct compat_stat {
|
struct compat_stat {
|
||||||
compat_dev_t st_dev;
|
compat_dev_t st_dev;
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
# include <asm/unistd_64.h>
|
# include <asm/unistd_64.h>
|
||||||
# include <asm/unistd_64_x32.h>
|
# include <asm/unistd_64_x32.h>
|
||||||
# define __ARCH_WANT_COMPAT_SYS_TIME
|
# define __ARCH_WANT_COMPAT_SYS_TIME
|
||||||
|
# define __ARCH_WANT_SYS_UTIME32
|
||||||
# define __ARCH_WANT_COMPAT_SYS_PREADV64
|
# define __ARCH_WANT_COMPAT_SYS_PREADV64
|
||||||
# define __ARCH_WANT_COMPAT_SYS_PWRITEV64
|
# define __ARCH_WANT_COMPAT_SYS_PWRITEV64
|
||||||
# define __ARCH_WANT_COMPAT_SYS_PREADV64V2
|
# define __ARCH_WANT_COMPAT_SYS_PREADV64V2
|
||||||
|
@ -31,13 +32,13 @@
|
||||||
|
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# define __ARCH_WANT_NEW_STAT
|
||||||
# define __ARCH_WANT_OLD_READDIR
|
# define __ARCH_WANT_OLD_READDIR
|
||||||
# define __ARCH_WANT_OLD_STAT
|
# define __ARCH_WANT_OLD_STAT
|
||||||
# define __ARCH_WANT_SYS_ALARM
|
# define __ARCH_WANT_SYS_ALARM
|
||||||
# define __ARCH_WANT_SYS_FADVISE64
|
# define __ARCH_WANT_SYS_FADVISE64
|
||||||
# define __ARCH_WANT_SYS_GETHOSTNAME
|
# define __ARCH_WANT_SYS_GETHOSTNAME
|
||||||
# define __ARCH_WANT_SYS_GETPGRP
|
# define __ARCH_WANT_SYS_GETPGRP
|
||||||
# define __ARCH_WANT_SYS_LLSEEK
|
|
||||||
# define __ARCH_WANT_SYS_NICE
|
# define __ARCH_WANT_SYS_NICE
|
||||||
# define __ARCH_WANT_SYS_OLDUMOUNT
|
# define __ARCH_WANT_SYS_OLDUMOUNT
|
||||||
# define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
# define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
#define __ARCH_WANT_SYS_CLONE
|
#define __ARCH_WANT_SYS_CLONE
|
||||||
#include <uapi/asm/unistd.h>
|
#include <uapi/asm/unistd.h>
|
||||||
|
|
||||||
|
#define __ARCH_WANT_NEW_STAT
|
||||||
#define __ARCH_WANT_STAT64
|
#define __ARCH_WANT_STAT64
|
||||||
#define __ARCH_WANT_SYS_UTIME
|
#define __ARCH_WANT_SYS_UTIME
|
||||||
#define __ARCH_WANT_SYS_LLSEEK
|
|
||||||
#define __ARCH_WANT_SYS_GETPGRP
|
#define __ARCH_WANT_SYS_GETPGRP
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -23,8 +23,8 @@ obj-$(CONFIG_FTTMR010_TIMER) += timer-fttmr010.o
|
||||||
obj-$(CONFIG_ROCKCHIP_TIMER) += rockchip_timer.o
|
obj-$(CONFIG_ROCKCHIP_TIMER) += rockchip_timer.o
|
||||||
obj-$(CONFIG_CLKSRC_NOMADIK_MTU) += nomadik-mtu.o
|
obj-$(CONFIG_CLKSRC_NOMADIK_MTU) += nomadik-mtu.o
|
||||||
obj-$(CONFIG_CLKSRC_DBX500_PRCMU) += clksrc-dbx500-prcmu.o
|
obj-$(CONFIG_CLKSRC_DBX500_PRCMU) += clksrc-dbx500-prcmu.o
|
||||||
obj-$(CONFIG_ARMADA_370_XP_TIMER) += time-armada-370-xp.o
|
obj-$(CONFIG_ARMADA_370_XP_TIMER) += timer-armada-370-xp.o
|
||||||
obj-$(CONFIG_ORION_TIMER) += time-orion.o
|
obj-$(CONFIG_ORION_TIMER) += timer-orion.o
|
||||||
obj-$(CONFIG_BCM2835_TIMER) += bcm2835_timer.o
|
obj-$(CONFIG_BCM2835_TIMER) += bcm2835_timer.o
|
||||||
obj-$(CONFIG_CLPS711X_TIMER) += clps711x-timer.o
|
obj-$(CONFIG_CLPS711X_TIMER) += clps711x-timer.o
|
||||||
obj-$(CONFIG_ATLAS7_TIMER) += timer-atlas7.o
|
obj-$(CONFIG_ATLAS7_TIMER) += timer-atlas7.o
|
||||||
|
@ -36,25 +36,25 @@ obj-$(CONFIG_SUN4I_TIMER) += sun4i_timer.o
|
||||||
obj-$(CONFIG_SUN5I_HSTIMER) += timer-sun5i.o
|
obj-$(CONFIG_SUN5I_HSTIMER) += timer-sun5i.o
|
||||||
obj-$(CONFIG_MESON6_TIMER) += meson6_timer.o
|
obj-$(CONFIG_MESON6_TIMER) += meson6_timer.o
|
||||||
obj-$(CONFIG_TEGRA_TIMER) += tegra20_timer.o
|
obj-$(CONFIG_TEGRA_TIMER) += tegra20_timer.o
|
||||||
obj-$(CONFIG_VT8500_TIMER) += vt8500_timer.o
|
obj-$(CONFIG_VT8500_TIMER) += timer-vt8500.o
|
||||||
obj-$(CONFIG_NSPIRE_TIMER) += zevio-timer.o
|
obj-$(CONFIG_NSPIRE_TIMER) += timer-zevio.o
|
||||||
obj-$(CONFIG_BCM_KONA_TIMER) += bcm_kona_timer.o
|
obj-$(CONFIG_BCM_KONA_TIMER) += bcm_kona_timer.o
|
||||||
obj-$(CONFIG_CADENCE_TTC_TIMER) += cadence_ttc_timer.o
|
obj-$(CONFIG_CADENCE_TTC_TIMER) += timer-cadence-ttc.o
|
||||||
obj-$(CONFIG_CLKSRC_EFM32) += time-efm32.o
|
obj-$(CONFIG_CLKSRC_EFM32) += timer-efm32.o
|
||||||
obj-$(CONFIG_CLKSRC_STM32) += timer-stm32.o
|
obj-$(CONFIG_CLKSRC_STM32) += timer-stm32.o
|
||||||
obj-$(CONFIG_CLKSRC_EXYNOS_MCT) += exynos_mct.o
|
obj-$(CONFIG_CLKSRC_EXYNOS_MCT) += exynos_mct.o
|
||||||
obj-$(CONFIG_CLKSRC_LPC32XX) += time-lpc32xx.o
|
obj-$(CONFIG_CLKSRC_LPC32XX) += timer-lpc32xx.o
|
||||||
obj-$(CONFIG_CLKSRC_MPS2) += mps2-timer.o
|
obj-$(CONFIG_CLKSRC_MPS2) += mps2-timer.o
|
||||||
obj-$(CONFIG_CLKSRC_SAMSUNG_PWM) += samsung_pwm_timer.o
|
obj-$(CONFIG_CLKSRC_SAMSUNG_PWM) += samsung_pwm_timer.o
|
||||||
obj-$(CONFIG_FSL_FTM_TIMER) += fsl_ftm_timer.o
|
obj-$(CONFIG_FSL_FTM_TIMER) += timer-fsl-ftm.o
|
||||||
obj-$(CONFIG_VF_PIT_TIMER) += vf_pit_timer.o
|
obj-$(CONFIG_VF_PIT_TIMER) += timer-vf-pit.o
|
||||||
obj-$(CONFIG_CLKSRC_QCOM) += qcom-timer.o
|
obj-$(CONFIG_CLKSRC_QCOM) += timer-qcom.o
|
||||||
obj-$(CONFIG_MTK_TIMER) += timer-mediatek.o
|
obj-$(CONFIG_MTK_TIMER) += timer-mediatek.o
|
||||||
obj-$(CONFIG_CLKSRC_PISTACHIO) += time-pistachio.o
|
obj-$(CONFIG_CLKSRC_PISTACHIO) += timer-pistachio.o
|
||||||
obj-$(CONFIG_CLKSRC_TI_32K) += timer-ti-32k.o
|
obj-$(CONFIG_CLKSRC_TI_32K) += timer-ti-32k.o
|
||||||
obj-$(CONFIG_CLKSRC_NPS) += timer-nps.o
|
obj-$(CONFIG_CLKSRC_NPS) += timer-nps.o
|
||||||
obj-$(CONFIG_OXNAS_RPS_TIMER) += timer-oxnas-rps.o
|
obj-$(CONFIG_OXNAS_RPS_TIMER) += timer-oxnas-rps.o
|
||||||
obj-$(CONFIG_OWL_TIMER) += owl-timer.o
|
obj-$(CONFIG_OWL_TIMER) += timer-owl.o
|
||||||
obj-$(CONFIG_SPRD_TIMER) += timer-sprd.o
|
obj-$(CONFIG_SPRD_TIMER) += timer-sprd.o
|
||||||
obj-$(CONFIG_NPCM7XX_TIMER) += timer-npcm7xx.o
|
obj-$(CONFIG_NPCM7XX_TIMER) += timer-npcm7xx.o
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ obj-$(CONFIG_ARM_TIMER_SP804) += timer-sp804.o
|
||||||
obj-$(CONFIG_ARCH_HAS_TICK_BROADCAST) += dummy_timer.o
|
obj-$(CONFIG_ARCH_HAS_TICK_BROADCAST) += dummy_timer.o
|
||||||
obj-$(CONFIG_KEYSTONE_TIMER) += timer-keystone.o
|
obj-$(CONFIG_KEYSTONE_TIMER) += timer-keystone.o
|
||||||
obj-$(CONFIG_INTEGRATOR_AP_TIMER) += timer-integrator-ap.o
|
obj-$(CONFIG_INTEGRATOR_AP_TIMER) += timer-integrator-ap.o
|
||||||
obj-$(CONFIG_CLKSRC_VERSATILE) += versatile.o
|
obj-$(CONFIG_CLKSRC_VERSATILE) += timer-versatile.o
|
||||||
obj-$(CONFIG_CLKSRC_MIPS_GIC) += mips-gic-timer.o
|
obj-$(CONFIG_CLKSRC_MIPS_GIC) += mips-gic-timer.o
|
||||||
obj-$(CONFIG_CLKSRC_TANGO_XTAL) += tango_xtal.o
|
obj-$(CONFIG_CLKSRC_TANGO_XTAL) += tango_xtal.o
|
||||||
obj-$(CONFIG_CLKSRC_IMX_GPT) += timer-imx-gpt.o
|
obj-$(CONFIG_CLKSRC_IMX_GPT) += timer-imx-gpt.o
|
||||||
|
|
|
@ -193,7 +193,7 @@ static int __init asm9260_timer_init(struct device_node *np)
|
||||||
|
|
||||||
priv.base = of_io_request_and_map(np, 0, np->name);
|
priv.base = of_io_request_and_map(np, 0, np->name);
|
||||||
if (IS_ERR(priv.base)) {
|
if (IS_ERR(priv.base)) {
|
||||||
pr_err("%s: unable to map resource\n", np->name);
|
pr_err("%pOFn: unable to map resource\n", np);
|
||||||
return PTR_ERR(priv.base);
|
return PTR_ERR(priv.base);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
#include <linux/reset.h>
|
||||||
#include <linux/sched_clock.h>
|
#include <linux/sched_clock.h>
|
||||||
|
|
||||||
static void __init timer_get_base_and_rate(struct device_node *np,
|
static void __init timer_get_base_and_rate(struct device_node *np,
|
||||||
|
@ -29,11 +30,22 @@ static void __init timer_get_base_and_rate(struct device_node *np,
|
||||||
{
|
{
|
||||||
struct clk *timer_clk;
|
struct clk *timer_clk;
|
||||||
struct clk *pclk;
|
struct clk *pclk;
|
||||||
|
struct reset_control *rstc;
|
||||||
|
|
||||||
*base = of_iomap(np, 0);
|
*base = of_iomap(np, 0);
|
||||||
|
|
||||||
if (!*base)
|
if (!*base)
|
||||||
panic("Unable to map regs for %s", np->name);
|
panic("Unable to map regs for %pOFn", np);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reset the timer if the reset control is available, wiping
|
||||||
|
* out the state the firmware may have left it
|
||||||
|
*/
|
||||||
|
rstc = of_reset_control_get(np, NULL);
|
||||||
|
if (!IS_ERR(rstc)) {
|
||||||
|
reset_control_assert(rstc);
|
||||||
|
reset_control_deassert(rstc);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Not all implementations use a periphal clock, so don't panic
|
* Not all implementations use a periphal clock, so don't panic
|
||||||
|
@ -42,8 +54,8 @@ static void __init timer_get_base_and_rate(struct device_node *np,
|
||||||
pclk = of_clk_get_by_name(np, "pclk");
|
pclk = of_clk_get_by_name(np, "pclk");
|
||||||
if (!IS_ERR(pclk))
|
if (!IS_ERR(pclk))
|
||||||
if (clk_prepare_enable(pclk))
|
if (clk_prepare_enable(pclk))
|
||||||
pr_warn("pclk for %s is present, but could not be activated\n",
|
pr_warn("pclk for %pOFn is present, but could not be activated\n",
|
||||||
np->name);
|
np);
|
||||||
|
|
||||||
timer_clk = of_clk_get_by_name(np, "timer");
|
timer_clk = of_clk_get_by_name(np, "timer");
|
||||||
if (IS_ERR(timer_clk))
|
if (IS_ERR(timer_clk))
|
||||||
|
@ -57,7 +69,7 @@ static void __init timer_get_base_and_rate(struct device_node *np,
|
||||||
try_clock_freq:
|
try_clock_freq:
|
||||||
if (of_property_read_u32(np, "clock-freq", rate) &&
|
if (of_property_read_u32(np, "clock-freq", rate) &&
|
||||||
of_property_read_u32(np, "clock-frequency", rate))
|
of_property_read_u32(np, "clock-frequency", rate))
|
||||||
panic("No clock nor clock-frequency property for %s", np->name);
|
panic("No clock nor clock-frequency property for %pOFn", np);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init add_clockevent(struct device_node *event_timer)
|
static void __init add_clockevent(struct device_node *event_timer)
|
||||||
|
|
|
@ -191,13 +191,13 @@ static int __init pxa_timer_dt_init(struct device_node *np)
|
||||||
/* timer registers are shared with watchdog timer */
|
/* timer registers are shared with watchdog timer */
|
||||||
timer_base = of_iomap(np, 0);
|
timer_base = of_iomap(np, 0);
|
||||||
if (!timer_base) {
|
if (!timer_base) {
|
||||||
pr_err("%s: unable to map resource\n", np->name);
|
pr_err("%pOFn: unable to map resource\n", np);
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
clk = of_clk_get(np, 0);
|
clk = of_clk_get(np, 0);
|
||||||
if (IS_ERR(clk)) {
|
if (IS_ERR(clk)) {
|
||||||
pr_crit("%s: unable to get clk\n", np->name);
|
pr_crit("%pOFn: unable to get clk\n", np);
|
||||||
return PTR_ERR(clk);
|
return PTR_ERR(clk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,7 +210,7 @@ static int __init pxa_timer_dt_init(struct device_node *np)
|
||||||
/* we are only interested in OS-timer0 irq */
|
/* we are only interested in OS-timer0 irq */
|
||||||
irq = irq_of_parse_and_map(np, 0);
|
irq = irq_of_parse_and_map(np, 0);
|
||||||
if (irq <= 0) {
|
if (irq <= 0) {
|
||||||
pr_crit("%s: unable to parse OS-timer0 irq\n", np->name);
|
pr_crit("%pOFn: unable to parse OS-timer0 irq\n", np);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,9 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* Renesas Timer Support - OSTM
|
* Renesas Timer Support - OSTM
|
||||||
*
|
*
|
||||||
* Copyright (C) 2017 Renesas Electronics America, Inc.
|
* Copyright (C) 2017 Renesas Electronics America, Inc.
|
||||||
* Copyright (C) 2017 Chris Brandt
|
* Copyright (C) 2017 Chris Brandt
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
|
|
|
@ -1,16 +1,8 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* SuperH Timer Support - CMT
|
* SuperH Timer Support - CMT
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 Magnus Damm
|
* Copyright (C) 2008 Magnus Damm
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
@ -78,18 +70,17 @@ struct sh_cmt_info {
|
||||||
unsigned int channels_mask;
|
unsigned int channels_mask;
|
||||||
|
|
||||||
unsigned long width; /* 16 or 32 bit version of hardware block */
|
unsigned long width; /* 16 or 32 bit version of hardware block */
|
||||||
unsigned long overflow_bit;
|
u32 overflow_bit;
|
||||||
unsigned long clear_bits;
|
u32 clear_bits;
|
||||||
|
|
||||||
/* callbacks for CMSTR and CMCSR access */
|
/* callbacks for CMSTR and CMCSR access */
|
||||||
unsigned long (*read_control)(void __iomem *base, unsigned long offs);
|
u32 (*read_control)(void __iomem *base, unsigned long offs);
|
||||||
void (*write_control)(void __iomem *base, unsigned long offs,
|
void (*write_control)(void __iomem *base, unsigned long offs,
|
||||||
unsigned long value);
|
u32 value);
|
||||||
|
|
||||||
/* callbacks for CMCNT and CMCOR access */
|
/* callbacks for CMCNT and CMCOR access */
|
||||||
unsigned long (*read_count)(void __iomem *base, unsigned long offs);
|
u32 (*read_count)(void __iomem *base, unsigned long offs);
|
||||||
void (*write_count)(void __iomem *base, unsigned long offs,
|
void (*write_count)(void __iomem *base, unsigned long offs, u32 value);
|
||||||
unsigned long value);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sh_cmt_channel {
|
struct sh_cmt_channel {
|
||||||
|
@ -103,13 +94,13 @@ struct sh_cmt_channel {
|
||||||
|
|
||||||
unsigned int timer_bit;
|
unsigned int timer_bit;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned long match_value;
|
u32 match_value;
|
||||||
unsigned long next_match_value;
|
u32 next_match_value;
|
||||||
unsigned long max_match_value;
|
u32 max_match_value;
|
||||||
raw_spinlock_t lock;
|
raw_spinlock_t lock;
|
||||||
struct clock_event_device ced;
|
struct clock_event_device ced;
|
||||||
struct clocksource cs;
|
struct clocksource cs;
|
||||||
unsigned long total_cycles;
|
u64 total_cycles;
|
||||||
bool cs_enabled;
|
bool cs_enabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -160,24 +151,22 @@ struct sh_cmt_device {
|
||||||
#define SH_CMT32_CMCSR_CKS_RCLK1 (7 << 0)
|
#define SH_CMT32_CMCSR_CKS_RCLK1 (7 << 0)
|
||||||
#define SH_CMT32_CMCSR_CKS_MASK (7 << 0)
|
#define SH_CMT32_CMCSR_CKS_MASK (7 << 0)
|
||||||
|
|
||||||
static unsigned long sh_cmt_read16(void __iomem *base, unsigned long offs)
|
static u32 sh_cmt_read16(void __iomem *base, unsigned long offs)
|
||||||
{
|
{
|
||||||
return ioread16(base + (offs << 1));
|
return ioread16(base + (offs << 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long sh_cmt_read32(void __iomem *base, unsigned long offs)
|
static u32 sh_cmt_read32(void __iomem *base, unsigned long offs)
|
||||||
{
|
{
|
||||||
return ioread32(base + (offs << 2));
|
return ioread32(base + (offs << 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sh_cmt_write16(void __iomem *base, unsigned long offs,
|
static void sh_cmt_write16(void __iomem *base, unsigned long offs, u32 value)
|
||||||
unsigned long value)
|
|
||||||
{
|
{
|
||||||
iowrite16(value, base + (offs << 1));
|
iowrite16(value, base + (offs << 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sh_cmt_write32(void __iomem *base, unsigned long offs,
|
static void sh_cmt_write32(void __iomem *base, unsigned long offs, u32 value)
|
||||||
unsigned long value)
|
|
||||||
{
|
{
|
||||||
iowrite32(value, base + (offs << 2));
|
iowrite32(value, base + (offs << 2));
|
||||||
}
|
}
|
||||||
|
@ -242,7 +231,7 @@ static const struct sh_cmt_info sh_cmt_info[] = {
|
||||||
#define CMCNT 1 /* channel register */
|
#define CMCNT 1 /* channel register */
|
||||||
#define CMCOR 2 /* channel register */
|
#define CMCOR 2 /* channel register */
|
||||||
|
|
||||||
static inline unsigned long sh_cmt_read_cmstr(struct sh_cmt_channel *ch)
|
static inline u32 sh_cmt_read_cmstr(struct sh_cmt_channel *ch)
|
||||||
{
|
{
|
||||||
if (ch->iostart)
|
if (ch->iostart)
|
||||||
return ch->cmt->info->read_control(ch->iostart, 0);
|
return ch->cmt->info->read_control(ch->iostart, 0);
|
||||||
|
@ -250,8 +239,7 @@ static inline unsigned long sh_cmt_read_cmstr(struct sh_cmt_channel *ch)
|
||||||
return ch->cmt->info->read_control(ch->cmt->mapbase, 0);
|
return ch->cmt->info->read_control(ch->cmt->mapbase, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void sh_cmt_write_cmstr(struct sh_cmt_channel *ch,
|
static inline void sh_cmt_write_cmstr(struct sh_cmt_channel *ch, u32 value)
|
||||||
unsigned long value)
|
|
||||||
{
|
{
|
||||||
if (ch->iostart)
|
if (ch->iostart)
|
||||||
ch->cmt->info->write_control(ch->iostart, 0, value);
|
ch->cmt->info->write_control(ch->iostart, 0, value);
|
||||||
|
@ -259,39 +247,35 @@ static inline void sh_cmt_write_cmstr(struct sh_cmt_channel *ch,
|
||||||
ch->cmt->info->write_control(ch->cmt->mapbase, 0, value);
|
ch->cmt->info->write_control(ch->cmt->mapbase, 0, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned long sh_cmt_read_cmcsr(struct sh_cmt_channel *ch)
|
static inline u32 sh_cmt_read_cmcsr(struct sh_cmt_channel *ch)
|
||||||
{
|
{
|
||||||
return ch->cmt->info->read_control(ch->ioctrl, CMCSR);
|
return ch->cmt->info->read_control(ch->ioctrl, CMCSR);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void sh_cmt_write_cmcsr(struct sh_cmt_channel *ch,
|
static inline void sh_cmt_write_cmcsr(struct sh_cmt_channel *ch, u32 value)
|
||||||
unsigned long value)
|
|
||||||
{
|
{
|
||||||
ch->cmt->info->write_control(ch->ioctrl, CMCSR, value);
|
ch->cmt->info->write_control(ch->ioctrl, CMCSR, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned long sh_cmt_read_cmcnt(struct sh_cmt_channel *ch)
|
static inline u32 sh_cmt_read_cmcnt(struct sh_cmt_channel *ch)
|
||||||
{
|
{
|
||||||
return ch->cmt->info->read_count(ch->ioctrl, CMCNT);
|
return ch->cmt->info->read_count(ch->ioctrl, CMCNT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void sh_cmt_write_cmcnt(struct sh_cmt_channel *ch,
|
static inline void sh_cmt_write_cmcnt(struct sh_cmt_channel *ch, u32 value)
|
||||||
unsigned long value)
|
|
||||||
{
|
{
|
||||||
ch->cmt->info->write_count(ch->ioctrl, CMCNT, value);
|
ch->cmt->info->write_count(ch->ioctrl, CMCNT, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void sh_cmt_write_cmcor(struct sh_cmt_channel *ch,
|
static inline void sh_cmt_write_cmcor(struct sh_cmt_channel *ch, u32 value)
|
||||||
unsigned long value)
|
|
||||||
{
|
{
|
||||||
ch->cmt->info->write_count(ch->ioctrl, CMCOR, value);
|
ch->cmt->info->write_count(ch->ioctrl, CMCOR, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long sh_cmt_get_counter(struct sh_cmt_channel *ch,
|
static u32 sh_cmt_get_counter(struct sh_cmt_channel *ch, u32 *has_wrapped)
|
||||||
int *has_wrapped)
|
|
||||||
{
|
{
|
||||||
unsigned long v1, v2, v3;
|
u32 v1, v2, v3;
|
||||||
int o1, o2;
|
u32 o1, o2;
|
||||||
|
|
||||||
o1 = sh_cmt_read_cmcsr(ch) & ch->cmt->info->overflow_bit;
|
o1 = sh_cmt_read_cmcsr(ch) & ch->cmt->info->overflow_bit;
|
||||||
|
|
||||||
|
@ -311,7 +295,8 @@ static unsigned long sh_cmt_get_counter(struct sh_cmt_channel *ch,
|
||||||
|
|
||||||
static void sh_cmt_start_stop_ch(struct sh_cmt_channel *ch, int start)
|
static void sh_cmt_start_stop_ch(struct sh_cmt_channel *ch, int start)
|
||||||
{
|
{
|
||||||
unsigned long flags, value;
|
unsigned long flags;
|
||||||
|
u32 value;
|
||||||
|
|
||||||
/* start stop register shared by multiple timer channels */
|
/* start stop register shared by multiple timer channels */
|
||||||
raw_spin_lock_irqsave(&ch->cmt->lock, flags);
|
raw_spin_lock_irqsave(&ch->cmt->lock, flags);
|
||||||
|
@ -418,11 +403,11 @@ static void sh_cmt_disable(struct sh_cmt_channel *ch)
|
||||||
static void sh_cmt_clock_event_program_verify(struct sh_cmt_channel *ch,
|
static void sh_cmt_clock_event_program_verify(struct sh_cmt_channel *ch,
|
||||||
int absolute)
|
int absolute)
|
||||||
{
|
{
|
||||||
unsigned long new_match;
|
u32 value = ch->next_match_value;
|
||||||
unsigned long value = ch->next_match_value;
|
u32 new_match;
|
||||||
unsigned long delay = 0;
|
u32 delay = 0;
|
||||||
unsigned long now = 0;
|
u32 now = 0;
|
||||||
int has_wrapped;
|
u32 has_wrapped;
|
||||||
|
|
||||||
now = sh_cmt_get_counter(ch, &has_wrapped);
|
now = sh_cmt_get_counter(ch, &has_wrapped);
|
||||||
ch->flags |= FLAG_REPROGRAM; /* force reprogram */
|
ch->flags |= FLAG_REPROGRAM; /* force reprogram */
|
||||||
|
@ -619,9 +604,10 @@ static struct sh_cmt_channel *cs_to_sh_cmt(struct clocksource *cs)
|
||||||
static u64 sh_cmt_clocksource_read(struct clocksource *cs)
|
static u64 sh_cmt_clocksource_read(struct clocksource *cs)
|
||||||
{
|
{
|
||||||
struct sh_cmt_channel *ch = cs_to_sh_cmt(cs);
|
struct sh_cmt_channel *ch = cs_to_sh_cmt(cs);
|
||||||
unsigned long flags, raw;
|
unsigned long flags;
|
||||||
unsigned long value;
|
u32 has_wrapped;
|
||||||
int has_wrapped;
|
u64 value;
|
||||||
|
u32 raw;
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&ch->lock, flags);
|
raw_spin_lock_irqsave(&ch->lock, flags);
|
||||||
value = ch->total_cycles;
|
value = ch->total_cycles;
|
||||||
|
@ -694,7 +680,7 @@ static int sh_cmt_register_clocksource(struct sh_cmt_channel *ch,
|
||||||
cs->disable = sh_cmt_clocksource_disable;
|
cs->disable = sh_cmt_clocksource_disable;
|
||||||
cs->suspend = sh_cmt_clocksource_suspend;
|
cs->suspend = sh_cmt_clocksource_suspend;
|
||||||
cs->resume = sh_cmt_clocksource_resume;
|
cs->resume = sh_cmt_clocksource_resume;
|
||||||
cs->mask = CLOCKSOURCE_MASK(sizeof(unsigned long) * 8);
|
cs->mask = CLOCKSOURCE_MASK(sizeof(u64) * 8);
|
||||||
cs->flags = CLOCK_SOURCE_IS_CONTINUOUS;
|
cs->flags = CLOCK_SOURCE_IS_CONTINUOUS;
|
||||||
|
|
||||||
dev_info(&ch->cmt->pdev->dev, "ch%u: used as clock source\n",
|
dev_info(&ch->cmt->pdev->dev, "ch%u: used as clock source\n",
|
||||||
|
@ -941,8 +927,22 @@ static const struct of_device_id sh_cmt_of_table[] __maybe_unused = {
|
||||||
.compatible = "renesas,cmt-48-gen2",
|
.compatible = "renesas,cmt-48-gen2",
|
||||||
.data = &sh_cmt_info[SH_CMT0_RCAR_GEN2]
|
.data = &sh_cmt_info[SH_CMT0_RCAR_GEN2]
|
||||||
},
|
},
|
||||||
{ .compatible = "renesas,rcar-gen2-cmt0", .data = &sh_cmt_info[SH_CMT0_RCAR_GEN2] },
|
{
|
||||||
{ .compatible = "renesas,rcar-gen2-cmt1", .data = &sh_cmt_info[SH_CMT1_RCAR_GEN2] },
|
.compatible = "renesas,rcar-gen2-cmt0",
|
||||||
|
.data = &sh_cmt_info[SH_CMT0_RCAR_GEN2]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.compatible = "renesas,rcar-gen2-cmt1",
|
||||||
|
.data = &sh_cmt_info[SH_CMT1_RCAR_GEN2]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.compatible = "renesas,rcar-gen3-cmt0",
|
||||||
|
.data = &sh_cmt_info[SH_CMT0_RCAR_GEN2]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.compatible = "renesas,rcar-gen3-cmt1",
|
||||||
|
.data = &sh_cmt_info[SH_CMT1_RCAR_GEN2]
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, sh_cmt_of_table);
|
MODULE_DEVICE_TABLE(of, sh_cmt_of_table);
|
||||||
|
|
|
@ -1,16 +1,8 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* SuperH Timer Support - MTU2
|
* SuperH Timer Support - MTU2
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Magnus Damm
|
* Copyright (C) 2009 Magnus Damm
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
|
|
@ -1,16 +1,8 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* SuperH Timer Support - TMU
|
* SuperH Timer Support - TMU
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009 Magnus Damm
|
* Copyright (C) 2009 Magnus Damm
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
|
|
@ -535,7 +535,7 @@ static int __init ttc_timer_init(struct device_node *timer)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
pr_info("%s #0 at %p, irq=%d\n", timer->name, timer_baseaddr, irq);
|
pr_info("%pOFn #0 at %p, irq=%d\n", timer, timer_baseaddr, irq);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
|
@ -190,7 +190,7 @@ static int __init integrator_ap_timer_init_of(struct device_node *node)
|
||||||
|
|
||||||
clk = of_clk_get(node, 0);
|
clk = of_clk_get(node, 0);
|
||||||
if (IS_ERR(clk)) {
|
if (IS_ERR(clk)) {
|
||||||
pr_err("No clock for %s\n", node->name);
|
pr_err("No clock for %pOFn\n", node);
|
||||||
return PTR_ERR(clk);
|
return PTR_ERR(clk);
|
||||||
}
|
}
|
||||||
clk_prepare_enable(clk);
|
clk_prepare_enable(clk);
|
||||||
|
|
|
@ -129,13 +129,13 @@ static int __init orion_timer_init(struct device_node *np)
|
||||||
/* timer registers are shared with watchdog timer */
|
/* timer registers are shared with watchdog timer */
|
||||||
timer_base = of_iomap(np, 0);
|
timer_base = of_iomap(np, 0);
|
||||||
if (!timer_base) {
|
if (!timer_base) {
|
||||||
pr_err("%s: unable to map resource\n", np->name);
|
pr_err("%pOFn: unable to map resource\n", np);
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
clk = of_clk_get(np, 0);
|
clk = of_clk_get(np, 0);
|
||||||
if (IS_ERR(clk)) {
|
if (IS_ERR(clk)) {
|
||||||
pr_err("%s: unable to get clk\n", np->name);
|
pr_err("%pOFn: unable to get clk\n", np);
|
||||||
return PTR_ERR(clk);
|
return PTR_ERR(clk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,7 +148,7 @@ static int __init orion_timer_init(struct device_node *np)
|
||||||
/* we are only interested in timer1 irq */
|
/* we are only interested in timer1 irq */
|
||||||
irq = irq_of_parse_and_map(np, 1);
|
irq = irq_of_parse_and_map(np, 1);
|
||||||
if (irq <= 0) {
|
if (irq <= 0) {
|
||||||
pr_err("%s: unable to parse timer1 irq\n", np->name);
|
pr_err("%pOFn: unable to parse timer1 irq\n", np);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,7 +174,7 @@ static int __init orion_timer_init(struct device_node *np)
|
||||||
/* setup timer1 as clockevent timer */
|
/* setup timer1 as clockevent timer */
|
||||||
ret = setup_irq(irq, &orion_clkevt_irq);
|
ret = setup_irq(irq, &orion_clkevt_irq);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pr_err("%s: unable to setup irq\n", np->name);
|
pr_err("%pOFn: unable to setup irq\n", np);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -249,7 +249,7 @@ static int __init sp804_of_init(struct device_node *np)
|
||||||
if (of_clk_get_parent_count(np) == 3) {
|
if (of_clk_get_parent_count(np) == 3) {
|
||||||
clk2 = of_clk_get(np, 1);
|
clk2 = of_clk_get(np, 1);
|
||||||
if (IS_ERR(clk2)) {
|
if (IS_ERR(clk2)) {
|
||||||
pr_err("sp804: %s clock not found: %d\n", np->name,
|
pr_err("sp804: %pOFn clock not found: %d\n", np,
|
||||||
(int)PTR_ERR(clk2));
|
(int)PTR_ERR(clk2));
|
||||||
clk2 = NULL;
|
clk2 = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -148,12 +148,12 @@ static int __init zevio_timer_add(struct device_node *node)
|
||||||
|
|
||||||
of_address_to_resource(node, 0, &res);
|
of_address_to_resource(node, 0, &res);
|
||||||
scnprintf(timer->clocksource_name, sizeof(timer->clocksource_name),
|
scnprintf(timer->clocksource_name, sizeof(timer->clocksource_name),
|
||||||
"%llx.%s_clocksource",
|
"%llx.%pOFn_clocksource",
|
||||||
(unsigned long long)res.start, node->name);
|
(unsigned long long)res.start, node);
|
||||||
|
|
||||||
scnprintf(timer->clockevent_name, sizeof(timer->clockevent_name),
|
scnprintf(timer->clockevent_name, sizeof(timer->clockevent_name),
|
||||||
"%llx.%s_clockevent",
|
"%llx.%pOFn_clockevent",
|
||||||
(unsigned long long)res.start, node->name);
|
(unsigned long long)res.start, node);
|
||||||
|
|
||||||
if (timer->interrupt_regs && irqnr) {
|
if (timer->interrupt_regs && irqnr) {
|
||||||
timer->clkevt.name = timer->clockevent_name;
|
timer->clkevt.name = timer->clockevent_name;
|
8
fs/aio.c
8
fs/aio.c
|
@ -2135,12 +2135,12 @@ COMPAT_SYSCALL_DEFINE5(io_getevents, compat_aio_context_t, ctx_id,
|
||||||
compat_long_t, min_nr,
|
compat_long_t, min_nr,
|
||||||
compat_long_t, nr,
|
compat_long_t, nr,
|
||||||
struct io_event __user *, events,
|
struct io_event __user *, events,
|
||||||
struct compat_timespec __user *, timeout)
|
struct old_timespec32 __user *, timeout)
|
||||||
{
|
{
|
||||||
struct timespec64 t;
|
struct timespec64 t;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (timeout && compat_get_timespec64(&t, timeout))
|
if (timeout && get_old_timespec32(&t, timeout))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &t : NULL);
|
ret = do_io_getevents(ctx_id, min_nr, nr, events, timeout ? &t : NULL);
|
||||||
|
@ -2160,7 +2160,7 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents,
|
||||||
compat_long_t, min_nr,
|
compat_long_t, min_nr,
|
||||||
compat_long_t, nr,
|
compat_long_t, nr,
|
||||||
struct io_event __user *, events,
|
struct io_event __user *, events,
|
||||||
struct compat_timespec __user *, timeout,
|
struct old_timespec32 __user *, timeout,
|
||||||
const struct __compat_aio_sigset __user *, usig)
|
const struct __compat_aio_sigset __user *, usig)
|
||||||
{
|
{
|
||||||
struct __compat_aio_sigset ksig = { NULL, };
|
struct __compat_aio_sigset ksig = { NULL, };
|
||||||
|
@ -2168,7 +2168,7 @@ COMPAT_SYSCALL_DEFINE6(io_pgetevents,
|
||||||
struct timespec64 t;
|
struct timespec64 t;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (timeout && compat_get_timespec64(&t, timeout))
|
if (timeout && get_old_timespec32(&t, timeout))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
if (usig && copy_from_user(&ksig, usig, sizeof(ksig)))
|
if (usig && copy_from_user(&ksig, usig, sizeof(ksig)))
|
||||||
|
|
|
@ -52,7 +52,7 @@
|
||||||
#define elf_prpsinfo compat_elf_prpsinfo
|
#define elf_prpsinfo compat_elf_prpsinfo
|
||||||
|
|
||||||
#undef ns_to_timeval
|
#undef ns_to_timeval
|
||||||
#define ns_to_timeval ns_to_compat_timeval
|
#define ns_to_timeval ns_to_old_timeval32
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* To use this file, asm/elf.h must define compat_elf_check_arch.
|
* To use this file, asm/elf.h must define compat_elf_check_arch.
|
||||||
|
|
|
@ -331,7 +331,7 @@ COMPAT_SYSCALL_DEFINE3(lseek, unsigned int, fd, compat_off_t, offset, unsigned i
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __ARCH_WANT_SYS_LLSEEK
|
#if !defined(CONFIG_64BIT) || defined(CONFIG_COMPAT)
|
||||||
SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned long, offset_high,
|
SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned long, offset_high,
|
||||||
unsigned long, offset_low, loff_t __user *, result,
|
unsigned long, offset_low, loff_t __user *, result,
|
||||||
unsigned int, whence)
|
unsigned int, whence)
|
||||||
|
|
20
fs/select.c
20
fs/select.c
|
@ -1120,7 +1120,7 @@ int compat_poll_select_copy_remaining(struct timespec64 *end_time, void __user *
|
||||||
ts.tv_sec = ts.tv_nsec = 0;
|
ts.tv_sec = ts.tv_nsec = 0;
|
||||||
|
|
||||||
if (timeval) {
|
if (timeval) {
|
||||||
struct compat_timeval rtv;
|
struct old_timeval32 rtv;
|
||||||
|
|
||||||
rtv.tv_sec = ts.tv_sec;
|
rtv.tv_sec = ts.tv_sec;
|
||||||
rtv.tv_usec = ts.tv_nsec / NSEC_PER_USEC;
|
rtv.tv_usec = ts.tv_nsec / NSEC_PER_USEC;
|
||||||
|
@ -1128,7 +1128,7 @@ int compat_poll_select_copy_remaining(struct timespec64 *end_time, void __user *
|
||||||
if (!copy_to_user(p, &rtv, sizeof(rtv)))
|
if (!copy_to_user(p, &rtv, sizeof(rtv)))
|
||||||
return ret;
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
if (!compat_put_timespec64(&ts, p))
|
if (!put_old_timespec32(&ts, p))
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
@ -1257,10 +1257,10 @@ out_nofds:
|
||||||
|
|
||||||
static int do_compat_select(int n, compat_ulong_t __user *inp,
|
static int do_compat_select(int n, compat_ulong_t __user *inp,
|
||||||
compat_ulong_t __user *outp, compat_ulong_t __user *exp,
|
compat_ulong_t __user *outp, compat_ulong_t __user *exp,
|
||||||
struct compat_timeval __user *tvp)
|
struct old_timeval32 __user *tvp)
|
||||||
{
|
{
|
||||||
struct timespec64 end_time, *to = NULL;
|
struct timespec64 end_time, *to = NULL;
|
||||||
struct compat_timeval tv;
|
struct old_timeval32 tv;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (tvp) {
|
if (tvp) {
|
||||||
|
@ -1282,7 +1282,7 @@ static int do_compat_select(int n, compat_ulong_t __user *inp,
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE5(select, int, n, compat_ulong_t __user *, inp,
|
COMPAT_SYSCALL_DEFINE5(select, int, n, compat_ulong_t __user *, inp,
|
||||||
compat_ulong_t __user *, outp, compat_ulong_t __user *, exp,
|
compat_ulong_t __user *, outp, compat_ulong_t __user *, exp,
|
||||||
struct compat_timeval __user *, tvp)
|
struct old_timeval32 __user *, tvp)
|
||||||
{
|
{
|
||||||
return do_compat_select(n, inp, outp, exp, tvp);
|
return do_compat_select(n, inp, outp, exp, tvp);
|
||||||
}
|
}
|
||||||
|
@ -1307,7 +1307,7 @@ COMPAT_SYSCALL_DEFINE1(old_select, struct compat_sel_arg_struct __user *, arg)
|
||||||
|
|
||||||
static long do_compat_pselect(int n, compat_ulong_t __user *inp,
|
static long do_compat_pselect(int n, compat_ulong_t __user *inp,
|
||||||
compat_ulong_t __user *outp, compat_ulong_t __user *exp,
|
compat_ulong_t __user *outp, compat_ulong_t __user *exp,
|
||||||
struct compat_timespec __user *tsp, compat_sigset_t __user *sigmask,
|
struct old_timespec32 __user *tsp, compat_sigset_t __user *sigmask,
|
||||||
compat_size_t sigsetsize)
|
compat_size_t sigsetsize)
|
||||||
{
|
{
|
||||||
sigset_t ksigmask, sigsaved;
|
sigset_t ksigmask, sigsaved;
|
||||||
|
@ -1315,7 +1315,7 @@ static long do_compat_pselect(int n, compat_ulong_t __user *inp,
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (tsp) {
|
if (tsp) {
|
||||||
if (compat_get_timespec64(&ts, tsp))
|
if (get_old_timespec32(&ts, tsp))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
to = &end_time;
|
to = &end_time;
|
||||||
|
@ -1355,7 +1355,7 @@ static long do_compat_pselect(int n, compat_ulong_t __user *inp,
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE6(pselect6, int, n, compat_ulong_t __user *, inp,
|
COMPAT_SYSCALL_DEFINE6(pselect6, int, n, compat_ulong_t __user *, inp,
|
||||||
compat_ulong_t __user *, outp, compat_ulong_t __user *, exp,
|
compat_ulong_t __user *, outp, compat_ulong_t __user *, exp,
|
||||||
struct compat_timespec __user *, tsp, void __user *, sig)
|
struct old_timespec32 __user *, tsp, void __user *, sig)
|
||||||
{
|
{
|
||||||
compat_size_t sigsetsize = 0;
|
compat_size_t sigsetsize = 0;
|
||||||
compat_uptr_t up = 0;
|
compat_uptr_t up = 0;
|
||||||
|
@ -1373,7 +1373,7 @@ COMPAT_SYSCALL_DEFINE6(pselect6, int, n, compat_ulong_t __user *, inp,
|
||||||
}
|
}
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds,
|
COMPAT_SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds,
|
||||||
unsigned int, nfds, struct compat_timespec __user *, tsp,
|
unsigned int, nfds, struct old_timespec32 __user *, tsp,
|
||||||
const compat_sigset_t __user *, sigmask, compat_size_t, sigsetsize)
|
const compat_sigset_t __user *, sigmask, compat_size_t, sigsetsize)
|
||||||
{
|
{
|
||||||
sigset_t ksigmask, sigsaved;
|
sigset_t ksigmask, sigsaved;
|
||||||
|
@ -1381,7 +1381,7 @@ COMPAT_SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds,
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (tsp) {
|
if (tsp) {
|
||||||
if (compat_get_timespec64(&ts, tsp))
|
if (get_old_timespec32(&ts, tsp))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
to = &end_time;
|
to = &end_time;
|
||||||
|
|
|
@ -280,6 +280,8 @@ SYSCALL_DEFINE2(fstat, unsigned int, fd, struct __old_kernel_stat __user *, stat
|
||||||
|
|
||||||
#endif /* __ARCH_WANT_OLD_STAT */
|
#endif /* __ARCH_WANT_OLD_STAT */
|
||||||
|
|
||||||
|
#ifdef __ARCH_WANT_NEW_STAT
|
||||||
|
|
||||||
#if BITS_PER_LONG == 32
|
#if BITS_PER_LONG == 32
|
||||||
# define choose_32_64(a,b) a
|
# define choose_32_64(a,b) a
|
||||||
#else
|
#else
|
||||||
|
@ -378,6 +380,7 @@ SYSCALL_DEFINE2(newfstat, unsigned int, fd, struct stat __user *, statbuf)
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int do_readlinkat(int dfd, const char __user *pathname,
|
static int do_readlinkat(int dfd, const char __user *pathname,
|
||||||
char __user *buf, int bufsiz)
|
char __user *buf, int bufsiz)
|
||||||
|
|
12
fs/timerfd.c
12
fs/timerfd.c
|
@ -561,29 +561,29 @@ SYSCALL_DEFINE2(timerfd_gettime, int, ufd, struct __kernel_itimerspec __user *,
|
||||||
|
|
||||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||||
COMPAT_SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
|
COMPAT_SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
|
||||||
const struct compat_itimerspec __user *, utmr,
|
const struct old_itimerspec32 __user *, utmr,
|
||||||
struct compat_itimerspec __user *, otmr)
|
struct old_itimerspec32 __user *, otmr)
|
||||||
{
|
{
|
||||||
struct itimerspec64 new, old;
|
struct itimerspec64 new, old;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (get_compat_itimerspec64(&new, utmr))
|
if (get_old_itimerspec32(&new, utmr))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
ret = do_timerfd_settime(ufd, flags, &new, &old);
|
ret = do_timerfd_settime(ufd, flags, &new, &old);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
if (otmr && put_compat_itimerspec64(&old, otmr))
|
if (otmr && put_old_itimerspec32(&old, otmr))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE2(timerfd_gettime, int, ufd,
|
COMPAT_SYSCALL_DEFINE2(timerfd_gettime, int, ufd,
|
||||||
struct compat_itimerspec __user *, otmr)
|
struct old_itimerspec32 __user *, otmr)
|
||||||
{
|
{
|
||||||
struct itimerspec64 kotmr;
|
struct itimerspec64 kotmr;
|
||||||
int ret = do_timerfd_gettime(ufd, &kotmr);
|
int ret = do_timerfd_gettime(ufd, &kotmr);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
return put_compat_itimerspec64(&kotmr, otmr) ? -EFAULT : 0;
|
return put_old_itimerspec32(&kotmr, otmr) ? -EFAULT : 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
73
fs/utimes.c
73
fs/utimes.c
|
@ -8,35 +8,6 @@
|
||||||
#include <linux/compat.h>
|
#include <linux/compat.h>
|
||||||
#include <asm/unistd.h>
|
#include <asm/unistd.h>
|
||||||
|
|
||||||
#ifdef __ARCH_WANT_SYS_UTIME
|
|
||||||
|
|
||||||
/*
|
|
||||||
* sys_utime() can be implemented in user-level using sys_utimes().
|
|
||||||
* Is this for backwards compatibility? If so, why not move it
|
|
||||||
* into the appropriate arch directory (for those architectures that
|
|
||||||
* need it).
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* If times==NULL, set access and modification to current time,
|
|
||||||
* must be owner or have write permission.
|
|
||||||
* Else, update from *times, must be owner or super user.
|
|
||||||
*/
|
|
||||||
SYSCALL_DEFINE2(utime, char __user *, filename, struct utimbuf __user *, times)
|
|
||||||
{
|
|
||||||
struct timespec64 tv[2];
|
|
||||||
|
|
||||||
if (times) {
|
|
||||||
if (get_user(tv[0].tv_sec, ×->actime) ||
|
|
||||||
get_user(tv[1].tv_sec, ×->modtime))
|
|
||||||
return -EFAULT;
|
|
||||||
tv[0].tv_nsec = 0;
|
|
||||||
tv[1].tv_nsec = 0;
|
|
||||||
}
|
|
||||||
return do_utimes(AT_FDCWD, filename, times ? tv : NULL, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static bool nsec_valid(long nsec)
|
static bool nsec_valid(long nsec)
|
||||||
{
|
{
|
||||||
if (nsec == UTIME_OMIT || nsec == UTIME_NOW)
|
if (nsec == UTIME_OMIT || nsec == UTIME_NOW)
|
||||||
|
@ -166,7 +137,7 @@ out:
|
||||||
}
|
}
|
||||||
|
|
||||||
SYSCALL_DEFINE4(utimensat, int, dfd, const char __user *, filename,
|
SYSCALL_DEFINE4(utimensat, int, dfd, const char __user *, filename,
|
||||||
struct timespec __user *, utimes, int, flags)
|
struct __kernel_timespec __user *, utimes, int, flags)
|
||||||
{
|
{
|
||||||
struct timespec64 tstimes[2];
|
struct timespec64 tstimes[2];
|
||||||
|
|
||||||
|
@ -184,6 +155,13 @@ SYSCALL_DEFINE4(utimensat, int, dfd, const char __user *, filename,
|
||||||
return do_utimes(dfd, filename, utimes ? tstimes : NULL, flags);
|
return do_utimes(dfd, filename, utimes ? tstimes : NULL, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __ARCH_WANT_SYS_UTIME
|
||||||
|
/*
|
||||||
|
* futimesat(), utimes() and utime() are older versions of utimensat()
|
||||||
|
* that are provided for compatibility with traditional C libraries.
|
||||||
|
* On modern architectures, we always use libc wrappers around
|
||||||
|
* utimensat() instead.
|
||||||
|
*/
|
||||||
static long do_futimesat(int dfd, const char __user *filename,
|
static long do_futimesat(int dfd, const char __user *filename,
|
||||||
struct timeval __user *utimes)
|
struct timeval __user *utimes)
|
||||||
{
|
{
|
||||||
|
@ -225,13 +203,29 @@ SYSCALL_DEFINE2(utimes, char __user *, filename,
|
||||||
return do_futimesat(AT_FDCWD, filename, utimes);
|
return do_futimesat(AT_FDCWD, filename, utimes);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_COMPAT
|
SYSCALL_DEFINE2(utime, char __user *, filename, struct utimbuf __user *, times)
|
||||||
|
{
|
||||||
|
struct timespec64 tv[2];
|
||||||
|
|
||||||
|
if (times) {
|
||||||
|
if (get_user(tv[0].tv_sec, ×->actime) ||
|
||||||
|
get_user(tv[1].tv_sec, ×->modtime))
|
||||||
|
return -EFAULT;
|
||||||
|
tv[0].tv_nsec = 0;
|
||||||
|
tv[1].tv_nsec = 0;
|
||||||
|
}
|
||||||
|
return do_utimes(AT_FDCWD, filename, times ? tv : NULL, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||||
/*
|
/*
|
||||||
* Not all architectures have sys_utime, so implement this in terms
|
* Not all architectures have sys_utime, so implement this in terms
|
||||||
* of sys_utimes.
|
* of sys_utimes.
|
||||||
*/
|
*/
|
||||||
|
#ifdef __ARCH_WANT_SYS_UTIME32
|
||||||
COMPAT_SYSCALL_DEFINE2(utime, const char __user *, filename,
|
COMPAT_SYSCALL_DEFINE2(utime, const char __user *, filename,
|
||||||
struct compat_utimbuf __user *, t)
|
struct old_utimbuf32 __user *, t)
|
||||||
{
|
{
|
||||||
struct timespec64 tv[2];
|
struct timespec64 tv[2];
|
||||||
|
|
||||||
|
@ -244,14 +238,15 @@ COMPAT_SYSCALL_DEFINE2(utime, const char __user *, filename,
|
||||||
}
|
}
|
||||||
return do_utimes(AT_FDCWD, filename, t ? tv : NULL, 0);
|
return do_utimes(AT_FDCWD, filename, t ? tv : NULL, 0);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE4(utimensat, unsigned int, dfd, const char __user *, filename, struct compat_timespec __user *, t, int, flags)
|
COMPAT_SYSCALL_DEFINE4(utimensat, unsigned int, dfd, const char __user *, filename, struct old_timespec32 __user *, t, int, flags)
|
||||||
{
|
{
|
||||||
struct timespec64 tv[2];
|
struct timespec64 tv[2];
|
||||||
|
|
||||||
if (t) {
|
if (t) {
|
||||||
if (compat_get_timespec64(&tv[0], &t[0]) ||
|
if (get_old_timespec32(&tv[0], &t[0]) ||
|
||||||
compat_get_timespec64(&tv[1], &t[1]))
|
get_old_timespec32(&tv[1], &t[1]))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
if (tv[0].tv_nsec == UTIME_OMIT && tv[1].tv_nsec == UTIME_OMIT)
|
if (tv[0].tv_nsec == UTIME_OMIT && tv[1].tv_nsec == UTIME_OMIT)
|
||||||
|
@ -260,8 +255,9 @@ COMPAT_SYSCALL_DEFINE4(utimensat, unsigned int, dfd, const char __user *, filena
|
||||||
return do_utimes(dfd, filename, t ? tv : NULL, flags);
|
return do_utimes(dfd, filename, t ? tv : NULL, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __ARCH_WANT_SYS_UTIME32
|
||||||
static long do_compat_futimesat(unsigned int dfd, const char __user *filename,
|
static long do_compat_futimesat(unsigned int dfd, const char __user *filename,
|
||||||
struct compat_timeval __user *t)
|
struct old_timeval32 __user *t)
|
||||||
{
|
{
|
||||||
struct timespec64 tv[2];
|
struct timespec64 tv[2];
|
||||||
|
|
||||||
|
@ -282,13 +278,14 @@ static long do_compat_futimesat(unsigned int dfd, const char __user *filename,
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE3(futimesat, unsigned int, dfd,
|
COMPAT_SYSCALL_DEFINE3(futimesat, unsigned int, dfd,
|
||||||
const char __user *, filename,
|
const char __user *, filename,
|
||||||
struct compat_timeval __user *, t)
|
struct old_timeval32 __user *, t)
|
||||||
{
|
{
|
||||||
return do_compat_futimesat(dfd, filename, t);
|
return do_compat_futimesat(dfd, filename, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE2(utimes, const char __user *, filename, struct compat_timeval __user *, t)
|
COMPAT_SYSCALL_DEFINE2(utimes, const char __user *, filename, struct old_timeval32 __user *, t)
|
||||||
{
|
{
|
||||||
return do_compat_futimesat(AT_FDCWD, filename, t);
|
return do_compat_futimesat(AT_FDCWD, filename, t);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
|
@ -1,3 +1,25 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
#ifndef __ASM_GENERIC_COMPAT_H
|
||||||
|
#define __ASM_GENERIC_COMPAT_H
|
||||||
|
|
||||||
/* This is an empty stub for 32-bit-only architectures */
|
/* These types are common across all compat ABIs */
|
||||||
|
typedef u32 compat_size_t;
|
||||||
|
typedef s32 compat_ssize_t;
|
||||||
|
typedef s32 compat_clock_t;
|
||||||
|
typedef s32 compat_pid_t;
|
||||||
|
typedef u32 compat_ino_t;
|
||||||
|
typedef s32 compat_off_t;
|
||||||
|
typedef s64 compat_loff_t;
|
||||||
|
typedef s32 compat_daddr_t;
|
||||||
|
typedef s32 compat_timer_t;
|
||||||
|
typedef s32 compat_key_t;
|
||||||
|
typedef s16 compat_short_t;
|
||||||
|
typedef s32 compat_int_t;
|
||||||
|
typedef s32 compat_long_t;
|
||||||
|
typedef u16 compat_ushort_t;
|
||||||
|
typedef u32 compat_uint_t;
|
||||||
|
typedef u32 compat_ulong_t;
|
||||||
|
typedef u32 compat_uptr_t;
|
||||||
|
typedef u32 compat_aio_context_t;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
|
||||||
#include <uapi/asm-generic/unistd.h>
|
|
||||||
#include <linux/export.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* These are required system calls, we should
|
|
||||||
* invert the logic eventually and let them
|
|
||||||
* be selected by default.
|
|
||||||
*/
|
|
||||||
#if __BITS_PER_LONG == 32
|
|
||||||
#define __ARCH_WANT_STAT64
|
|
||||||
#define __ARCH_WANT_SYS_LLSEEK
|
|
||||||
#endif
|
|
|
@ -262,9 +262,6 @@ extern int clocksource_i8253_init(void);
|
||||||
#define TIMER_OF_DECLARE(name, compat, fn) \
|
#define TIMER_OF_DECLARE(name, compat, fn) \
|
||||||
OF_DECLARE_1_RET(timer, name, compat, fn)
|
OF_DECLARE_1_RET(timer, name, compat, fn)
|
||||||
|
|
||||||
#define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \
|
|
||||||
TIMER_OF_DECLARE(name, compat, fn)
|
|
||||||
|
|
||||||
#ifdef CONFIG_TIMER_PROBE
|
#ifdef CONFIG_TIMER_PROBE
|
||||||
extern void timer_probe(void);
|
extern void timer_probe(void);
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/compat_time.h>
|
#include <linux/time.h>
|
||||||
|
|
||||||
#include <linux/stat.h>
|
#include <linux/stat.h>
|
||||||
#include <linux/param.h> /* for HZ */
|
#include <linux/param.h> /* for HZ */
|
||||||
|
@ -113,19 +113,12 @@ typedef struct compat_sigaltstack {
|
||||||
typedef __compat_uid32_t compat_uid_t;
|
typedef __compat_uid32_t compat_uid_t;
|
||||||
typedef __compat_gid32_t compat_gid_t;
|
typedef __compat_gid32_t compat_gid_t;
|
||||||
|
|
||||||
typedef compat_ulong_t compat_aio_context_t;
|
|
||||||
|
|
||||||
struct compat_sel_arg_struct;
|
struct compat_sel_arg_struct;
|
||||||
struct rusage;
|
struct rusage;
|
||||||
|
|
||||||
struct compat_utimbuf {
|
|
||||||
compat_time_t actime;
|
|
||||||
compat_time_t modtime;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct compat_itimerval {
|
struct compat_itimerval {
|
||||||
struct compat_timeval it_interval;
|
struct old_timeval32 it_interval;
|
||||||
struct compat_timeval it_value;
|
struct old_timeval32 it_value;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct itimerval;
|
struct itimerval;
|
||||||
|
@ -149,7 +142,7 @@ struct compat_timex {
|
||||||
compat_long_t constant;
|
compat_long_t constant;
|
||||||
compat_long_t precision;
|
compat_long_t precision;
|
||||||
compat_long_t tolerance;
|
compat_long_t tolerance;
|
||||||
struct compat_timeval time;
|
struct old_timeval32 time;
|
||||||
compat_long_t tick;
|
compat_long_t tick;
|
||||||
compat_long_t ppsfreq;
|
compat_long_t ppsfreq;
|
||||||
compat_long_t jitter;
|
compat_long_t jitter;
|
||||||
|
@ -310,8 +303,8 @@ struct compat_rlimit {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct compat_rusage {
|
struct compat_rusage {
|
||||||
struct compat_timeval ru_utime;
|
struct old_timeval32 ru_utime;
|
||||||
struct compat_timeval ru_stime;
|
struct old_timeval32 ru_stime;
|
||||||
compat_long_t ru_maxrss;
|
compat_long_t ru_maxrss;
|
||||||
compat_long_t ru_ixrss;
|
compat_long_t ru_ixrss;
|
||||||
compat_long_t ru_idrss;
|
compat_long_t ru_idrss;
|
||||||
|
@ -460,8 +453,8 @@ int copy_siginfo_to_user32(struct compat_siginfo __user *to, const kernel_siginf
|
||||||
int get_compat_sigevent(struct sigevent *event,
|
int get_compat_sigevent(struct sigevent *event,
|
||||||
const struct compat_sigevent __user *u_event);
|
const struct compat_sigevent __user *u_event);
|
||||||
|
|
||||||
static inline int compat_timeval_compare(struct compat_timeval *lhs,
|
static inline int old_timeval32_compare(struct old_timeval32 *lhs,
|
||||||
struct compat_timeval *rhs)
|
struct old_timeval32 *rhs)
|
||||||
{
|
{
|
||||||
if (lhs->tv_sec < rhs->tv_sec)
|
if (lhs->tv_sec < rhs->tv_sec)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -470,8 +463,8 @@ static inline int compat_timeval_compare(struct compat_timeval *lhs,
|
||||||
return lhs->tv_usec - rhs->tv_usec;
|
return lhs->tv_usec - rhs->tv_usec;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int compat_timespec_compare(struct compat_timespec *lhs,
|
static inline int old_timespec32_compare(struct old_timespec32 *lhs,
|
||||||
struct compat_timespec *rhs)
|
struct old_timespec32 *rhs)
|
||||||
{
|
{
|
||||||
if (lhs->tv_sec < rhs->tv_sec)
|
if (lhs->tv_sec < rhs->tv_sec)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -555,12 +548,12 @@ asmlinkage long compat_sys_io_getevents(compat_aio_context_t ctx_id,
|
||||||
compat_long_t min_nr,
|
compat_long_t min_nr,
|
||||||
compat_long_t nr,
|
compat_long_t nr,
|
||||||
struct io_event __user *events,
|
struct io_event __user *events,
|
||||||
struct compat_timespec __user *timeout);
|
struct old_timespec32 __user *timeout);
|
||||||
asmlinkage long compat_sys_io_pgetevents(compat_aio_context_t ctx_id,
|
asmlinkage long compat_sys_io_pgetevents(compat_aio_context_t ctx_id,
|
||||||
compat_long_t min_nr,
|
compat_long_t min_nr,
|
||||||
compat_long_t nr,
|
compat_long_t nr,
|
||||||
struct io_event __user *events,
|
struct io_event __user *events,
|
||||||
struct compat_timespec __user *timeout,
|
struct old_timespec32 __user *timeout,
|
||||||
const struct __compat_aio_sigset __user *usig);
|
const struct __compat_aio_sigset __user *usig);
|
||||||
|
|
||||||
/* fs/cookies.c */
|
/* fs/cookies.c */
|
||||||
|
@ -645,11 +638,11 @@ asmlinkage long compat_sys_sendfile64(int out_fd, int in_fd,
|
||||||
asmlinkage long compat_sys_pselect6(int n, compat_ulong_t __user *inp,
|
asmlinkage long compat_sys_pselect6(int n, compat_ulong_t __user *inp,
|
||||||
compat_ulong_t __user *outp,
|
compat_ulong_t __user *outp,
|
||||||
compat_ulong_t __user *exp,
|
compat_ulong_t __user *exp,
|
||||||
struct compat_timespec __user *tsp,
|
struct old_timespec32 __user *tsp,
|
||||||
void __user *sig);
|
void __user *sig);
|
||||||
asmlinkage long compat_sys_ppoll(struct pollfd __user *ufds,
|
asmlinkage long compat_sys_ppoll(struct pollfd __user *ufds,
|
||||||
unsigned int nfds,
|
unsigned int nfds,
|
||||||
struct compat_timespec __user *tsp,
|
struct old_timespec32 __user *tsp,
|
||||||
const compat_sigset_t __user *sigmask,
|
const compat_sigset_t __user *sigmask,
|
||||||
compat_size_t sigsetsize);
|
compat_size_t sigsetsize);
|
||||||
|
|
||||||
|
@ -674,15 +667,15 @@ asmlinkage long compat_sys_newfstat(unsigned int fd,
|
||||||
|
|
||||||
/* fs/timerfd.c */
|
/* fs/timerfd.c */
|
||||||
asmlinkage long compat_sys_timerfd_gettime(int ufd,
|
asmlinkage long compat_sys_timerfd_gettime(int ufd,
|
||||||
struct compat_itimerspec __user *otmr);
|
struct old_itimerspec32 __user *otmr);
|
||||||
asmlinkage long compat_sys_timerfd_settime(int ufd, int flags,
|
asmlinkage long compat_sys_timerfd_settime(int ufd, int flags,
|
||||||
const struct compat_itimerspec __user *utmr,
|
const struct old_itimerspec32 __user *utmr,
|
||||||
struct compat_itimerspec __user *otmr);
|
struct old_itimerspec32 __user *otmr);
|
||||||
|
|
||||||
/* fs/utimes.c */
|
/* fs/utimes.c */
|
||||||
asmlinkage long compat_sys_utimensat(unsigned int dfd,
|
asmlinkage long compat_sys_utimensat(unsigned int dfd,
|
||||||
const char __user *filename,
|
const char __user *filename,
|
||||||
struct compat_timespec __user *t,
|
struct old_timespec32 __user *t,
|
||||||
int flags);
|
int flags);
|
||||||
|
|
||||||
/* kernel/exit.c */
|
/* kernel/exit.c */
|
||||||
|
@ -694,7 +687,7 @@ asmlinkage long compat_sys_waitid(int, compat_pid_t,
|
||||||
|
|
||||||
/* kernel/futex.c */
|
/* kernel/futex.c */
|
||||||
asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,
|
asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,
|
||||||
struct compat_timespec __user *utime, u32 __user *uaddr2,
|
struct old_timespec32 __user *utime, u32 __user *uaddr2,
|
||||||
u32 val3);
|
u32 val3);
|
||||||
asmlinkage long
|
asmlinkage long
|
||||||
compat_sys_set_robust_list(struct compat_robust_list_head __user *head,
|
compat_sys_set_robust_list(struct compat_robust_list_head __user *head,
|
||||||
|
@ -704,8 +697,8 @@ compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,
|
||||||
compat_size_t __user *len_ptr);
|
compat_size_t __user *len_ptr);
|
||||||
|
|
||||||
/* kernel/hrtimer.c */
|
/* kernel/hrtimer.c */
|
||||||
asmlinkage long compat_sys_nanosleep(struct compat_timespec __user *rqtp,
|
asmlinkage long compat_sys_nanosleep(struct old_timespec32 __user *rqtp,
|
||||||
struct compat_timespec __user *rmtp);
|
struct old_timespec32 __user *rmtp);
|
||||||
|
|
||||||
/* kernel/itimer.c */
|
/* kernel/itimer.c */
|
||||||
asmlinkage long compat_sys_getitimer(int which,
|
asmlinkage long compat_sys_getitimer(int which,
|
||||||
|
@ -725,19 +718,19 @@ asmlinkage long compat_sys_timer_create(clockid_t which_clock,
|
||||||
struct compat_sigevent __user *timer_event_spec,
|
struct compat_sigevent __user *timer_event_spec,
|
||||||
timer_t __user *created_timer_id);
|
timer_t __user *created_timer_id);
|
||||||
asmlinkage long compat_sys_timer_gettime(timer_t timer_id,
|
asmlinkage long compat_sys_timer_gettime(timer_t timer_id,
|
||||||
struct compat_itimerspec __user *setting);
|
struct old_itimerspec32 __user *setting);
|
||||||
asmlinkage long compat_sys_timer_settime(timer_t timer_id, int flags,
|
asmlinkage long compat_sys_timer_settime(timer_t timer_id, int flags,
|
||||||
struct compat_itimerspec __user *new,
|
struct old_itimerspec32 __user *new,
|
||||||
struct compat_itimerspec __user *old);
|
struct old_itimerspec32 __user *old);
|
||||||
asmlinkage long compat_sys_clock_settime(clockid_t which_clock,
|
asmlinkage long compat_sys_clock_settime(clockid_t which_clock,
|
||||||
struct compat_timespec __user *tp);
|
struct old_timespec32 __user *tp);
|
||||||
asmlinkage long compat_sys_clock_gettime(clockid_t which_clock,
|
asmlinkage long compat_sys_clock_gettime(clockid_t which_clock,
|
||||||
struct compat_timespec __user *tp);
|
struct old_timespec32 __user *tp);
|
||||||
asmlinkage long compat_sys_clock_getres(clockid_t which_clock,
|
asmlinkage long compat_sys_clock_getres(clockid_t which_clock,
|
||||||
struct compat_timespec __user *tp);
|
struct old_timespec32 __user *tp);
|
||||||
asmlinkage long compat_sys_clock_nanosleep(clockid_t which_clock, int flags,
|
asmlinkage long compat_sys_clock_nanosleep(clockid_t which_clock, int flags,
|
||||||
struct compat_timespec __user *rqtp,
|
struct old_timespec32 __user *rqtp,
|
||||||
struct compat_timespec __user *rmtp);
|
struct old_timespec32 __user *rmtp);
|
||||||
|
|
||||||
/* kernel/ptrace.c */
|
/* kernel/ptrace.c */
|
||||||
asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
|
asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
|
||||||
|
@ -751,7 +744,7 @@ asmlinkage long compat_sys_sched_getaffinity(compat_pid_t pid,
|
||||||
unsigned int len,
|
unsigned int len,
|
||||||
compat_ulong_t __user *user_mask_ptr);
|
compat_ulong_t __user *user_mask_ptr);
|
||||||
asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid,
|
asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid,
|
||||||
struct compat_timespec __user *interval);
|
struct old_timespec32 __user *interval);
|
||||||
|
|
||||||
/* kernel/signal.c */
|
/* kernel/signal.c */
|
||||||
asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr,
|
asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr,
|
||||||
|
@ -771,7 +764,7 @@ asmlinkage long compat_sys_rt_sigpending(compat_sigset_t __user *uset,
|
||||||
compat_size_t sigsetsize);
|
compat_size_t sigsetsize);
|
||||||
asmlinkage long compat_sys_rt_sigtimedwait(compat_sigset_t __user *uthese,
|
asmlinkage long compat_sys_rt_sigtimedwait(compat_sigset_t __user *uthese,
|
||||||
struct compat_siginfo __user *uinfo,
|
struct compat_siginfo __user *uinfo,
|
||||||
struct compat_timespec __user *uts, compat_size_t sigsetsize);
|
struct old_timespec32 __user *uts, compat_size_t sigsetsize);
|
||||||
asmlinkage long compat_sys_rt_sigqueueinfo(compat_pid_t pid, int sig,
|
asmlinkage long compat_sys_rt_sigqueueinfo(compat_pid_t pid, int sig,
|
||||||
struct compat_siginfo __user *uinfo);
|
struct compat_siginfo __user *uinfo);
|
||||||
/* No generic prototype for rt_sigreturn */
|
/* No generic prototype for rt_sigreturn */
|
||||||
|
@ -785,9 +778,9 @@ asmlinkage long compat_sys_setrlimit(unsigned int resource,
|
||||||
asmlinkage long compat_sys_getrusage(int who, struct compat_rusage __user *ru);
|
asmlinkage long compat_sys_getrusage(int who, struct compat_rusage __user *ru);
|
||||||
|
|
||||||
/* kernel/time.c */
|
/* kernel/time.c */
|
||||||
asmlinkage long compat_sys_gettimeofday(struct compat_timeval __user *tv,
|
asmlinkage long compat_sys_gettimeofday(struct old_timeval32 __user *tv,
|
||||||
struct timezone __user *tz);
|
struct timezone __user *tz);
|
||||||
asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv,
|
asmlinkage long compat_sys_settimeofday(struct old_timeval32 __user *tv,
|
||||||
struct timezone __user *tz);
|
struct timezone __user *tz);
|
||||||
asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp);
|
asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp);
|
||||||
|
|
||||||
|
@ -801,11 +794,11 @@ asmlinkage long compat_sys_mq_open(const char __user *u_name,
|
||||||
asmlinkage long compat_sys_mq_timedsend(mqd_t mqdes,
|
asmlinkage long compat_sys_mq_timedsend(mqd_t mqdes,
|
||||||
const char __user *u_msg_ptr,
|
const char __user *u_msg_ptr,
|
||||||
compat_size_t msg_len, unsigned int msg_prio,
|
compat_size_t msg_len, unsigned int msg_prio,
|
||||||
const struct compat_timespec __user *u_abs_timeout);
|
const struct old_timespec32 __user *u_abs_timeout);
|
||||||
asmlinkage ssize_t compat_sys_mq_timedreceive(mqd_t mqdes,
|
asmlinkage ssize_t compat_sys_mq_timedreceive(mqd_t mqdes,
|
||||||
char __user *u_msg_ptr,
|
char __user *u_msg_ptr,
|
||||||
compat_size_t msg_len, unsigned int __user *u_msg_prio,
|
compat_size_t msg_len, unsigned int __user *u_msg_prio,
|
||||||
const struct compat_timespec __user *u_abs_timeout);
|
const struct old_timespec32 __user *u_abs_timeout);
|
||||||
asmlinkage long compat_sys_mq_notify(mqd_t mqdes,
|
asmlinkage long compat_sys_mq_notify(mqd_t mqdes,
|
||||||
const struct compat_sigevent __user *u_notification);
|
const struct compat_sigevent __user *u_notification);
|
||||||
asmlinkage long compat_sys_mq_getsetattr(mqd_t mqdes,
|
asmlinkage long compat_sys_mq_getsetattr(mqd_t mqdes,
|
||||||
|
@ -822,7 +815,7 @@ asmlinkage long compat_sys_msgsnd(int msqid, compat_uptr_t msgp,
|
||||||
/* ipc/sem.c */
|
/* ipc/sem.c */
|
||||||
asmlinkage long compat_sys_semctl(int semid, int semnum, int cmd, int arg);
|
asmlinkage long compat_sys_semctl(int semid, int semnum, int cmd, int arg);
|
||||||
asmlinkage long compat_sys_semtimedop(int semid, struct sembuf __user *tsems,
|
asmlinkage long compat_sys_semtimedop(int semid, struct sembuf __user *tsems,
|
||||||
unsigned nsems, const struct compat_timespec __user *timeout);
|
unsigned nsems, const struct old_timespec32 __user *timeout);
|
||||||
|
|
||||||
/* ipc/shm.c */
|
/* ipc/shm.c */
|
||||||
asmlinkage long compat_sys_shmctl(int first, int second, void __user *uptr);
|
asmlinkage long compat_sys_shmctl(int first, int second, void __user *uptr);
|
||||||
|
@ -879,7 +872,7 @@ asmlinkage long compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid,
|
||||||
struct compat_siginfo __user *uinfo);
|
struct compat_siginfo __user *uinfo);
|
||||||
asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
|
asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
|
||||||
unsigned vlen, unsigned int flags,
|
unsigned vlen, unsigned int flags,
|
||||||
struct compat_timespec __user *timeout);
|
struct old_timespec32 __user *timeout);
|
||||||
asmlinkage long compat_sys_wait4(compat_pid_t pid,
|
asmlinkage long compat_sys_wait4(compat_pid_t pid,
|
||||||
compat_uint_t __user *stat_addr, int options,
|
compat_uint_t __user *stat_addr, int options,
|
||||||
struct compat_rusage __user *ru);
|
struct compat_rusage __user *ru);
|
||||||
|
@ -931,7 +924,7 @@ asmlinkage long compat_sys_pwritev64v2(unsigned long fd,
|
||||||
asmlinkage long compat_sys_open(const char __user *filename, int flags,
|
asmlinkage long compat_sys_open(const char __user *filename, int flags,
|
||||||
umode_t mode);
|
umode_t mode);
|
||||||
asmlinkage long compat_sys_utimes(const char __user *filename,
|
asmlinkage long compat_sys_utimes(const char __user *filename,
|
||||||
struct compat_timeval __user *t);
|
struct old_timeval32 __user *t);
|
||||||
|
|
||||||
/* __ARCH_WANT_SYSCALL_NO_FLAGS */
|
/* __ARCH_WANT_SYSCALL_NO_FLAGS */
|
||||||
asmlinkage long compat_sys_signalfd(int ufd,
|
asmlinkage long compat_sys_signalfd(int ufd,
|
||||||
|
@ -945,15 +938,15 @@ asmlinkage long compat_sys_newlstat(const char __user *filename,
|
||||||
struct compat_stat __user *statbuf);
|
struct compat_stat __user *statbuf);
|
||||||
|
|
||||||
/* __ARCH_WANT_SYSCALL_DEPRECATED */
|
/* __ARCH_WANT_SYSCALL_DEPRECATED */
|
||||||
asmlinkage long compat_sys_time(compat_time_t __user *tloc);
|
asmlinkage long compat_sys_time(old_time32_t __user *tloc);
|
||||||
asmlinkage long compat_sys_utime(const char __user *filename,
|
asmlinkage long compat_sys_utime(const char __user *filename,
|
||||||
struct compat_utimbuf __user *t);
|
struct old_utimbuf32 __user *t);
|
||||||
asmlinkage long compat_sys_futimesat(unsigned int dfd,
|
asmlinkage long compat_sys_futimesat(unsigned int dfd,
|
||||||
const char __user *filename,
|
const char __user *filename,
|
||||||
struct compat_timeval __user *t);
|
struct old_timeval32 __user *t);
|
||||||
asmlinkage long compat_sys_select(int n, compat_ulong_t __user *inp,
|
asmlinkage long compat_sys_select(int n, compat_ulong_t __user *inp,
|
||||||
compat_ulong_t __user *outp, compat_ulong_t __user *exp,
|
compat_ulong_t __user *outp, compat_ulong_t __user *exp,
|
||||||
struct compat_timeval __user *tvp);
|
struct old_timeval32 __user *tvp);
|
||||||
asmlinkage long compat_sys_ustat(unsigned dev, struct compat_ustat __user *u32);
|
asmlinkage long compat_sys_ustat(unsigned dev, struct compat_ustat __user *u32);
|
||||||
asmlinkage long compat_sys_recv(int fd, void __user *buf, compat_size_t len,
|
asmlinkage long compat_sys_recv(int fd, void __user *buf, compat_size_t len,
|
||||||
unsigned flags);
|
unsigned flags);
|
||||||
|
@ -986,7 +979,7 @@ asmlinkage long compat_sys_sigaction(int sig,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* obsolete: kernel/time/time.c */
|
/* obsolete: kernel/time/time.c */
|
||||||
asmlinkage long compat_sys_stime(compat_time_t __user *tptr);
|
asmlinkage long compat_sys_stime(old_time32_t __user *tptr);
|
||||||
|
|
||||||
/* obsolete: net/socket.c */
|
/* obsolete: net/socket.c */
|
||||||
asmlinkage long compat_sys_socketcall(int call, u32 __user *args);
|
asmlinkage long compat_sys_socketcall(int call, u32 __user *args);
|
||||||
|
@ -1005,15 +998,15 @@ static inline bool in_compat_syscall(void) { return is_compat_task(); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ns_to_compat_timeval - Compat version of ns_to_timeval
|
* ns_to_old_timeval32 - Compat version of ns_to_timeval
|
||||||
* @nsec: the nanoseconds value to be converted
|
* @nsec: the nanoseconds value to be converted
|
||||||
*
|
*
|
||||||
* Returns the compat_timeval representation of the nsec parameter.
|
* Returns the old_timeval32 representation of the nsec parameter.
|
||||||
*/
|
*/
|
||||||
static inline struct compat_timeval ns_to_compat_timeval(s64 nsec)
|
static inline struct old_timeval32 ns_to_old_timeval32(s64 nsec)
|
||||||
{
|
{
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
struct compat_timeval ctv;
|
struct old_timeval32 ctv;
|
||||||
|
|
||||||
tv = ns_to_timeval(nsec);
|
tv = ns_to_timeval(nsec);
|
||||||
ctv.tv_sec = tv.tv_sec;
|
ctv.tv_sec = tv.tv_sec;
|
||||||
|
|
|
@ -1,32 +0,0 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
|
||||||
#ifndef _LINUX_COMPAT_TIME_H
|
|
||||||
#define _LINUX_COMPAT_TIME_H
|
|
||||||
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/time64.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;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct compat_itimerspec {
|
|
||||||
struct compat_timespec it_interval;
|
|
||||||
struct compat_timespec it_value;
|
|
||||||
};
|
|
||||||
|
|
||||||
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,
|
|
||||||
struct compat_itimerspec __user *uits);
|
|
||||||
|
|
||||||
#endif /* _LINUX_COMPAT_TIME_H */
|
|
|
@ -27,10 +27,10 @@ struct compat_elf_prstatus
|
||||||
compat_pid_t pr_ppid;
|
compat_pid_t pr_ppid;
|
||||||
compat_pid_t pr_pgrp;
|
compat_pid_t pr_pgrp;
|
||||||
compat_pid_t pr_sid;
|
compat_pid_t pr_sid;
|
||||||
struct compat_timeval pr_utime;
|
struct old_timeval32 pr_utime;
|
||||||
struct compat_timeval pr_stime;
|
struct old_timeval32 pr_stime;
|
||||||
struct compat_timeval pr_cutime;
|
struct old_timeval32 pr_cutime;
|
||||||
struct compat_timeval pr_cstime;
|
struct old_timeval32 pr_cstime;
|
||||||
compat_elf_gregset_t pr_reg;
|
compat_elf_gregset_t pr_reg;
|
||||||
#ifdef CONFIG_BINFMT_ELF_FDPIC
|
#ifdef CONFIG_BINFMT_ELF_FDPIC
|
||||||
compat_ulong_t pr_exec_fdpic_loadmap;
|
compat_ulong_t pr_exec_fdpic_loadmap;
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
#include <linux/time64.h>
|
#include <linux/time64.h>
|
||||||
|
|
||||||
struct timespec;
|
struct timespec;
|
||||||
struct compat_timespec;
|
struct old_timespec32;
|
||||||
struct pollfd;
|
struct pollfd;
|
||||||
|
|
||||||
enum timespec_type {
|
enum timespec_type {
|
||||||
|
@ -40,7 +40,7 @@ struct restart_block {
|
||||||
enum timespec_type type;
|
enum timespec_type type;
|
||||||
union {
|
union {
|
||||||
struct __kernel_timespec __user *rmtp;
|
struct __kernel_timespec __user *rmtp;
|
||||||
struct compat_timespec __user *compat_rmtp;
|
struct old_timespec32 __user *compat_rmtp;
|
||||||
};
|
};
|
||||||
u64 expires;
|
u64 expires;
|
||||||
} nanosleep;
|
} nanosleep;
|
||||||
|
|
|
@ -348,7 +348,7 @@ struct ucred {
|
||||||
extern int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr_storage *kaddr);
|
extern int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr_storage *kaddr);
|
||||||
extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data);
|
extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data);
|
||||||
|
|
||||||
struct timespec;
|
struct timespec64;
|
||||||
|
|
||||||
/* The __sys_...msg variants allow MSG_CMSG_COMPAT iff
|
/* The __sys_...msg variants allow MSG_CMSG_COMPAT iff
|
||||||
* forbid_cmsg_compat==false
|
* forbid_cmsg_compat==false
|
||||||
|
@ -358,7 +358,7 @@ extern long __sys_recvmsg(int fd, struct user_msghdr __user *msg,
|
||||||
extern long __sys_sendmsg(int fd, struct user_msghdr __user *msg,
|
extern long __sys_sendmsg(int fd, struct user_msghdr __user *msg,
|
||||||
unsigned int flags, bool forbid_cmsg_compat);
|
unsigned int flags, bool forbid_cmsg_compat);
|
||||||
extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
|
extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
|
||||||
unsigned int flags, struct timespec *timeout);
|
unsigned int flags, struct timespec64 *timeout);
|
||||||
extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg,
|
extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg,
|
||||||
unsigned int vlen, unsigned int flags,
|
unsigned int vlen, unsigned int flags,
|
||||||
bool forbid_cmsg_compat);
|
bool forbid_cmsg_compat);
|
||||||
|
|
|
@ -60,7 +60,7 @@ struct tms;
|
||||||
struct utimbuf;
|
struct utimbuf;
|
||||||
struct mq_attr;
|
struct mq_attr;
|
||||||
struct compat_stat;
|
struct compat_stat;
|
||||||
struct compat_timeval;
|
struct old_timeval32;
|
||||||
struct robust_list_head;
|
struct robust_list_head;
|
||||||
struct getcpu_cache;
|
struct getcpu_cache;
|
||||||
struct old_linux_dirent;
|
struct old_linux_dirent;
|
||||||
|
@ -513,7 +513,8 @@ asmlinkage long sys_timerfd_gettime(int ufd, struct __kernel_itimerspec __user *
|
||||||
|
|
||||||
/* fs/utimes.c */
|
/* fs/utimes.c */
|
||||||
asmlinkage long sys_utimensat(int dfd, const char __user *filename,
|
asmlinkage long sys_utimensat(int dfd, const char __user *filename,
|
||||||
struct timespec __user *utimes, int flags);
|
struct __kernel_timespec __user *utimes,
|
||||||
|
int flags);
|
||||||
|
|
||||||
/* kernel/acct.c */
|
/* kernel/acct.c */
|
||||||
asmlinkage long sys_acct(const char __user *name);
|
asmlinkage long sys_acct(const char __user *name);
|
||||||
|
@ -613,7 +614,7 @@ asmlinkage long sys_sched_yield(void);
|
||||||
asmlinkage long sys_sched_get_priority_max(int policy);
|
asmlinkage long sys_sched_get_priority_max(int policy);
|
||||||
asmlinkage long sys_sched_get_priority_min(int policy);
|
asmlinkage long sys_sched_get_priority_min(int policy);
|
||||||
asmlinkage long sys_sched_rr_get_interval(pid_t pid,
|
asmlinkage long sys_sched_rr_get_interval(pid_t pid,
|
||||||
struct timespec __user *interval);
|
struct __kernel_timespec __user *interval);
|
||||||
|
|
||||||
/* kernel/signal.c */
|
/* kernel/signal.c */
|
||||||
asmlinkage long sys_restart_syscall(void);
|
asmlinkage long sys_restart_syscall(void);
|
||||||
|
@ -634,7 +635,7 @@ asmlinkage long sys_rt_sigprocmask(int how, sigset_t __user *set,
|
||||||
asmlinkage long sys_rt_sigpending(sigset_t __user *set, size_t sigsetsize);
|
asmlinkage long sys_rt_sigpending(sigset_t __user *set, size_t sigsetsize);
|
||||||
asmlinkage long sys_rt_sigtimedwait(const sigset_t __user *uthese,
|
asmlinkage long sys_rt_sigtimedwait(const sigset_t __user *uthese,
|
||||||
siginfo_t __user *uinfo,
|
siginfo_t __user *uinfo,
|
||||||
const struct timespec __user *uts,
|
const struct __kernel_timespec __user *uts,
|
||||||
size_t sigsetsize);
|
size_t sigsetsize);
|
||||||
asmlinkage long sys_rt_sigqueueinfo(pid_t pid, int sig, siginfo_t __user *uinfo);
|
asmlinkage long sys_rt_sigqueueinfo(pid_t pid, int sig, siginfo_t __user *uinfo);
|
||||||
|
|
||||||
|
@ -829,7 +830,7 @@ asmlinkage long sys_perf_event_open(
|
||||||
asmlinkage long sys_accept4(int, struct sockaddr __user *, int __user *, int);
|
asmlinkage long sys_accept4(int, struct sockaddr __user *, int __user *, int);
|
||||||
asmlinkage long sys_recvmmsg(int fd, struct mmsghdr __user *msg,
|
asmlinkage long sys_recvmmsg(int fd, struct mmsghdr __user *msg,
|
||||||
unsigned int vlen, unsigned flags,
|
unsigned int vlen, unsigned flags,
|
||||||
struct timespec __user *timeout);
|
struct __kernel_timespec __user *timeout);
|
||||||
|
|
||||||
asmlinkage long sys_wait4(pid_t pid, int __user *stat_addr,
|
asmlinkage long sys_wait4(pid_t pid, int __user *stat_addr,
|
||||||
int options, struct rusage __user *ru);
|
int options, struct rusage __user *ru);
|
||||||
|
@ -954,8 +955,6 @@ asmlinkage long sys_access(const char __user *filename, int mode);
|
||||||
asmlinkage long sys_rename(const char __user *oldname,
|
asmlinkage long sys_rename(const char __user *oldname,
|
||||||
const char __user *newname);
|
const char __user *newname);
|
||||||
asmlinkage long sys_symlink(const char __user *old, const char __user *new);
|
asmlinkage long sys_symlink(const char __user *old, const char __user *new);
|
||||||
asmlinkage long sys_utimes(char __user *filename,
|
|
||||||
struct timeval __user *utimes);
|
|
||||||
#if defined(__ARCH_WANT_STAT64) || defined(__ARCH_WANT_COMPAT_STAT64)
|
#if defined(__ARCH_WANT_STAT64) || defined(__ARCH_WANT_COMPAT_STAT64)
|
||||||
asmlinkage long sys_stat64(const char __user *filename,
|
asmlinkage long sys_stat64(const char __user *filename,
|
||||||
struct stat64 __user *statbuf);
|
struct stat64 __user *statbuf);
|
||||||
|
@ -985,14 +984,18 @@ asmlinkage long sys_alarm(unsigned int seconds);
|
||||||
asmlinkage long sys_getpgrp(void);
|
asmlinkage long sys_getpgrp(void);
|
||||||
asmlinkage long sys_pause(void);
|
asmlinkage long sys_pause(void);
|
||||||
asmlinkage long sys_time(time_t __user *tloc);
|
asmlinkage long sys_time(time_t __user *tloc);
|
||||||
|
#ifdef __ARCH_WANT_SYS_UTIME
|
||||||
asmlinkage long sys_utime(char __user *filename,
|
asmlinkage long sys_utime(char __user *filename,
|
||||||
struct utimbuf __user *times);
|
struct utimbuf __user *times);
|
||||||
|
asmlinkage long sys_utimes(char __user *filename,
|
||||||
|
struct timeval __user *utimes);
|
||||||
|
asmlinkage long sys_futimesat(int dfd, const char __user *filename,
|
||||||
|
struct timeval __user *utimes);
|
||||||
|
#endif
|
||||||
asmlinkage long sys_creat(const char __user *pathname, umode_t mode);
|
asmlinkage long sys_creat(const char __user *pathname, umode_t mode);
|
||||||
asmlinkage long sys_getdents(unsigned int fd,
|
asmlinkage long sys_getdents(unsigned int fd,
|
||||||
struct linux_dirent __user *dirent,
|
struct linux_dirent __user *dirent,
|
||||||
unsigned int count);
|
unsigned int count);
|
||||||
asmlinkage long sys_futimesat(int dfd, const char __user *filename,
|
|
||||||
struct timeval __user *utimes);
|
|
||||||
asmlinkage long sys_select(int n, fd_set __user *inp, fd_set __user *outp,
|
asmlinkage long sys_select(int n, fd_set __user *inp, fd_set __user *outp,
|
||||||
fd_set __user *exp, struct timeval __user *tvp);
|
fd_set __user *exp, struct timeval __user *tvp);
|
||||||
asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds,
|
asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds,
|
||||||
|
|
|
@ -13,6 +13,36 @@
|
||||||
|
|
||||||
#define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
|
#define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
|
||||||
|
|
||||||
|
typedef s32 old_time32_t;
|
||||||
|
|
||||||
|
struct old_timespec32 {
|
||||||
|
old_time32_t tv_sec;
|
||||||
|
s32 tv_nsec;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct old_timeval32 {
|
||||||
|
old_time32_t tv_sec;
|
||||||
|
s32 tv_usec;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct old_itimerspec32 {
|
||||||
|
struct old_timespec32 it_interval;
|
||||||
|
struct old_timespec32 it_value;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct old_utimbuf32 {
|
||||||
|
old_time32_t actime;
|
||||||
|
old_time32_t modtime;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern int get_old_timespec32(struct timespec64 *, const void __user *);
|
||||||
|
extern int put_old_timespec32(const struct timespec64 *, void __user *);
|
||||||
|
extern int get_old_itimerspec32(struct itimerspec64 *its,
|
||||||
|
const struct old_itimerspec32 __user *uits);
|
||||||
|
extern int put_old_itimerspec32(const struct itimerspec64 *its,
|
||||||
|
struct old_itimerspec32 __user *uits);
|
||||||
|
|
||||||
|
|
||||||
#if __BITS_PER_LONG == 64
|
#if __BITS_PER_LONG == 64
|
||||||
|
|
||||||
/* timespec64 is defined as timespec here */
|
/* timespec64 is defined as timespec here */
|
||||||
|
@ -105,16 +135,6 @@ static inline bool timespec_valid(const struct timespec *ts)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool timespec_valid_strict(const struct timespec *ts)
|
|
||||||
{
|
|
||||||
if (!timespec_valid(ts))
|
|
||||||
return false;
|
|
||||||
/* Disallow values that could overflow ktime_t */
|
|
||||||
if ((unsigned long long)ts->tv_sec >= KTIME_SEC_MAX)
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* timespec_to_ns - Convert timespec to nanoseconds
|
* timespec_to_ns - Convert timespec to nanoseconds
|
||||||
* @ts: pointer to the timespec variable to be converted
|
* @ts: pointer to the timespec variable to be converted
|
||||||
|
@ -149,19 +169,6 @@ static __always_inline void timespec_add_ns(struct timespec *a, u64 ns)
|
||||||
a->tv_nsec = ns;
|
a->tv_nsec = ns;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* time_to_tm - converts the calendar time to local broken-down time
|
|
||||||
*
|
|
||||||
* @totalsecs the number of seconds elapsed since 00:00:00 on January 1, 1970,
|
|
||||||
* Coordinated Universal Time (UTC).
|
|
||||||
* @offset offset seconds adding to totalsecs.
|
|
||||||
* @result pointer to struct tm variable to receive broken-down time
|
|
||||||
*/
|
|
||||||
static inline void time_to_tm(time_t totalsecs, int offset, struct tm *result)
|
|
||||||
{
|
|
||||||
time64_to_tm(totalsecs, offset, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned long mktime(const unsigned int year,
|
static inline unsigned long mktime(const unsigned int year,
|
||||||
const unsigned int mon, const unsigned int day,
|
const unsigned int mon, const unsigned int day,
|
||||||
const unsigned int hour, const unsigned int min,
|
const unsigned int hour, const unsigned int min,
|
||||||
|
@ -183,8 +190,6 @@ static inline bool timeval_valid(const struct timeval *tv)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern struct timespec timespec_trunc(struct timespec t, unsigned int gran);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* timeval_to_ns - Convert timeval to nanoseconds
|
* timeval_to_ns - Convert timeval to nanoseconds
|
||||||
* @ts: pointer to the timeval variable to be converted
|
* @ts: pointer to the timeval variable to be converted
|
||||||
|
@ -208,18 +213,17 @@ extern struct timeval ns_to_timeval(const s64 nsec);
|
||||||
extern struct __kernel_old_timeval ns_to_kernel_old_timeval(s64 nsec);
|
extern struct __kernel_old_timeval ns_to_kernel_old_timeval(s64 nsec);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* New aliases for compat time functions. These will be used to replace
|
* Old names for the 32-bit time_t interfaces, these will be removed
|
||||||
* the compat code so it can be shared between 32-bit and 64-bit builds
|
* when everything uses the new names.
|
||||||
* both of which provide compatibility with old 32-bit tasks.
|
|
||||||
*/
|
*/
|
||||||
#define old_time32_t compat_time_t
|
#define compat_time_t old_time32_t
|
||||||
#define old_timeval32 compat_timeval
|
#define compat_timeval old_timeval32
|
||||||
#define old_timespec32 compat_timespec
|
#define compat_timespec old_timespec32
|
||||||
#define old_itimerspec32 compat_itimerspec
|
#define compat_itimerspec old_itimerspec32
|
||||||
#define ns_to_old_timeval32 ns_to_compat_timeval
|
#define ns_to_compat_timeval ns_to_old_timeval32
|
||||||
#define get_old_itimerspec32 get_compat_itimerspec64
|
#define get_compat_itimerspec64 get_old_itimerspec32
|
||||||
#define put_old_itimerspec32 put_compat_itimerspec64
|
#define put_compat_itimerspec64 put_old_itimerspec32
|
||||||
#define get_old_timespec32 compat_get_timespec64
|
#define compat_get_timespec64 get_old_timespec32
|
||||||
#define put_old_timespec32 compat_put_timespec64
|
#define compat_put_timespec64 put_old_timespec32
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -266,9 +266,6 @@ extern int update_persistent_clock64(struct timespec64 now);
|
||||||
* deprecated aliases, don't use in new code
|
* deprecated aliases, don't use in new code
|
||||||
*/
|
*/
|
||||||
#define getnstimeofday64(ts) ktime_get_real_ts64(ts)
|
#define getnstimeofday64(ts) ktime_get_real_ts64(ts)
|
||||||
#define get_monotonic_boottime64(ts) ktime_get_boottime_ts64(ts)
|
|
||||||
#define getrawmonotonic64(ts) ktime_get_raw_ts64(ts)
|
|
||||||
#define timekeeping_clocktai64(ts) ktime_get_clocktai_ts64(ts)
|
|
||||||
|
|
||||||
static inline struct timespec64 current_kernel_time64(void)
|
static inline struct timespec64 current_kernel_time64(void)
|
||||||
{
|
{
|
||||||
|
@ -279,13 +276,4 @@ static inline struct timespec64 current_kernel_time64(void)
|
||||||
return ts;
|
return ts;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct timespec64 get_monotonic_coarse64(void)
|
|
||||||
{
|
|
||||||
struct timespec64 ts;
|
|
||||||
|
|
||||||
ktime_get_coarse_ts64(&ts);
|
|
||||||
|
|
||||||
return ts;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -6,27 +6,18 @@
|
||||||
* over time so we can remove the file here.
|
* over time so we can remove the file here.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern void do_gettimeofday(struct timeval *tv);
|
static inline void do_gettimeofday(struct timeval *tv)
|
||||||
unsigned long get_seconds(void);
|
|
||||||
|
|
||||||
static inline struct timespec current_kernel_time(void)
|
|
||||||
{
|
{
|
||||||
struct timespec64 ts64;
|
struct timespec64 now;
|
||||||
|
|
||||||
ktime_get_coarse_real_ts64(&ts64);
|
ktime_get_real_ts64(&now);
|
||||||
|
tv->tv_sec = now.tv_sec;
|
||||||
return timespec64_to_timespec(ts64);
|
tv->tv_usec = now.tv_nsec/1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
static inline unsigned long get_seconds(void)
|
||||||
* Deprecated. Use do_settimeofday64().
|
|
||||||
*/
|
|
||||||
static inline int do_settimeofday(const struct timespec *ts)
|
|
||||||
{
|
{
|
||||||
struct timespec64 ts64;
|
return ktime_get_real_seconds();
|
||||||
|
|
||||||
ts64 = timespec_to_timespec64(*ts);
|
|
||||||
return do_settimeofday64(&ts64);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void getnstimeofday(struct timespec *ts)
|
static inline void getnstimeofday(struct timespec *ts)
|
||||||
|
@ -45,14 +36,6 @@ static inline void ktime_get_ts(struct timespec *ts)
|
||||||
*ts = timespec64_to_timespec(ts64);
|
*ts = timespec64_to_timespec(ts64);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void ktime_get_real_ts(struct timespec *ts)
|
|
||||||
{
|
|
||||||
struct timespec64 ts64;
|
|
||||||
|
|
||||||
ktime_get_real_ts64(&ts64);
|
|
||||||
*ts = timespec64_to_timespec(ts64);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void getrawmonotonic(struct timespec *ts)
|
static inline void getrawmonotonic(struct timespec *ts)
|
||||||
{
|
{
|
||||||
struct timespec64 ts64;
|
struct timespec64 ts64;
|
||||||
|
@ -61,15 +44,6 @@ static inline void getrawmonotonic(struct timespec *ts)
|
||||||
*ts = timespec64_to_timespec(ts64);
|
*ts = timespec64_to_timespec(ts64);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct timespec get_monotonic_coarse(void)
|
|
||||||
{
|
|
||||||
struct timespec64 ts64;
|
|
||||||
|
|
||||||
ktime_get_coarse_ts64(&ts64);
|
|
||||||
|
|
||||||
return timespec64_to_timespec(ts64);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void getboottime(struct timespec *ts)
|
static inline void getboottime(struct timespec *ts)
|
||||||
{
|
{
|
||||||
struct timespec64 ts64;
|
struct timespec64 ts64;
|
||||||
|
@ -78,19 +52,6 @@ static inline void getboottime(struct timespec *ts)
|
||||||
*ts = timespec64_to_timespec(ts64);
|
*ts = timespec64_to_timespec(ts64);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Timespec interfaces utilizing the ktime based ones
|
|
||||||
*/
|
|
||||||
static inline void get_monotonic_boottime(struct timespec *ts)
|
|
||||||
{
|
|
||||||
*ts = ktime_to_timespec(ktime_get_boottime());
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void timekeeping_clocktai(struct timespec *ts)
|
|
||||||
{
|
|
||||||
*ts = ktime_to_timespec(ktime_get_clocktai());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Persistent clock related interfaces
|
* Persistent clock related interfaces
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -242,10 +242,12 @@ __SYSCALL(__NR_tee, sys_tee)
|
||||||
/* fs/stat.c */
|
/* fs/stat.c */
|
||||||
#define __NR_readlinkat 78
|
#define __NR_readlinkat 78
|
||||||
__SYSCALL(__NR_readlinkat, sys_readlinkat)
|
__SYSCALL(__NR_readlinkat, sys_readlinkat)
|
||||||
|
#if defined(__ARCH_WANT_NEW_STAT) || defined(__ARCH_WANT_STAT64)
|
||||||
#define __NR3264_fstatat 79
|
#define __NR3264_fstatat 79
|
||||||
__SC_3264(__NR3264_fstatat, sys_fstatat64, sys_newfstatat)
|
__SC_3264(__NR3264_fstatat, sys_fstatat64, sys_newfstatat)
|
||||||
#define __NR3264_fstat 80
|
#define __NR3264_fstat 80
|
||||||
__SC_3264(__NR3264_fstat, sys_fstat64, sys_newfstat)
|
__SC_3264(__NR3264_fstat, sys_fstat64, sys_newfstat)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* fs/sync.c */
|
/* fs/sync.c */
|
||||||
#define __NR_sync 81
|
#define __NR_sync 81
|
||||||
|
|
|
@ -1461,10 +1461,10 @@ COMPAT_SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||||
static int compat_prepare_timeout(const struct compat_timespec __user *p,
|
static int compat_prepare_timeout(const struct old_timespec32 __user *p,
|
||||||
struct timespec64 *ts)
|
struct timespec64 *ts)
|
||||||
{
|
{
|
||||||
if (compat_get_timespec64(ts, p))
|
if (get_old_timespec32(ts, p))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (!timespec64_valid(ts))
|
if (!timespec64_valid(ts))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -1474,7 +1474,7 @@ static int compat_prepare_timeout(const struct compat_timespec __user *p,
|
||||||
COMPAT_SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes,
|
COMPAT_SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes,
|
||||||
const char __user *, u_msg_ptr,
|
const char __user *, u_msg_ptr,
|
||||||
compat_size_t, msg_len, unsigned int, msg_prio,
|
compat_size_t, msg_len, unsigned int, msg_prio,
|
||||||
const struct compat_timespec __user *, u_abs_timeout)
|
const struct old_timespec32 __user *, u_abs_timeout)
|
||||||
{
|
{
|
||||||
struct timespec64 ts, *p = NULL;
|
struct timespec64 ts, *p = NULL;
|
||||||
if (u_abs_timeout) {
|
if (u_abs_timeout) {
|
||||||
|
@ -1489,7 +1489,7 @@ COMPAT_SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes,
|
||||||
COMPAT_SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes,
|
COMPAT_SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes,
|
||||||
char __user *, u_msg_ptr,
|
char __user *, u_msg_ptr,
|
||||||
compat_size_t, msg_len, unsigned int __user *, u_msg_prio,
|
compat_size_t, msg_len, unsigned int __user *, u_msg_prio,
|
||||||
const struct compat_timespec __user *, u_abs_timeout)
|
const struct old_timespec32 __user *, u_abs_timeout)
|
||||||
{
|
{
|
||||||
struct timespec64 ts, *p = NULL;
|
struct timespec64 ts, *p = NULL;
|
||||||
if (u_abs_timeout) {
|
if (u_abs_timeout) {
|
||||||
|
|
|
@ -622,9 +622,9 @@ struct compat_msqid_ds {
|
||||||
struct compat_ipc_perm msg_perm;
|
struct compat_ipc_perm msg_perm;
|
||||||
compat_uptr_t msg_first;
|
compat_uptr_t msg_first;
|
||||||
compat_uptr_t msg_last;
|
compat_uptr_t msg_last;
|
||||||
compat_time_t msg_stime;
|
old_time32_t msg_stime;
|
||||||
compat_time_t msg_rtime;
|
old_time32_t msg_rtime;
|
||||||
compat_time_t msg_ctime;
|
old_time32_t msg_ctime;
|
||||||
compat_ulong_t msg_lcbytes;
|
compat_ulong_t msg_lcbytes;
|
||||||
compat_ulong_t msg_lqbytes;
|
compat_ulong_t msg_lqbytes;
|
||||||
unsigned short msg_cbytes;
|
unsigned short msg_cbytes;
|
||||||
|
|
10
ipc/sem.c
10
ipc/sem.c
|
@ -1698,8 +1698,8 @@ SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, unsigned long, arg)
|
||||||
|
|
||||||
struct compat_semid_ds {
|
struct compat_semid_ds {
|
||||||
struct compat_ipc_perm sem_perm;
|
struct compat_ipc_perm sem_perm;
|
||||||
compat_time_t sem_otime;
|
old_time32_t sem_otime;
|
||||||
compat_time_t sem_ctime;
|
old_time32_t sem_ctime;
|
||||||
compat_uptr_t sem_base;
|
compat_uptr_t sem_base;
|
||||||
compat_uptr_t sem_pending;
|
compat_uptr_t sem_pending;
|
||||||
compat_uptr_t sem_pending_last;
|
compat_uptr_t sem_pending_last;
|
||||||
|
@ -2214,11 +2214,11 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
|
||||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||||
long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
|
long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
|
||||||
unsigned int nsops,
|
unsigned int nsops,
|
||||||
const struct compat_timespec __user *timeout)
|
const struct old_timespec32 __user *timeout)
|
||||||
{
|
{
|
||||||
if (timeout) {
|
if (timeout) {
|
||||||
struct timespec64 ts;
|
struct timespec64 ts;
|
||||||
if (compat_get_timespec64(&ts, timeout))
|
if (get_old_timespec32(&ts, timeout))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return do_semtimedop(semid, tsems, nsops, &ts);
|
return do_semtimedop(semid, tsems, nsops, &ts);
|
||||||
}
|
}
|
||||||
|
@ -2227,7 +2227,7 @@ long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsems,
|
COMPAT_SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsems,
|
||||||
unsigned int, nsops,
|
unsigned int, nsops,
|
||||||
const struct compat_timespec __user *, timeout)
|
const struct old_timespec32 __user *, timeout)
|
||||||
{
|
{
|
||||||
return compat_ksys_semtimedop(semid, tsems, nsops, timeout);
|
return compat_ksys_semtimedop(semid, tsems, nsops, timeout);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1202,9 +1202,9 @@ SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf)
|
||||||
struct compat_shmid_ds {
|
struct compat_shmid_ds {
|
||||||
struct compat_ipc_perm shm_perm;
|
struct compat_ipc_perm shm_perm;
|
||||||
int shm_segsz;
|
int shm_segsz;
|
||||||
compat_time_t shm_atime;
|
old_time32_t shm_atime;
|
||||||
compat_time_t shm_dtime;
|
old_time32_t shm_dtime;
|
||||||
compat_time_t shm_ctime;
|
old_time32_t shm_ctime;
|
||||||
compat_ipc_pid_t shm_cpid;
|
compat_ipc_pid_t shm_cpid;
|
||||||
compat_ipc_pid_t shm_lpid;
|
compat_ipc_pid_t shm_lpid;
|
||||||
unsigned short shm_nattch;
|
unsigned short shm_nattch;
|
||||||
|
|
|
@ -35,7 +35,7 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,
|
||||||
(const struct __kernel_timespec __user *)fifth);
|
(const struct __kernel_timespec __user *)fifth);
|
||||||
else if (IS_ENABLED(CONFIG_COMPAT_32BIT_TIME))
|
else if (IS_ENABLED(CONFIG_COMPAT_32BIT_TIME))
|
||||||
return compat_ksys_semtimedop(first, ptr, second,
|
return compat_ksys_semtimedop(first, ptr, second,
|
||||||
(const struct compat_timespec __user *)fifth);
|
(const struct old_timespec32 __user *)fifth);
|
||||||
else
|
else
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
|
|
||||||
|
|
|
@ -266,7 +266,7 @@ long ksys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf);
|
||||||
/* for CONFIG_ARCH_WANT_OLD_COMPAT_IPC */
|
/* for CONFIG_ARCH_WANT_OLD_COMPAT_IPC */
|
||||||
long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
|
long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
|
||||||
unsigned int nsops,
|
unsigned int nsops,
|
||||||
const struct compat_timespec __user *timeout);
|
const struct old_timespec32 __user *timeout);
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
long compat_ksys_semctl(int semid, int semnum, int cmd, int arg);
|
long compat_ksys_semctl(int semid, int semnum, int cmd, int arg);
|
||||||
long compat_ksys_msgctl(int msqid, int cmd, void __user *uptr);
|
long compat_ksys_msgctl(int msqid, int cmd, void __user *uptr);
|
||||||
|
|
|
@ -93,28 +93,28 @@ int compat_put_timex(struct compat_timex __user *utp, const struct timex *txc)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __compat_get_timeval(struct timeval *tv, const struct compat_timeval __user *ctv)
|
static int __compat_get_timeval(struct timeval *tv, const struct old_timeval32 __user *ctv)
|
||||||
{
|
{
|
||||||
return (!access_ok(VERIFY_READ, ctv, sizeof(*ctv)) ||
|
return (!access_ok(VERIFY_READ, ctv, sizeof(*ctv)) ||
|
||||||
__get_user(tv->tv_sec, &ctv->tv_sec) ||
|
__get_user(tv->tv_sec, &ctv->tv_sec) ||
|
||||||
__get_user(tv->tv_usec, &ctv->tv_usec)) ? -EFAULT : 0;
|
__get_user(tv->tv_usec, &ctv->tv_usec)) ? -EFAULT : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __compat_put_timeval(const struct timeval *tv, struct compat_timeval __user *ctv)
|
static int __compat_put_timeval(const struct timeval *tv, struct old_timeval32 __user *ctv)
|
||||||
{
|
{
|
||||||
return (!access_ok(VERIFY_WRITE, ctv, sizeof(*ctv)) ||
|
return (!access_ok(VERIFY_WRITE, ctv, sizeof(*ctv)) ||
|
||||||
__put_user(tv->tv_sec, &ctv->tv_sec) ||
|
__put_user(tv->tv_sec, &ctv->tv_sec) ||
|
||||||
__put_user(tv->tv_usec, &ctv->tv_usec)) ? -EFAULT : 0;
|
__put_user(tv->tv_usec, &ctv->tv_usec)) ? -EFAULT : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __compat_get_timespec(struct timespec *ts, const struct compat_timespec __user *cts)
|
static int __compat_get_timespec(struct timespec *ts, const struct old_timespec32 __user *cts)
|
||||||
{
|
{
|
||||||
return (!access_ok(VERIFY_READ, cts, sizeof(*cts)) ||
|
return (!access_ok(VERIFY_READ, cts, sizeof(*cts)) ||
|
||||||
__get_user(ts->tv_sec, &cts->tv_sec) ||
|
__get_user(ts->tv_sec, &cts->tv_sec) ||
|
||||||
__get_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0;
|
__get_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __compat_put_timespec(const struct timespec *ts, struct compat_timespec __user *cts)
|
static int __compat_put_timespec(const struct timespec *ts, struct old_timespec32 __user *cts)
|
||||||
{
|
{
|
||||||
return (!access_ok(VERIFY_WRITE, cts, sizeof(*cts)) ||
|
return (!access_ok(VERIFY_WRITE, cts, sizeof(*cts)) ||
|
||||||
__put_user(ts->tv_sec, &cts->tv_sec) ||
|
__put_user(ts->tv_sec, &cts->tv_sec) ||
|
||||||
|
|
|
@ -173,7 +173,7 @@ err_unlock:
|
||||||
}
|
}
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val,
|
COMPAT_SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val,
|
||||||
struct compat_timespec __user *, utime, u32 __user *, uaddr2,
|
struct old_timespec32 __user *, utime, u32 __user *, uaddr2,
|
||||||
u32, val3)
|
u32, val3)
|
||||||
{
|
{
|
||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
|
|
|
@ -5244,7 +5244,7 @@ out_unlock:
|
||||||
* an error code.
|
* an error code.
|
||||||
*/
|
*/
|
||||||
SYSCALL_DEFINE2(sched_rr_get_interval, pid_t, pid,
|
SYSCALL_DEFINE2(sched_rr_get_interval, pid_t, pid,
|
||||||
struct timespec __user *, interval)
|
struct __kernel_timespec __user *, interval)
|
||||||
{
|
{
|
||||||
struct timespec64 t;
|
struct timespec64 t;
|
||||||
int retval = sched_rr_get_interval(pid, &t);
|
int retval = sched_rr_get_interval(pid, &t);
|
||||||
|
@ -5255,16 +5255,16 @@ SYSCALL_DEFINE2(sched_rr_get_interval, pid_t, pid,
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||||
COMPAT_SYSCALL_DEFINE2(sched_rr_get_interval,
|
COMPAT_SYSCALL_DEFINE2(sched_rr_get_interval,
|
||||||
compat_pid_t, pid,
|
compat_pid_t, pid,
|
||||||
struct compat_timespec __user *, interval)
|
struct old_timespec32 __user *, interval)
|
||||||
{
|
{
|
||||||
struct timespec64 t;
|
struct timespec64 t;
|
||||||
int retval = sched_rr_get_interval(pid, &t);
|
int retval = sched_rr_get_interval(pid, &t);
|
||||||
|
|
||||||
if (retval == 0)
|
if (retval == 0)
|
||||||
retval = compat_put_timespec64(&t, interval);
|
retval = put_old_timespec32(&t, interval);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -3165,7 +3165,7 @@ int copy_siginfo_from_user32(struct kernel_siginfo *to,
|
||||||
* @ts: upper bound on process time suspension
|
* @ts: upper bound on process time suspension
|
||||||
*/
|
*/
|
||||||
static int do_sigtimedwait(const sigset_t *which, kernel_siginfo_t *info,
|
static int do_sigtimedwait(const sigset_t *which, kernel_siginfo_t *info,
|
||||||
const struct timespec *ts)
|
const struct timespec64 *ts)
|
||||||
{
|
{
|
||||||
ktime_t *to = NULL, timeout = KTIME_MAX;
|
ktime_t *to = NULL, timeout = KTIME_MAX;
|
||||||
struct task_struct *tsk = current;
|
struct task_struct *tsk = current;
|
||||||
|
@ -3173,9 +3173,9 @@ static int do_sigtimedwait(const sigset_t *which, kernel_siginfo_t *info,
|
||||||
int sig, ret = 0;
|
int sig, ret = 0;
|
||||||
|
|
||||||
if (ts) {
|
if (ts) {
|
||||||
if (!timespec_valid(ts))
|
if (!timespec64_valid(ts))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
timeout = timespec_to_ktime(*ts);
|
timeout = timespec64_to_ktime(*ts);
|
||||||
to = &timeout;
|
to = &timeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3223,11 +3223,12 @@ static int do_sigtimedwait(const sigset_t *which, kernel_siginfo_t *info,
|
||||||
* @sigsetsize: size of sigset_t type
|
* @sigsetsize: size of sigset_t type
|
||||||
*/
|
*/
|
||||||
SYSCALL_DEFINE4(rt_sigtimedwait, const sigset_t __user *, uthese,
|
SYSCALL_DEFINE4(rt_sigtimedwait, const sigset_t __user *, uthese,
|
||||||
siginfo_t __user *, uinfo, const struct timespec __user *, uts,
|
siginfo_t __user *, uinfo,
|
||||||
|
const struct __kernel_timespec __user *, uts,
|
||||||
size_t, sigsetsize)
|
size_t, sigsetsize)
|
||||||
{
|
{
|
||||||
sigset_t these;
|
sigset_t these;
|
||||||
struct timespec ts;
|
struct timespec64 ts;
|
||||||
kernel_siginfo_t info;
|
kernel_siginfo_t info;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -3239,7 +3240,7 @@ SYSCALL_DEFINE4(rt_sigtimedwait, const sigset_t __user *, uthese,
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
if (uts) {
|
if (uts) {
|
||||||
if (copy_from_user(&ts, uts, sizeof(ts)))
|
if (get_timespec64(&ts, uts))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3256,10 +3257,10 @@ SYSCALL_DEFINE4(rt_sigtimedwait, const sigset_t __user *, uthese,
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
COMPAT_SYSCALL_DEFINE4(rt_sigtimedwait, compat_sigset_t __user *, uthese,
|
COMPAT_SYSCALL_DEFINE4(rt_sigtimedwait, compat_sigset_t __user *, uthese,
|
||||||
struct compat_siginfo __user *, uinfo,
|
struct compat_siginfo __user *, uinfo,
|
||||||
struct compat_timespec __user *, uts, compat_size_t, sigsetsize)
|
struct old_timespec32 __user *, uts, compat_size_t, sigsetsize)
|
||||||
{
|
{
|
||||||
sigset_t s;
|
sigset_t s;
|
||||||
struct timespec t;
|
struct timespec64 t;
|
||||||
kernel_siginfo_t info;
|
kernel_siginfo_t info;
|
||||||
long ret;
|
long ret;
|
||||||
|
|
||||||
|
@ -3270,7 +3271,7 @@ COMPAT_SYSCALL_DEFINE4(rt_sigtimedwait, compat_sigset_t __user *, uthese,
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
if (uts) {
|
if (uts) {
|
||||||
if (compat_get_timespec(&t, uts))
|
if (get_old_timespec32(&t, uts))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1660,7 +1660,7 @@ int nanosleep_copyout(struct restart_block *restart, struct timespec64 *ts)
|
||||||
switch(restart->nanosleep.type) {
|
switch(restart->nanosleep.type) {
|
||||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||||
case TT_COMPAT:
|
case TT_COMPAT:
|
||||||
if (compat_put_timespec64(ts, restart->nanosleep.compat_rmtp))
|
if (put_old_timespec32(ts, restart->nanosleep.compat_rmtp))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1780,12 +1780,12 @@ SYSCALL_DEFINE2(nanosleep, struct __kernel_timespec __user *, rqtp,
|
||||||
|
|
||||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp,
|
COMPAT_SYSCALL_DEFINE2(nanosleep, struct old_timespec32 __user *, rqtp,
|
||||||
struct compat_timespec __user *, rmtp)
|
struct old_timespec32 __user *, rmtp)
|
||||||
{
|
{
|
||||||
struct timespec64 tu;
|
struct timespec64 tu;
|
||||||
|
|
||||||
if (compat_get_timespec64(&tu, rqtp))
|
if (get_old_timespec32(&tu, rqtp))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
if (!timespec64_valid(&tu))
|
if (!timespec64_valid(&tu))
|
||||||
|
|
|
@ -162,20 +162,20 @@ COMPAT_SYS_NI(setitimer);
|
||||||
|
|
||||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||||
COMPAT_SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
|
COMPAT_SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
|
||||||
struct compat_timespec __user *, tp)
|
struct old_timespec32 __user *, tp)
|
||||||
{
|
{
|
||||||
struct timespec64 new_tp;
|
struct timespec64 new_tp;
|
||||||
|
|
||||||
if (which_clock != CLOCK_REALTIME)
|
if (which_clock != CLOCK_REALTIME)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (compat_get_timespec64(&new_tp, tp))
|
if (get_old_timespec32(&new_tp, tp))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
return do_sys_settimeofday64(&new_tp, NULL);
|
return do_sys_settimeofday64(&new_tp, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,
|
COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,
|
||||||
struct compat_timespec __user *, tp)
|
struct old_timespec32 __user *, tp)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct timespec64 kernel_tp;
|
struct timespec64 kernel_tp;
|
||||||
|
@ -184,13 +184,13 @@ COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (compat_put_timespec64(&kernel_tp, tp))
|
if (put_old_timespec32(&kernel_tp, tp))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,
|
COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,
|
||||||
struct compat_timespec __user *, tp)
|
struct old_timespec32 __user *, tp)
|
||||||
{
|
{
|
||||||
struct timespec64 rtn_tp = {
|
struct timespec64 rtn_tp = {
|
||||||
.tv_sec = 0,
|
.tv_sec = 0,
|
||||||
|
@ -201,7 +201,7 @@ COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,
|
||||||
case CLOCK_REALTIME:
|
case CLOCK_REALTIME:
|
||||||
case CLOCK_MONOTONIC:
|
case CLOCK_MONOTONIC:
|
||||||
case CLOCK_BOOTTIME:
|
case CLOCK_BOOTTIME:
|
||||||
if (compat_put_timespec64(&rtn_tp, tp))
|
if (put_old_timespec32(&rtn_tp, tp))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
|
@ -210,8 +210,8 @@ COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,
|
||||||
}
|
}
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags,
|
COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags,
|
||||||
struct compat_timespec __user *, rqtp,
|
struct old_timespec32 __user *, rqtp,
|
||||||
struct compat_timespec __user *, rmtp)
|
struct old_timespec32 __user *, rmtp)
|
||||||
{
|
{
|
||||||
struct timespec64 t;
|
struct timespec64 t;
|
||||||
|
|
||||||
|
@ -224,7 +224,7 @@ COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (compat_get_timespec64(&t, rqtp))
|
if (get_old_timespec32(&t, rqtp))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (!timespec64_valid(&t))
|
if (!timespec64_valid(&t))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -755,13 +755,13 @@ SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,
|
||||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,
|
COMPAT_SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,
|
||||||
struct compat_itimerspec __user *, setting)
|
struct old_itimerspec32 __user *, setting)
|
||||||
{
|
{
|
||||||
struct itimerspec64 cur_setting;
|
struct itimerspec64 cur_setting;
|
||||||
|
|
||||||
int ret = do_timer_gettime(timer_id, &cur_setting);
|
int ret = do_timer_gettime(timer_id, &cur_setting);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
if (put_compat_itimerspec64(&cur_setting, setting))
|
if (put_old_itimerspec32(&cur_setting, setting))
|
||||||
ret = -EFAULT;
|
ret = -EFAULT;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -928,8 +928,8 @@ SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags,
|
||||||
|
|
||||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||||
COMPAT_SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags,
|
COMPAT_SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags,
|
||||||
struct compat_itimerspec __user *, new,
|
struct old_itimerspec32 __user *, new,
|
||||||
struct compat_itimerspec __user *, old)
|
struct old_itimerspec32 __user *, old)
|
||||||
{
|
{
|
||||||
struct itimerspec64 new_spec, old_spec;
|
struct itimerspec64 new_spec, old_spec;
|
||||||
struct itimerspec64 *rtn = old ? &old_spec : NULL;
|
struct itimerspec64 *rtn = old ? &old_spec : NULL;
|
||||||
|
@ -937,12 +937,12 @@ COMPAT_SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags,
|
||||||
|
|
||||||
if (!new)
|
if (!new)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (get_compat_itimerspec64(&new_spec, new))
|
if (get_old_itimerspec32(&new_spec, new))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
error = do_timer_settime(timer_id, flags, &new_spec, rtn);
|
error = do_timer_settime(timer_id, flags, &new_spec, rtn);
|
||||||
if (!error && old) {
|
if (!error && old) {
|
||||||
if (put_compat_itimerspec64(&old_spec, old))
|
if (put_old_itimerspec32(&old_spec, old))
|
||||||
error = -EFAULT;
|
error = -EFAULT;
|
||||||
}
|
}
|
||||||
return error;
|
return error;
|
||||||
|
@ -1115,7 +1115,7 @@ SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock,
|
||||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE2(clock_settime, clockid_t, which_clock,
|
COMPAT_SYSCALL_DEFINE2(clock_settime, clockid_t, which_clock,
|
||||||
struct compat_timespec __user *, tp)
|
struct old_timespec32 __user *, tp)
|
||||||
{
|
{
|
||||||
const struct k_clock *kc = clockid_to_kclock(which_clock);
|
const struct k_clock *kc = clockid_to_kclock(which_clock);
|
||||||
struct timespec64 ts;
|
struct timespec64 ts;
|
||||||
|
@ -1123,14 +1123,14 @@ COMPAT_SYSCALL_DEFINE2(clock_settime, clockid_t, which_clock,
|
||||||
if (!kc || !kc->clock_set)
|
if (!kc || !kc->clock_set)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (compat_get_timespec64(&ts, tp))
|
if (get_old_timespec32(&ts, tp))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
return kc->clock_set(which_clock, &ts);
|
return kc->clock_set(which_clock, &ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,
|
COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,
|
||||||
struct compat_timespec __user *, tp)
|
struct old_timespec32 __user *, tp)
|
||||||
{
|
{
|
||||||
const struct k_clock *kc = clockid_to_kclock(which_clock);
|
const struct k_clock *kc = clockid_to_kclock(which_clock);
|
||||||
struct timespec64 ts;
|
struct timespec64 ts;
|
||||||
|
@ -1141,7 +1141,7 @@ COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,
|
||||||
|
|
||||||
err = kc->clock_get(which_clock, &ts);
|
err = kc->clock_get(which_clock, &ts);
|
||||||
|
|
||||||
if (!err && compat_put_timespec64(&ts, tp))
|
if (!err && put_old_timespec32(&ts, tp))
|
||||||
err = -EFAULT;
|
err = -EFAULT;
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
@ -1180,7 +1180,7 @@ COMPAT_SYSCALL_DEFINE2(clock_adjtime, clockid_t, which_clock,
|
||||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,
|
COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,
|
||||||
struct compat_timespec __user *, tp)
|
struct old_timespec32 __user *, tp)
|
||||||
{
|
{
|
||||||
const struct k_clock *kc = clockid_to_kclock(which_clock);
|
const struct k_clock *kc = clockid_to_kclock(which_clock);
|
||||||
struct timespec64 ts;
|
struct timespec64 ts;
|
||||||
|
@ -1190,7 +1190,7 @@ COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
err = kc->clock_getres(which_clock, &ts);
|
err = kc->clock_getres(which_clock, &ts);
|
||||||
if (!err && tp && compat_put_timespec64(&ts, tp))
|
if (!err && tp && put_old_timespec32(&ts, tp))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
@ -1237,8 +1237,8 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
|
||||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags,
|
COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags,
|
||||||
struct compat_timespec __user *, rqtp,
|
struct old_timespec32 __user *, rqtp,
|
||||||
struct compat_timespec __user *, rmtp)
|
struct old_timespec32 __user *, rmtp)
|
||||||
{
|
{
|
||||||
const struct k_clock *kc = clockid_to_kclock(which_clock);
|
const struct k_clock *kc = clockid_to_kclock(which_clock);
|
||||||
struct timespec64 t;
|
struct timespec64 t;
|
||||||
|
@ -1248,7 +1248,7 @@ COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags,
|
||||||
if (!kc->nsleep)
|
if (!kc->nsleep)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
if (compat_get_timespec64(&t, rqtp))
|
if (get_old_timespec32(&t, rqtp))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
if (!timespec64_valid(&t))
|
if (!timespec64_valid(&t))
|
||||||
|
|
|
@ -400,8 +400,6 @@ void tick_broadcast_control(enum tick_broadcast_mode mode)
|
||||||
if (tick_broadcast_forced)
|
if (tick_broadcast_forced)
|
||||||
break;
|
break;
|
||||||
cpumask_clear_cpu(cpu, tick_broadcast_on);
|
cpumask_clear_cpu(cpu, tick_broadcast_on);
|
||||||
if (!tick_device_is_functional(dev))
|
|
||||||
break;
|
|
||||||
if (cpumask_test_and_clear_cpu(cpu, tick_broadcast_mask)) {
|
if (cpumask_test_and_clear_cpu(cpu, tick_broadcast_mask)) {
|
||||||
if (tick_broadcast_device.mode ==
|
if (tick_broadcast_device.mode ==
|
||||||
TICKDEV_MODE_PERIODIC)
|
TICKDEV_MODE_PERIODIC)
|
||||||
|
|
|
@ -885,7 +885,7 @@ static bool can_stop_idle_tick(int cpu, struct tick_sched *ts)
|
||||||
if (need_resched())
|
if (need_resched())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (unlikely(local_softirq_pending() && cpu_online(cpu))) {
|
if (unlikely(local_softirq_pending())) {
|
||||||
static int ratelimit;
|
static int ratelimit;
|
||||||
|
|
||||||
if (ratelimit < 10 &&
|
if (ratelimit < 10 &&
|
||||||
|
|
|
@ -104,12 +104,12 @@ SYSCALL_DEFINE1(stime, time_t __user *, tptr)
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
#ifdef __ARCH_WANT_COMPAT_SYS_TIME
|
#ifdef __ARCH_WANT_COMPAT_SYS_TIME
|
||||||
|
|
||||||
/* compat_time_t is a 32 bit "long" and needs to get converted. */
|
/* old_time32_t is a 32 bit "long" and needs to get converted. */
|
||||||
COMPAT_SYSCALL_DEFINE1(time, compat_time_t __user *, tloc)
|
COMPAT_SYSCALL_DEFINE1(time, old_time32_t __user *, tloc)
|
||||||
{
|
{
|
||||||
compat_time_t i;
|
old_time32_t i;
|
||||||
|
|
||||||
i = (compat_time_t)ktime_get_real_seconds();
|
i = (old_time32_t)ktime_get_real_seconds();
|
||||||
|
|
||||||
if (tloc) {
|
if (tloc) {
|
||||||
if (put_user(i,tloc))
|
if (put_user(i,tloc))
|
||||||
|
@ -119,7 +119,7 @@ COMPAT_SYSCALL_DEFINE1(time, compat_time_t __user *, tloc)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE1(stime, compat_time_t __user *, tptr)
|
COMPAT_SYSCALL_DEFINE1(stime, old_time32_t __user *, tptr)
|
||||||
{
|
{
|
||||||
struct timespec64 tv;
|
struct timespec64 tv;
|
||||||
int err;
|
int err;
|
||||||
|
@ -144,9 +144,11 @@ SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv,
|
||||||
struct timezone __user *, tz)
|
struct timezone __user *, tz)
|
||||||
{
|
{
|
||||||
if (likely(tv != NULL)) {
|
if (likely(tv != NULL)) {
|
||||||
struct timeval ktv;
|
struct timespec64 ts;
|
||||||
do_gettimeofday(&ktv);
|
|
||||||
if (copy_to_user(tv, &ktv, sizeof(ktv)))
|
ktime_get_real_ts64(&ts);
|
||||||
|
if (put_user(ts.tv_sec, &tv->tv_sec) ||
|
||||||
|
put_user(ts.tv_nsec / 1000, &tv->tv_usec))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
if (unlikely(tz != NULL)) {
|
if (unlikely(tz != NULL)) {
|
||||||
|
@ -223,14 +225,15 @@ SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv,
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
COMPAT_SYSCALL_DEFINE2(gettimeofday, struct compat_timeval __user *, tv,
|
COMPAT_SYSCALL_DEFINE2(gettimeofday, struct old_timeval32 __user *, tv,
|
||||||
struct timezone __user *, tz)
|
struct timezone __user *, tz)
|
||||||
{
|
{
|
||||||
if (tv) {
|
if (tv) {
|
||||||
struct timeval ktv;
|
struct timespec64 ts;
|
||||||
|
|
||||||
do_gettimeofday(&ktv);
|
ktime_get_real_ts64(&ts);
|
||||||
if (compat_put_timeval(&ktv, tv))
|
if (put_user(ts.tv_sec, &tv->tv_sec) ||
|
||||||
|
put_user(ts.tv_nsec / 1000, &tv->tv_usec))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
if (tz) {
|
if (tz) {
|
||||||
|
@ -241,7 +244,7 @@ COMPAT_SYSCALL_DEFINE2(gettimeofday, struct compat_timeval __user *, tv,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE2(settimeofday, struct compat_timeval __user *, tv,
|
COMPAT_SYSCALL_DEFINE2(settimeofday, struct old_timeval32 __user *, tv,
|
||||||
struct timezone __user *, tz)
|
struct timezone __user *, tz)
|
||||||
{
|
{
|
||||||
struct timespec64 new_ts;
|
struct timespec64 new_ts;
|
||||||
|
@ -342,30 +345,6 @@ unsigned int jiffies_to_usecs(const unsigned long j)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(jiffies_to_usecs);
|
EXPORT_SYMBOL(jiffies_to_usecs);
|
||||||
|
|
||||||
/**
|
|
||||||
* timespec_trunc - Truncate timespec to a granularity
|
|
||||||
* @t: Timespec
|
|
||||||
* @gran: Granularity in ns.
|
|
||||||
*
|
|
||||||
* Truncate a timespec to a granularity. Always rounds down. gran must
|
|
||||||
* not be 0 nor greater than a second (NSEC_PER_SEC, or 10^9 ns).
|
|
||||||
*/
|
|
||||||
struct timespec timespec_trunc(struct timespec t, unsigned gran)
|
|
||||||
{
|
|
||||||
/* Avoid division in the common cases 1 ns and 1 s. */
|
|
||||||
if (gran == 1) {
|
|
||||||
/* nothing */
|
|
||||||
} else if (gran == NSEC_PER_SEC) {
|
|
||||||
t.tv_nsec = 0;
|
|
||||||
} else if (gran > 1 && gran < NSEC_PER_SEC) {
|
|
||||||
t.tv_nsec -= t.tv_nsec % gran;
|
|
||||||
} else {
|
|
||||||
WARN(1, "illegal file time granularity: %u", gran);
|
|
||||||
}
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(timespec_trunc);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mktime64 - Converts date to seconds.
|
* mktime64 - Converts date to seconds.
|
||||||
* Converts Gregorian date to seconds since 1970-01-01 00:00:00.
|
* Converts Gregorian date to seconds since 1970-01-01 00:00:00.
|
||||||
|
@ -884,10 +863,10 @@ int put_timespec64(const struct timespec64 *ts,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(put_timespec64);
|
EXPORT_SYMBOL_GPL(put_timespec64);
|
||||||
|
|
||||||
int __compat_get_timespec64(struct timespec64 *ts64,
|
static int __get_old_timespec32(struct timespec64 *ts64,
|
||||||
const struct compat_timespec __user *cts)
|
const struct old_timespec32 __user *cts)
|
||||||
{
|
{
|
||||||
struct compat_timespec ts;
|
struct old_timespec32 ts;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = copy_from_user(&ts, cts, sizeof(ts));
|
ret = copy_from_user(&ts, cts, sizeof(ts));
|
||||||
|
@ -900,33 +879,33 @@ int __compat_get_timespec64(struct timespec64 *ts64,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __compat_put_timespec64(const struct timespec64 *ts64,
|
static int __put_old_timespec32(const struct timespec64 *ts64,
|
||||||
struct compat_timespec __user *cts)
|
struct old_timespec32 __user *cts)
|
||||||
{
|
{
|
||||||
struct compat_timespec ts = {
|
struct old_timespec32 ts = {
|
||||||
.tv_sec = ts64->tv_sec,
|
.tv_sec = ts64->tv_sec,
|
||||||
.tv_nsec = ts64->tv_nsec
|
.tv_nsec = ts64->tv_nsec
|
||||||
};
|
};
|
||||||
return copy_to_user(cts, &ts, sizeof(ts)) ? -EFAULT : 0;
|
return copy_to_user(cts, &ts, sizeof(ts)) ? -EFAULT : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compat_get_timespec64(struct timespec64 *ts, const void __user *uts)
|
int get_old_timespec32(struct timespec64 *ts, const void __user *uts)
|
||||||
{
|
{
|
||||||
if (COMPAT_USE_64BIT_TIME)
|
if (COMPAT_USE_64BIT_TIME)
|
||||||
return copy_from_user(ts, uts, sizeof(*ts)) ? -EFAULT : 0;
|
return copy_from_user(ts, uts, sizeof(*ts)) ? -EFAULT : 0;
|
||||||
else
|
else
|
||||||
return __compat_get_timespec64(ts, uts);
|
return __get_old_timespec32(ts, uts);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(compat_get_timespec64);
|
EXPORT_SYMBOL_GPL(get_old_timespec32);
|
||||||
|
|
||||||
int compat_put_timespec64(const struct timespec64 *ts, void __user *uts)
|
int put_old_timespec32(const struct timespec64 *ts, void __user *uts)
|
||||||
{
|
{
|
||||||
if (COMPAT_USE_64BIT_TIME)
|
if (COMPAT_USE_64BIT_TIME)
|
||||||
return copy_to_user(uts, ts, sizeof(*ts)) ? -EFAULT : 0;
|
return copy_to_user(uts, ts, sizeof(*ts)) ? -EFAULT : 0;
|
||||||
else
|
else
|
||||||
return __compat_put_timespec64(ts, uts);
|
return __put_old_timespec32(ts, uts);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(compat_put_timespec64);
|
EXPORT_SYMBOL_GPL(put_old_timespec32);
|
||||||
|
|
||||||
int get_itimerspec64(struct itimerspec64 *it,
|
int get_itimerspec64(struct itimerspec64 *it,
|
||||||
const struct __kernel_itimerspec __user *uit)
|
const struct __kernel_itimerspec __user *uit)
|
||||||
|
@ -958,23 +937,23 @@ int put_itimerspec64(const struct itimerspec64 *it,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(put_itimerspec64);
|
EXPORT_SYMBOL_GPL(put_itimerspec64);
|
||||||
|
|
||||||
int get_compat_itimerspec64(struct itimerspec64 *its,
|
int get_old_itimerspec32(struct itimerspec64 *its,
|
||||||
const struct compat_itimerspec __user *uits)
|
const struct old_itimerspec32 __user *uits)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (__compat_get_timespec64(&its->it_interval, &uits->it_interval) ||
|
if (__get_old_timespec32(&its->it_interval, &uits->it_interval) ||
|
||||||
__compat_get_timespec64(&its->it_value, &uits->it_value))
|
__get_old_timespec32(&its->it_value, &uits->it_value))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(get_compat_itimerspec64);
|
EXPORT_SYMBOL_GPL(get_old_itimerspec32);
|
||||||
|
|
||||||
int put_compat_itimerspec64(const struct itimerspec64 *its,
|
int put_old_itimerspec32(const struct itimerspec64 *its,
|
||||||
struct compat_itimerspec __user *uits)
|
struct old_itimerspec32 __user *uits)
|
||||||
{
|
{
|
||||||
if (__compat_put_timespec64(&its->it_interval, &uits->it_interval) ||
|
if (__put_old_timespec32(&its->it_interval, &uits->it_interval) ||
|
||||||
__compat_put_timespec64(&its->it_value, &uits->it_value))
|
__put_old_timespec32(&its->it_value, &uits->it_value))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(put_compat_itimerspec64);
|
EXPORT_SYMBOL_GPL(put_old_itimerspec32);
|
||||||
|
|
|
@ -1211,22 +1211,6 @@ int get_device_system_crosststamp(int (*get_time_fn)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(get_device_system_crosststamp);
|
EXPORT_SYMBOL_GPL(get_device_system_crosststamp);
|
||||||
|
|
||||||
/**
|
|
||||||
* do_gettimeofday - Returns the time of day in a timeval
|
|
||||||
* @tv: pointer to the timeval to be set
|
|
||||||
*
|
|
||||||
* NOTE: Users should be converted to using getnstimeofday()
|
|
||||||
*/
|
|
||||||
void do_gettimeofday(struct timeval *tv)
|
|
||||||
{
|
|
||||||
struct timespec64 now;
|
|
||||||
|
|
||||||
getnstimeofday64(&now);
|
|
||||||
tv->tv_sec = now.tv_sec;
|
|
||||||
tv->tv_usec = now.tv_nsec/1000;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(do_gettimeofday);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* do_settimeofday64 - Sets the time of day.
|
* do_settimeofday64 - Sets the time of day.
|
||||||
* @ts: pointer to the timespec64 variable containing the new time
|
* @ts: pointer to the timespec64 variable containing the new time
|
||||||
|
@ -2174,14 +2158,6 @@ void getboottime64(struct timespec64 *ts)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(getboottime64);
|
EXPORT_SYMBOL_GPL(getboottime64);
|
||||||
|
|
||||||
unsigned long get_seconds(void)
|
|
||||||
{
|
|
||||||
struct timekeeper *tk = &tk_core.timekeeper;
|
|
||||||
|
|
||||||
return tk->xtime_sec;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(get_seconds);
|
|
||||||
|
|
||||||
void ktime_get_coarse_real_ts64(struct timespec64 *ts)
|
void ktime_get_coarse_real_ts64(struct timespec64 *ts)
|
||||||
{
|
{
|
||||||
struct timekeeper *tk = &tk_core.timekeeper;
|
struct timekeeper *tk = &tk_core.timekeeper;
|
||||||
|
|
10
net/compat.c
10
net/compat.c
|
@ -812,21 +812,21 @@ COMPAT_SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, buf, compat_size_t, len
|
||||||
|
|
||||||
static int __compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
|
static int __compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
|
||||||
unsigned int vlen, unsigned int flags,
|
unsigned int vlen, unsigned int flags,
|
||||||
struct compat_timespec __user *timeout)
|
struct old_timespec32 __user *timeout)
|
||||||
{
|
{
|
||||||
int datagrams;
|
int datagrams;
|
||||||
struct timespec ktspec;
|
struct timespec64 ktspec;
|
||||||
|
|
||||||
if (timeout == NULL)
|
if (timeout == NULL)
|
||||||
return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
|
return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
|
||||||
flags | MSG_CMSG_COMPAT, NULL);
|
flags | MSG_CMSG_COMPAT, NULL);
|
||||||
|
|
||||||
if (compat_get_timespec(&ktspec, timeout))
|
if (compat_get_timespec64(&ktspec, timeout))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
datagrams = __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
|
datagrams = __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
|
||||||
flags | MSG_CMSG_COMPAT, &ktspec);
|
flags | MSG_CMSG_COMPAT, &ktspec);
|
||||||
if (datagrams > 0 && compat_put_timespec(&ktspec, timeout))
|
if (datagrams > 0 && compat_put_timespec64(&ktspec, timeout))
|
||||||
datagrams = -EFAULT;
|
datagrams = -EFAULT;
|
||||||
|
|
||||||
return datagrams;
|
return datagrams;
|
||||||
|
@ -834,7 +834,7 @@ static int __compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
|
||||||
|
|
||||||
COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
|
COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
|
||||||
unsigned int, vlen, unsigned int, flags,
|
unsigned int, vlen, unsigned int, flags,
|
||||||
struct compat_timespec __user *, timeout)
|
struct old_timespec32 __user *, timeout)
|
||||||
{
|
{
|
||||||
return __compat_sys_recvmmsg(fd, mmsg, vlen, flags, timeout);
|
return __compat_sys_recvmmsg(fd, mmsg, vlen, flags, timeout);
|
||||||
}
|
}
|
||||||
|
|
18
net/socket.c
18
net/socket.c
|
@ -2342,7 +2342,7 @@ SYSCALL_DEFINE3(recvmsg, int, fd, struct user_msghdr __user *, msg,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
|
int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
|
||||||
unsigned int flags, struct timespec *timeout)
|
unsigned int flags, struct timespec64 *timeout)
|
||||||
{
|
{
|
||||||
int fput_needed, err, datagrams;
|
int fput_needed, err, datagrams;
|
||||||
struct socket *sock;
|
struct socket *sock;
|
||||||
|
@ -2407,8 +2407,7 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
|
||||||
|
|
||||||
if (timeout) {
|
if (timeout) {
|
||||||
ktime_get_ts64(&timeout64);
|
ktime_get_ts64(&timeout64);
|
||||||
*timeout = timespec64_to_timespec(
|
*timeout = timespec64_sub(end_time, timeout64);
|
||||||
timespec64_sub(end_time, timeout64));
|
|
||||||
if (timeout->tv_sec < 0) {
|
if (timeout->tv_sec < 0) {
|
||||||
timeout->tv_sec = timeout->tv_nsec = 0;
|
timeout->tv_sec = timeout->tv_nsec = 0;
|
||||||
break;
|
break;
|
||||||
|
@ -2454,10 +2453,10 @@ out_put:
|
||||||
|
|
||||||
static int do_sys_recvmmsg(int fd, struct mmsghdr __user *mmsg,
|
static int do_sys_recvmmsg(int fd, struct mmsghdr __user *mmsg,
|
||||||
unsigned int vlen, unsigned int flags,
|
unsigned int vlen, unsigned int flags,
|
||||||
struct timespec __user *timeout)
|
struct __kernel_timespec __user *timeout)
|
||||||
{
|
{
|
||||||
int datagrams;
|
int datagrams;
|
||||||
struct timespec timeout_sys;
|
struct timespec64 timeout_sys;
|
||||||
|
|
||||||
if (flags & MSG_CMSG_COMPAT)
|
if (flags & MSG_CMSG_COMPAT)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -2465,13 +2464,12 @@ static int do_sys_recvmmsg(int fd, struct mmsghdr __user *mmsg,
|
||||||
if (!timeout)
|
if (!timeout)
|
||||||
return __sys_recvmmsg(fd, mmsg, vlen, flags, NULL);
|
return __sys_recvmmsg(fd, mmsg, vlen, flags, NULL);
|
||||||
|
|
||||||
if (copy_from_user(&timeout_sys, timeout, sizeof(timeout_sys)))
|
if (get_timespec64(&timeout_sys, timeout))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
datagrams = __sys_recvmmsg(fd, mmsg, vlen, flags, &timeout_sys);
|
datagrams = __sys_recvmmsg(fd, mmsg, vlen, flags, &timeout_sys);
|
||||||
|
|
||||||
if (datagrams > 0 &&
|
if (datagrams > 0 && put_timespec64(&timeout_sys, timeout))
|
||||||
copy_to_user(timeout, &timeout_sys, sizeof(timeout_sys)))
|
|
||||||
datagrams = -EFAULT;
|
datagrams = -EFAULT;
|
||||||
|
|
||||||
return datagrams;
|
return datagrams;
|
||||||
|
@ -2479,7 +2477,7 @@ static int do_sys_recvmmsg(int fd, struct mmsghdr __user *mmsg,
|
||||||
|
|
||||||
SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,
|
SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,
|
||||||
unsigned int, vlen, unsigned int, flags,
|
unsigned int, vlen, unsigned int, flags,
|
||||||
struct timespec __user *, timeout)
|
struct __kernel_timespec __user *, timeout)
|
||||||
{
|
{
|
||||||
return do_sys_recvmmsg(fd, mmsg, vlen, flags, timeout);
|
return do_sys_recvmmsg(fd, mmsg, vlen, flags, timeout);
|
||||||
}
|
}
|
||||||
|
@ -2603,7 +2601,7 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args)
|
||||||
break;
|
break;
|
||||||
case SYS_RECVMMSG:
|
case SYS_RECVMMSG:
|
||||||
err = do_sys_recvmmsg(a0, (struct mmsghdr __user *)a1, a[2],
|
err = do_sys_recvmmsg(a0, (struct mmsghdr __user *)a1, a[2],
|
||||||
a[3], (struct timespec __user *)a[4]);
|
a[3], (struct __kernel_timespec __user *)a[4]);
|
||||||
break;
|
break;
|
||||||
case SYS_ACCEPT4:
|
case SYS_ACCEPT4:
|
||||||
err = __sys_accept4(a0, (struct sockaddr __user *)a1,
|
err = __sys_accept4(a0, (struct sockaddr __user *)a1,
|
||||||
|
|
Loading…
Reference in New Issue