mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
y2038: syscall implementation cleanups
This is a series of cleanups for the y2038 work, mostly intended for namespace cleaning: the kernel defines the traditional time_t, timeval and timespec types that often lead to y2038-unsafe code. Even though the unsafe usage is mostly gone from the kernel, having the types and associated functions around means that we can still grow new users, and that we may be missing conversions to safe types that actually matter. There are still a number of driver specific patches needed to get the last users of these types removed, those have been submitted to the respective maintainers. Link: https://lore.kernel.org/lkml/20191108210236.1296047-1-arnd@arndb.de/ Signed-off-by: Arnd Bergmann <arnd@arndb.de> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJd3D+wAAoJEJpsee/mABjZfdcQAJvl6e+4ddKoDMIVJqVCE25N meFRgA7S8jy6BefEVeUgI8TxK+amGO36szMBUEnZxSSxq9u+gd13m5bEK6Xq/ov7 4KTAiA3Irm/W5FBTktu1zc5ROIra1Xj7jLdubf8wEC3viSXIXB3+68Y28iBN7D2O k9kSpwINC5lWeC8guZy2I+2yc4ywUEXao9nVh8C/J+FQtU02TcdLtZop9OhpAa8u U19VVH3WHkQI7ZfLvBTUiYK6tlYTiYCnpr8l6sm850CnVv1fzBW+DzmVhPJ6FdFd 4m5staC0sQ6gVqtjVMBOtT5CdzREse6hpwbKo2GRWFroO5W9tljMOJJXHvv/f6kz DxrpUmj37JuRbqAbr8KDmQqPo6M2CRkxFxjol1yh5ER63u1xMwLm/PQITZIMDvPO jrFc2C2SdM2E9bKP/RMCVoKSoRwxCJ5IwJ2AF237rrU0sx/zB2xsrOGssx5CWEgc 3bbk6tDQujJJubnCfgRy1tTxpLZOHEEKw8YhFLLbR2LCtA9pA/0rfLLad16cjA5e 5jIHxfsFc23zgpzrJeB7kAF/9xgu1tlA5BotOs3VBE89LtWOA9nK5dbPXng6qlUe er3xLCfS38ovhUw6DusQpaYLuaYuLM7DKO4iav9kuTMcY9GkbPk7vDD3KPGh2goy hY5cSM8+kT1q/THLnUBH =Bdbv -----END PGP SIGNATURE----- Merge tag 'y2038-cleanups-5.5' of git://git.kernel.org:/pub/scm/linux/kernel/git/arnd/playground Pull y2038 cleanups from Arnd Bergmann: "y2038 syscall implementation cleanups This is a series of cleanups for the y2038 work, mostly intended for namespace cleaning: the kernel defines the traditional time_t, timeval and timespec types that often lead to y2038-unsafe code. Even though the unsafe usage is mostly gone from the kernel, having the types and associated functions around means that we can still grow new users, and that we may be missing conversions to safe types that actually matter. There are still a number of driver specific patches needed to get the last users of these types removed, those have been submitted to the respective maintainers" Link: https://lore.kernel.org/lkml/20191108210236.1296047-1-arnd@arndb.de/ * tag 'y2038-cleanups-5.5' of git://git.kernel.org:/pub/scm/linux/kernel/git/arnd/playground: (26 commits) y2038: alarm: fix half-second cut-off y2038: ipc: fix x32 ABI breakage y2038: fix typo in powerpc vdso "LOPART" y2038: allow disabling time32 system calls y2038: itimer: change implementation to timespec64 y2038: move itimer reset into itimer.c y2038: use compat_{get,set}_itimer on alpha y2038: itimer: compat handling to itimer.c y2038: time: avoid timespec usage in settimeofday() y2038: timerfd: Use timespec64 internally y2038: elfcore: Use __kernel_old_timeval for process times y2038: make ns_to_compat_timeval use __kernel_old_timeval y2038: socket: use __kernel_old_timespec instead of timespec y2038: socket: remove timespec reference in timestamping y2038: syscalls: change remaining timeval to __kernel_old_timeval y2038: rusage: use __kernel_old_timeval y2038: uapi: change __kernel_time_t to __kernel_old_time_t y2038: stat: avoid 'time_t' in 'struct stat' y2038: ipc: remove __kernel_time_t reference from headers y2038: vdso: powerpc: avoid timespec references ...
This commit is contained in:
commit
ceb3074745
11
arch/Kconfig
11
arch/Kconfig
@ -796,16 +796,9 @@ config OLD_SIGACTION
|
||||
config COMPAT_OLD_SIGACTION
|
||||
bool
|
||||
|
||||
config 64BIT_TIME
|
||||
def_bool y
|
||||
help
|
||||
This should be selected by all architectures that need to support
|
||||
new system calls with a 64-bit time_t. This is relevant on all 32-bit
|
||||
architectures, and 64-bit architectures as part of compat syscall
|
||||
handling.
|
||||
|
||||
config COMPAT_32BIT_TIME
|
||||
def_bool !64BIT || COMPAT
|
||||
bool "Provide system calls for 32-bit time_t"
|
||||
default !64BIT || COMPAT
|
||||
help
|
||||
This enables 32 bit time_t support in addition to 64 bit time_t support.
|
||||
This is relevant on all 32-bit architectures, and 64-bit architectures
|
||||
|
@ -963,7 +963,7 @@ put_tv32(struct timeval32 __user *o, struct timespec64 *i)
|
||||
}
|
||||
|
||||
static inline long
|
||||
put_tv_to_tv32(struct timeval32 __user *o, struct timeval *i)
|
||||
put_tv_to_tv32(struct timeval32 __user *o, struct __kernel_old_timeval *i)
|
||||
{
|
||||
return copy_to_user(o, &(struct timeval32){
|
||||
.tv_sec = i->tv_sec,
|
||||
@ -971,30 +971,6 @@ put_tv_to_tv32(struct timeval32 __user *o, struct timeval *i)
|
||||
sizeof(struct timeval32));
|
||||
}
|
||||
|
||||
static inline long
|
||||
get_it32(struct itimerval *o, struct itimerval32 __user *i)
|
||||
{
|
||||
struct itimerval32 itv;
|
||||
if (copy_from_user(&itv, i, sizeof(struct itimerval32)))
|
||||
return -EFAULT;
|
||||
o->it_interval.tv_sec = itv.it_interval.tv_sec;
|
||||
o->it_interval.tv_usec = itv.it_interval.tv_usec;
|
||||
o->it_value.tv_sec = itv.it_value.tv_sec;
|
||||
o->it_value.tv_usec = itv.it_value.tv_usec;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline long
|
||||
put_it32(struct itimerval32 __user *o, struct itimerval *i)
|
||||
{
|
||||
return copy_to_user(o, &(struct itimerval32){
|
||||
.it_interval.tv_sec = o->it_interval.tv_sec,
|
||||
.it_interval.tv_usec = o->it_interval.tv_usec,
|
||||
.it_value.tv_sec = o->it_value.tv_sec,
|
||||
.it_value.tv_usec = o->it_value.tv_usec},
|
||||
sizeof(struct itimerval32));
|
||||
}
|
||||
|
||||
static inline void
|
||||
jiffies_to_timeval32(unsigned long jiffies, struct timeval32 *value)
|
||||
{
|
||||
@ -1039,47 +1015,6 @@ SYSCALL_DEFINE2(osf_settimeofday, struct timeval32 __user *, tv,
|
||||
|
||||
asmlinkage long sys_ni_posix_timers(void);
|
||||
|
||||
SYSCALL_DEFINE2(osf_getitimer, int, which, struct itimerval32 __user *, it)
|
||||
{
|
||||
struct itimerval kit;
|
||||
int error;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_POSIX_TIMERS))
|
||||
return sys_ni_posix_timers();
|
||||
|
||||
error = do_getitimer(which, &kit);
|
||||
if (!error && put_it32(it, &kit))
|
||||
error = -EFAULT;
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE3(osf_setitimer, int, which, struct itimerval32 __user *, in,
|
||||
struct itimerval32 __user *, out)
|
||||
{
|
||||
struct itimerval kin, kout;
|
||||
int error;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_POSIX_TIMERS))
|
||||
return sys_ni_posix_timers();
|
||||
|
||||
if (in) {
|
||||
if (get_it32(&kin, in))
|
||||
return -EFAULT;
|
||||
} else
|
||||
memset(&kin, 0, sizeof(kin));
|
||||
|
||||
error = do_setitimer(which, &kin, out ? &kout : NULL);
|
||||
if (error || !out)
|
||||
return error;
|
||||
|
||||
if (put_it32(out, &kout))
|
||||
return -EFAULT;
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE2(osf_utimes, const char __user *, filename,
|
||||
struct timeval32 __user *, tvs)
|
||||
{
|
||||
|
@ -89,10 +89,10 @@
|
||||
80 common setgroups sys_setgroups
|
||||
81 common osf_old_getpgrp sys_ni_syscall
|
||||
82 common setpgrp sys_setpgid
|
||||
83 common osf_setitimer sys_osf_setitimer
|
||||
83 common osf_setitimer compat_sys_setitimer
|
||||
84 common osf_old_wait sys_ni_syscall
|
||||
85 common osf_table sys_ni_syscall
|
||||
86 common osf_getitimer sys_osf_getitimer
|
||||
86 common osf_getitimer compat_sys_getitimer
|
||||
87 common gethostname sys_gethostname
|
||||
88 common sethostname sys_sethostname
|
||||
89 common getdtablesize sys_getdtablesize
|
||||
|
@ -211,7 +211,7 @@ void foo(void)
|
||||
offsetof (struct cpuinfo_ia64, ptce_stride));
|
||||
BLANK();
|
||||
DEFINE(IA64_TIMESPEC_TV_NSEC_OFFSET,
|
||||
offsetof (struct timespec, tv_nsec));
|
||||
offsetof (struct __kernel_old_timespec, tv_nsec));
|
||||
DEFINE(IA64_TIME_SN_SPEC_SNSEC_OFFSET,
|
||||
offsetof (struct time_sn_spec, snsec));
|
||||
|
||||
|
@ -15,9 +15,9 @@
|
||||
#if defined(__mips64)
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
long msg_stime; /* last msgsnd time */
|
||||
long msg_rtime; /* last msgrcv time */
|
||||
long msg_ctime; /* last change time */
|
||||
unsigned long msg_cbytes; /* current number of bytes on queue */
|
||||
unsigned long msg_qnum; /* number of messages in queue */
|
||||
unsigned long msg_qbytes; /* max number of bytes on queue */
|
||||
|
@ -14,8 +14,8 @@
|
||||
#ifdef __mips64
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
long sem_otime; /* last semop time */
|
||||
long sem_ctime; /* last change time */
|
||||
unsigned long sem_nsems; /* no. of semaphores in array */
|
||||
unsigned long __unused1;
|
||||
unsigned long __unused2;
|
||||
|
@ -17,9 +17,9 @@
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
size_t shm_segsz; /* size of segment (bytes) */
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
long shm_atime; /* last attach time */
|
||||
long shm_dtime; /* last detach time */
|
||||
long shm_ctime; /* last change time */
|
||||
__kernel_pid_t shm_cpid; /* pid of creator */
|
||||
__kernel_pid_t shm_lpid; /* pid of last operator */
|
||||
unsigned long shm_nattch; /* no. of current attaches */
|
||||
|
@ -26,17 +26,17 @@ struct stat {
|
||||
gid_t st_gid;
|
||||
unsigned st_rdev;
|
||||
long st_pad2[2];
|
||||
off_t st_size;
|
||||
long st_size;
|
||||
long st_pad3;
|
||||
/*
|
||||
* Actually this should be timestruc_t st_atime, st_mtime and st_ctime
|
||||
* but we don't have it under Linux.
|
||||
*/
|
||||
time_t st_atime;
|
||||
long st_atime;
|
||||
long st_atime_nsec;
|
||||
time_t st_mtime;
|
||||
long st_mtime;
|
||||
long st_mtime_nsec;
|
||||
time_t st_ctime;
|
||||
long st_ctime;
|
||||
long st_ctime_nsec;
|
||||
long st_blksize;
|
||||
long st_blocks;
|
||||
@ -70,13 +70,13 @@ struct stat64 {
|
||||
* Actually this should be timestruc_t st_atime, st_mtime and st_ctime
|
||||
* but we don't have it under Linux.
|
||||
*/
|
||||
time_t st_atime;
|
||||
long st_atime;
|
||||
unsigned long st_atime_nsec; /* Reserved for st_atime expansion */
|
||||
|
||||
time_t st_mtime;
|
||||
long st_mtime;
|
||||
unsigned long st_mtime_nsec; /* Reserved for st_mtime expansion */
|
||||
|
||||
time_t st_ctime;
|
||||
long st_ctime;
|
||||
unsigned long st_ctime_nsec; /* Reserved for st_ctime expansion */
|
||||
|
||||
unsigned long st_blksize;
|
||||
@ -105,7 +105,7 @@ struct stat {
|
||||
unsigned int st_rdev;
|
||||
unsigned int st_pad1[3]; /* Reserved for st_rdev expansion */
|
||||
|
||||
off_t st_size;
|
||||
long st_size;
|
||||
|
||||
/*
|
||||
* Actually this should be timestruc_t st_atime, st_mtime and st_ctime
|
||||
|
@ -100,7 +100,7 @@ jiffies_to_old_timeval32(unsigned long jiffies, struct old_timeval32 *value)
|
||||
#undef TASK_SIZE
|
||||
#define TASK_SIZE TASK_SIZE32
|
||||
|
||||
#undef ns_to_timeval
|
||||
#define ns_to_timeval ns_to_old_timeval32
|
||||
#undef ns_to_kernel_old_timeval
|
||||
#define ns_to_kernel_old_timeval ns_to_old_timeval32
|
||||
|
||||
#include "../../../fs/binfmt_elf.c"
|
||||
|
@ -103,7 +103,7 @@ jiffies_to_old_timeval32(unsigned long jiffies, struct old_timeval32 *value)
|
||||
#undef TASK_SIZE
|
||||
#define TASK_SIZE TASK_SIZE32
|
||||
|
||||
#undef ns_to_timeval
|
||||
#define ns_to_timeval ns_to_old_timeval32
|
||||
#undef ns_to_kernel_old_timeval
|
||||
#define ns_to_kernel_old_timeval ns_to_old_timeval32
|
||||
|
||||
#include "../../../fs/binfmt_elf.c"
|
||||
|
@ -48,9 +48,9 @@ static notrace int vdso_read_retry(const struct vdso_data *vdata, u32 start)
|
||||
}
|
||||
|
||||
static notrace long clock_gettime_fallback(clockid_t _clkid,
|
||||
struct timespec *_ts)
|
||||
struct __kernel_old_timespec *_ts)
|
||||
{
|
||||
register struct timespec *ts asm("$r1") = _ts;
|
||||
register struct __kernel_old_timespec *ts asm("$r1") = _ts;
|
||||
register clockid_t clkid asm("$r0") = _clkid;
|
||||
register long ret asm("$r0");
|
||||
|
||||
@ -63,7 +63,7 @@ static notrace long clock_gettime_fallback(clockid_t _clkid,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static notrace int do_realtime_coarse(struct timespec *ts,
|
||||
static notrace int do_realtime_coarse(struct __kernel_old_timespec *ts,
|
||||
struct vdso_data *vdata)
|
||||
{
|
||||
u32 seq;
|
||||
@ -78,25 +78,23 @@ static notrace int do_realtime_coarse(struct timespec *ts,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static notrace int do_monotonic_coarse(struct timespec *ts,
|
||||
static notrace int do_monotonic_coarse(struct __kernel_old_timespec *ts,
|
||||
struct vdso_data *vdata)
|
||||
{
|
||||
struct timespec tomono;
|
||||
u32 seq;
|
||||
u64 ns;
|
||||
|
||||
do {
|
||||
seq = vdso_read_begin(vdata);
|
||||
|
||||
ts->tv_sec = vdata->xtime_coarse_sec;
|
||||
ts->tv_nsec = vdata->xtime_coarse_nsec;
|
||||
|
||||
tomono.tv_sec = vdata->wtm_clock_sec;
|
||||
tomono.tv_nsec = vdata->wtm_clock_nsec;
|
||||
ts->tv_sec = vdata->xtime_coarse_sec + vdata->wtm_clock_sec;
|
||||
ns = vdata->xtime_coarse_nsec + vdata->wtm_clock_nsec;
|
||||
|
||||
} while (vdso_read_retry(vdata, seq));
|
||||
|
||||
ts->tv_sec += tomono.tv_sec;
|
||||
timespec_add_ns(ts, tomono.tv_nsec);
|
||||
ts->tv_sec += __iter_div_u64_rem(ns, NSEC_PER_SEC, &ns);
|
||||
ts->tv_nsec = ns;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -115,7 +113,7 @@ static notrace inline u64 vgetsns(struct vdso_data *vdso)
|
||||
return ((u64) cycle_delta & vdso->cs_mask) * vdso->cs_mult;
|
||||
}
|
||||
|
||||
static notrace int do_realtime(struct timespec *ts, struct vdso_data *vdata)
|
||||
static notrace int do_realtime(struct __kernel_old_timespec *ts, struct vdso_data *vdata)
|
||||
{
|
||||
unsigned count;
|
||||
u64 ns;
|
||||
@ -133,32 +131,31 @@ static notrace int do_realtime(struct timespec *ts, struct vdso_data *vdata)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static notrace int do_monotonic(struct timespec *ts, struct vdso_data *vdata)
|
||||
static notrace int do_monotonic(struct __kernel_old_timespec *ts, struct vdso_data *vdata)
|
||||
{
|
||||
struct timespec tomono;
|
||||
u64 nsecs;
|
||||
u64 ns;
|
||||
u32 seq;
|
||||
|
||||
do {
|
||||
seq = vdso_read_begin(vdata);
|
||||
|
||||
ts->tv_sec = vdata->xtime_clock_sec;
|
||||
nsecs = vdata->xtime_clock_nsec;
|
||||
nsecs += vgetsns(vdata);
|
||||
nsecs >>= vdata->cs_shift;
|
||||
ns = vdata->xtime_clock_nsec;
|
||||
ns += vgetsns(vdata);
|
||||
ns >>= vdata->cs_shift;
|
||||
|
||||
tomono.tv_sec = vdata->wtm_clock_sec;
|
||||
tomono.tv_nsec = vdata->wtm_clock_nsec;
|
||||
ts->tv_sec += vdata->wtm_clock_sec;
|
||||
ns += vdata->wtm_clock_nsec;
|
||||
|
||||
} while (vdso_read_retry(vdata, seq));
|
||||
|
||||
ts->tv_sec += tomono.tv_sec;
|
||||
ts->tv_nsec = 0;
|
||||
timespec_add_ns(ts, nsecs + tomono.tv_nsec);
|
||||
ts->tv_sec += __iter_div_u64_rem(ns, NSEC_PER_SEC, &ns);
|
||||
ts->tv_nsec = ns;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
notrace int __vdso_clock_gettime(clockid_t clkid, struct timespec *ts)
|
||||
notrace int __vdso_clock_gettime(clockid_t clkid, struct __kernel_old_timespec *ts)
|
||||
{
|
||||
struct vdso_data *vdata;
|
||||
int ret = -1;
|
||||
@ -191,10 +188,10 @@ notrace int __vdso_clock_gettime(clockid_t clkid, struct timespec *ts)
|
||||
}
|
||||
|
||||
static notrace int clock_getres_fallback(clockid_t _clk_id,
|
||||
struct timespec *_res)
|
||||
struct __kernel_old_timespec *_res)
|
||||
{
|
||||
register clockid_t clk_id asm("$r0") = _clk_id;
|
||||
register struct timespec *res asm("$r1") = _res;
|
||||
register struct __kernel_old_timespec *res asm("$r1") = _res;
|
||||
register int ret asm("$r0");
|
||||
|
||||
asm volatile ("movi $r15, %3\n"
|
||||
@ -206,7 +203,7 @@ static notrace int clock_getres_fallback(clockid_t _clk_id,
|
||||
return ret;
|
||||
}
|
||||
|
||||
notrace int __vdso_clock_getres(clockid_t clk_id, struct timespec *res)
|
||||
notrace int __vdso_clock_getres(clockid_t clk_id, struct __kernel_old_timespec *res)
|
||||
{
|
||||
struct vdso_data *vdata = __get_datapage();
|
||||
|
||||
@ -230,10 +227,10 @@ notrace int __vdso_clock_getres(clockid_t clk_id, struct timespec *res)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static notrace inline int gettimeofday_fallback(struct timeval *_tv,
|
||||
static notrace inline int gettimeofday_fallback(struct __kernel_old_timeval *_tv,
|
||||
struct timezone *_tz)
|
||||
{
|
||||
register struct timeval *tv asm("$r0") = _tv;
|
||||
register struct __kernel_old_timeval *tv asm("$r0") = _tv;
|
||||
register struct timezone *tz asm("$r1") = _tz;
|
||||
register int ret asm("$r0");
|
||||
|
||||
@ -246,9 +243,9 @@ static notrace inline int gettimeofday_fallback(struct timeval *_tv,
|
||||
return ret;
|
||||
}
|
||||
|
||||
notrace int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz)
|
||||
notrace int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
|
||||
{
|
||||
struct timespec ts;
|
||||
struct __kernel_old_timespec ts;
|
||||
struct vdso_data *vdata;
|
||||
int ret;
|
||||
|
||||
|
@ -16,9 +16,9 @@
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
#if __BITS_PER_LONG == 64
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
long msg_stime; /* last msgsnd time */
|
||||
long msg_rtime; /* last msgrcv time */
|
||||
long msg_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long msg_stime_high;
|
||||
unsigned long msg_stime; /* last msgsnd time */
|
||||
|
@ -16,8 +16,8 @@
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
#if __BITS_PER_LONG == 64
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
long sem_otime; /* last semop time */
|
||||
long sem_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long sem_otime_high;
|
||||
unsigned long sem_otime; /* last semop time */
|
||||
|
@ -16,9 +16,9 @@
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
#if __BITS_PER_LONG == 64
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
long shm_atime; /* last attach time */
|
||||
long shm_dtime; /* last detach time */
|
||||
long shm_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long shm_atime_high;
|
||||
unsigned long shm_atime; /* last attach time */
|
||||
|
@ -92,7 +92,8 @@ long sys_swapcontext(struct ucontext __user *old_ctx,
|
||||
long sys_debug_setcontext(struct ucontext __user *ctx,
|
||||
int ndbg, struct sig_dbg_op __user *dbg);
|
||||
int
|
||||
ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, struct timeval __user *tvp);
|
||||
ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp,
|
||||
struct __kernel_old_timeval __user *tvp);
|
||||
unsigned long __init early_init(unsigned long dt_ptr);
|
||||
void __init machine_init(u64 dt_ptr);
|
||||
#endif
|
||||
|
@ -81,7 +81,8 @@ struct vdso_data {
|
||||
__u32 stamp_sec_fraction; /* fractional seconds of stamp_xtime */
|
||||
__s32 wtom_clock_nsec; /* Wall to monotonic clock nsec */
|
||||
__s64 wtom_clock_sec; /* Wall to monotonic clock sec */
|
||||
struct timespec stamp_xtime; /* xtime as at tb_orig_stamp */
|
||||
__s64 stamp_xtime_sec; /* xtime secs as at tb_orig_stamp */
|
||||
__s64 stamp_xtime_nsec; /* xtime nsecs as at tb_orig_stamp */
|
||||
__u32 syscall_map_64[SYSCALL_MAP_SIZE]; /* map of syscalls */
|
||||
__u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of syscalls */
|
||||
};
|
||||
@ -101,7 +102,8 @@ struct vdso_data {
|
||||
__u32 tz_dsttime; /* Type of dst correction 0x5C */
|
||||
__s32 wtom_clock_sec; /* Wall to monotonic clock */
|
||||
__s32 wtom_clock_nsec;
|
||||
struct timespec stamp_xtime; /* xtime as at tb_orig_stamp */
|
||||
__s32 stamp_xtime_sec; /* xtime seconds as at tb_orig_stamp */
|
||||
__s32 stamp_xtime_nsec; /* xtime nsecs as at tb_orig_stamp */
|
||||
__u32 stamp_sec_fraction; /* fractional seconds of stamp_xtime */
|
||||
__u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of syscalls */
|
||||
__u32 dcache_block_size; /* L1 d-cache block size */
|
||||
|
@ -11,9 +11,9 @@
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
#ifdef __powerpc64__
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
long msg_stime; /* last msgsnd time */
|
||||
long msg_rtime; /* last msgrcv time */
|
||||
long msg_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long msg_stime_high;
|
||||
unsigned long msg_stime; /* last msgsnd time */
|
||||
|
@ -26,8 +26,8 @@ struct semid64_ds {
|
||||
unsigned long sem_ctime_high;
|
||||
unsigned long sem_ctime; /* last change time */
|
||||
#else
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
long sem_otime; /* last semop time */
|
||||
long sem_ctime; /* last change time */
|
||||
#endif
|
||||
unsigned long sem_nsems; /* no. of semaphores in array */
|
||||
unsigned long __unused3;
|
||||
|
@ -22,9 +22,9 @@
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
#ifdef __powerpc64__
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
long shm_atime; /* last attach time */
|
||||
long shm_dtime; /* last detach time */
|
||||
long shm_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long shm_atime_high;
|
||||
unsigned long shm_atime; /* last attach time */
|
||||
|
@ -40,7 +40,7 @@ struct stat {
|
||||
uid_t st_uid;
|
||||
gid_t st_gid;
|
||||
unsigned long st_rdev;
|
||||
off_t st_size;
|
||||
long st_size;
|
||||
unsigned long st_blksize;
|
||||
unsigned long st_blocks;
|
||||
unsigned long st_atime;
|
||||
|
@ -385,7 +385,8 @@ int main(void)
|
||||
OFFSET(CFG_SYSCALL_MAP32, vdso_data, syscall_map_32);
|
||||
OFFSET(WTOM_CLOCK_SEC, vdso_data, wtom_clock_sec);
|
||||
OFFSET(WTOM_CLOCK_NSEC, vdso_data, wtom_clock_nsec);
|
||||
OFFSET(STAMP_XTIME, vdso_data, stamp_xtime);
|
||||
OFFSET(STAMP_XTIME_SEC, vdso_data, stamp_xtime_sec);
|
||||
OFFSET(STAMP_XTIME_NSEC, vdso_data, stamp_xtime_nsec);
|
||||
OFFSET(STAMP_SEC_FRAC, vdso_data, stamp_sec_fraction);
|
||||
OFFSET(CFG_ICACHE_BLOCKSZ, vdso_data, icache_block_size);
|
||||
OFFSET(CFG_DCACHE_BLOCKSZ, vdso_data, dcache_block_size);
|
||||
@ -393,20 +394,15 @@ int main(void)
|
||||
OFFSET(CFG_DCACHE_LOGBLOCKSZ, vdso_data, dcache_log_block_size);
|
||||
#ifdef CONFIG_PPC64
|
||||
OFFSET(CFG_SYSCALL_MAP64, vdso_data, syscall_map_64);
|
||||
OFFSET(TVAL64_TV_SEC, timeval, tv_sec);
|
||||
OFFSET(TVAL64_TV_USEC, timeval, tv_usec);
|
||||
OFFSET(TVAL64_TV_SEC, __kernel_old_timeval, tv_sec);
|
||||
OFFSET(TVAL64_TV_USEC, __kernel_old_timeval, tv_usec);
|
||||
#endif
|
||||
OFFSET(TSPC64_TV_SEC, __kernel_timespec, tv_sec);
|
||||
OFFSET(TSPC64_TV_NSEC, __kernel_timespec, tv_nsec);
|
||||
OFFSET(TVAL32_TV_SEC, old_timeval32, tv_sec);
|
||||
OFFSET(TVAL32_TV_USEC, old_timeval32, tv_usec);
|
||||
OFFSET(TSPC64_TV_SEC, timespec, tv_sec);
|
||||
OFFSET(TSPC64_TV_NSEC, timespec, tv_nsec);
|
||||
OFFSET(TSPC32_TV_SEC, old_timespec32, tv_sec);
|
||||
OFFSET(TSPC32_TV_NSEC, old_timespec32, tv_nsec);
|
||||
#else
|
||||
OFFSET(TVAL32_TV_SEC, timeval, tv_sec);
|
||||
OFFSET(TVAL32_TV_USEC, timeval, tv_usec);
|
||||
OFFSET(TSPC32_TV_SEC, timespec, tv_sec);
|
||||
OFFSET(TSPC32_TV_NSEC, timespec, tv_nsec);
|
||||
#endif
|
||||
/* timeval/timezone offsets for use by vdso */
|
||||
OFFSET(TZONE_TZ_MINWEST, timezone, tz_minuteswest);
|
||||
OFFSET(TZONE_TZ_DSTTIME, timezone, tz_dsttime);
|
||||
|
@ -79,7 +79,7 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, size_t, len,
|
||||
* sys_select() with the appropriate args. -- Cort
|
||||
*/
|
||||
int
|
||||
ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, struct timeval __user *tvp)
|
||||
ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, struct __kernel_old_timeval __user *tvp)
|
||||
{
|
||||
if ( (unsigned long)n >= 4096 )
|
||||
{
|
||||
@ -89,7 +89,7 @@ ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, s
|
||||
|| __get_user(inp, ((fd_set __user * __user *)(buffer+1)))
|
||||
|| __get_user(outp, ((fd_set __user * __user *)(buffer+2)))
|
||||
|| __get_user(exp, ((fd_set __user * __user *)(buffer+3)))
|
||||
|| __get_user(tvp, ((struct timeval __user * __user *)(buffer+4))))
|
||||
|| __get_user(tvp, ((struct __kernel_old_timeval __user * __user *)(buffer+4))))
|
||||
return -EFAULT;
|
||||
}
|
||||
return sys_select(n, inp, outp, exp, tvp);
|
||||
|
@ -885,7 +885,7 @@ static notrace u64 timebase_read(struct clocksource *cs)
|
||||
|
||||
void update_vsyscall(struct timekeeper *tk)
|
||||
{
|
||||
struct timespec xt;
|
||||
struct timespec64 xt;
|
||||
struct clocksource *clock = tk->tkr_mono.clock;
|
||||
u32 mult = tk->tkr_mono.mult;
|
||||
u32 shift = tk->tkr_mono.shift;
|
||||
@ -957,7 +957,8 @@ void update_vsyscall(struct timekeeper *tk)
|
||||
vdso_data->tb_to_xs = new_tb_to_xs;
|
||||
vdso_data->wtom_clock_sec = tk->wall_to_monotonic.tv_sec;
|
||||
vdso_data->wtom_clock_nsec = tk->wall_to_monotonic.tv_nsec;
|
||||
vdso_data->stamp_xtime = xt;
|
||||
vdso_data->stamp_xtime_sec = xt.tv_sec;
|
||||
vdso_data->stamp_xtime_nsec = xt.tv_nsec;
|
||||
vdso_data->stamp_sec_fraction = frac_sec;
|
||||
smp_wmb();
|
||||
++(vdso_data->tb_update_count);
|
||||
|
@ -15,10 +15,8 @@
|
||||
/* Offset for the low 32-bit part of a field of long type */
|
||||
#ifdef CONFIG_PPC64
|
||||
#define LOPART 4
|
||||
#define TSPEC_TV_SEC TSPC64_TV_SEC+LOPART
|
||||
#else
|
||||
#define LOPART 0
|
||||
#define TSPEC_TV_SEC TSPC32_TV_SEC
|
||||
#endif
|
||||
|
||||
.text
|
||||
@ -192,7 +190,7 @@ V_FUNCTION_BEGIN(__kernel_time)
|
||||
bl __get_datapage@local
|
||||
mr r9, r3 /* datapage ptr in r9 */
|
||||
|
||||
lwz r3,STAMP_XTIME+TSPEC_TV_SEC(r9)
|
||||
lwz r3,STAMP_XTIME_SEC+LOPART(r9)
|
||||
|
||||
cmplwi r11,0 /* check if t is NULL */
|
||||
beq 2f
|
||||
@ -268,7 +266,7 @@ __do_get_tspec:
|
||||
* as a 32.32 fixed-point number in r3 and r4.
|
||||
* Load & add the xtime stamp.
|
||||
*/
|
||||
lwz r5,STAMP_XTIME+TSPEC_TV_SEC(r9)
|
||||
lwz r5,STAMP_XTIME_SEC+LOPART(r9)
|
||||
lwz r6,STAMP_SEC_FRAC(r9)
|
||||
addc r4,r4,r6
|
||||
adde r3,r3,r5
|
||||
|
@ -116,8 +116,8 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
|
||||
* CLOCK_REALTIME_COARSE, below values are needed for MONOTONIC_COARSE
|
||||
* too
|
||||
*/
|
||||
ld r4,STAMP_XTIME+TSPC64_TV_SEC(r3)
|
||||
ld r5,STAMP_XTIME+TSPC64_TV_NSEC(r3)
|
||||
ld r4,STAMP_XTIME_SEC(r3)
|
||||
ld r5,STAMP_XTIME_NSEC(r3)
|
||||
bne cr6,75f
|
||||
|
||||
/* CLOCK_MONOTONIC_COARSE */
|
||||
@ -220,7 +220,7 @@ V_FUNCTION_BEGIN(__kernel_time)
|
||||
mr r11,r3 /* r11 holds t */
|
||||
bl V_LOCAL_FUNC(__get_datapage)
|
||||
|
||||
ld r4,STAMP_XTIME+TSPC64_TV_SEC(r3)
|
||||
ld r4,STAMP_XTIME_SEC(r3)
|
||||
|
||||
cmpldi r11,0 /* check if t is NULL */
|
||||
beq 2f
|
||||
@ -265,7 +265,7 @@ V_FUNCTION_BEGIN(__do_get_tspec)
|
||||
mulhdu r6,r6,r5 /* in units of 2^-32 seconds */
|
||||
|
||||
/* Add stamp since epoch */
|
||||
ld r4,STAMP_XTIME+TSPC64_TV_SEC(r3)
|
||||
ld r4,STAMP_XTIME_SEC(r3)
|
||||
lwz r5,STAMP_SEC_FRAC(r3)
|
||||
or r0,r4,r5
|
||||
or r0,r0,r6
|
||||
|
@ -13,9 +13,9 @@
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
long msg_stime; /* last msgsnd time */
|
||||
long msg_rtime; /* last msgrcv time */
|
||||
long msg_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long msg_stime_high;
|
||||
unsigned long msg_stime; /* last msgsnd time */
|
||||
|
@ -14,8 +14,8 @@
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
long sem_otime; /* last semop time */
|
||||
long sem_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long sem_otime_high;
|
||||
unsigned long sem_otime; /* last semop time */
|
||||
|
@ -14,9 +14,9 @@
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
#if defined(__sparc__) && defined(__arch64__)
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
long shm_atime; /* last attach time */
|
||||
long shm_dtime; /* last detach time */
|
||||
long shm_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long shm_atime_high;
|
||||
unsigned long shm_atime; /* last attach time */
|
||||
|
@ -14,12 +14,12 @@ struct stat {
|
||||
uid_t st_uid;
|
||||
gid_t st_gid;
|
||||
unsigned int st_rdev;
|
||||
off_t st_size;
|
||||
time_t st_atime;
|
||||
time_t st_mtime;
|
||||
time_t st_ctime;
|
||||
off_t st_blksize;
|
||||
off_t st_blocks;
|
||||
long st_size;
|
||||
long st_atime;
|
||||
long st_mtime;
|
||||
long st_ctime;
|
||||
long st_blksize;
|
||||
long st_blocks;
|
||||
unsigned long __unused4[2];
|
||||
};
|
||||
|
||||
@ -57,15 +57,15 @@ struct stat {
|
||||
unsigned short st_uid;
|
||||
unsigned short st_gid;
|
||||
unsigned short st_rdev;
|
||||
off_t st_size;
|
||||
time_t st_atime;
|
||||
long st_size;
|
||||
long st_atime;
|
||||
unsigned long st_atime_nsec;
|
||||
time_t st_mtime;
|
||||
long st_mtime;
|
||||
unsigned long st_mtime_nsec;
|
||||
time_t st_ctime;
|
||||
long st_ctime;
|
||||
unsigned long st_ctime_nsec;
|
||||
off_t st_blksize;
|
||||
off_t st_blocks;
|
||||
long st_blksize;
|
||||
long st_blocks;
|
||||
unsigned long __unused4[2];
|
||||
};
|
||||
|
||||
|
@ -63,7 +63,7 @@ notrace static __always_inline struct vvar_data *get_vvar_data(void)
|
||||
return (struct vvar_data *) ret;
|
||||
}
|
||||
|
||||
notrace static long vdso_fallback_gettime(long clock, struct timespec *ts)
|
||||
notrace static long vdso_fallback_gettime(long clock, struct __kernel_old_timespec *ts)
|
||||
{
|
||||
register long num __asm__("g1") = __NR_clock_gettime;
|
||||
register long o0 __asm__("o0") = clock;
|
||||
@ -74,7 +74,7 @@ notrace static long vdso_fallback_gettime(long clock, struct timespec *ts)
|
||||
return o0;
|
||||
}
|
||||
|
||||
notrace static long vdso_fallback_gettimeofday(struct timeval *tv, struct timezone *tz)
|
||||
notrace static long vdso_fallback_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
|
||||
{
|
||||
register long num __asm__("g1") = __NR_gettimeofday;
|
||||
register long o0 __asm__("o0") = (long) tv;
|
||||
@ -144,7 +144,7 @@ notrace static __always_inline u64 vgetsns_stick(struct vvar_data *vvar)
|
||||
}
|
||||
|
||||
notrace static __always_inline int do_realtime(struct vvar_data *vvar,
|
||||
struct timespec *ts)
|
||||
struct __kernel_old_timespec *ts)
|
||||
{
|
||||
unsigned long seq;
|
||||
u64 ns;
|
||||
@ -164,7 +164,7 @@ notrace static __always_inline int do_realtime(struct vvar_data *vvar,
|
||||
}
|
||||
|
||||
notrace static __always_inline int do_realtime_stick(struct vvar_data *vvar,
|
||||
struct timespec *ts)
|
||||
struct __kernel_old_timespec *ts)
|
||||
{
|
||||
unsigned long seq;
|
||||
u64 ns;
|
||||
@ -184,7 +184,7 @@ notrace static __always_inline int do_realtime_stick(struct vvar_data *vvar,
|
||||
}
|
||||
|
||||
notrace static __always_inline int do_monotonic(struct vvar_data *vvar,
|
||||
struct timespec *ts)
|
||||
struct __kernel_old_timespec *ts)
|
||||
{
|
||||
unsigned long seq;
|
||||
u64 ns;
|
||||
@ -204,7 +204,7 @@ notrace static __always_inline int do_monotonic(struct vvar_data *vvar,
|
||||
}
|
||||
|
||||
notrace static __always_inline int do_monotonic_stick(struct vvar_data *vvar,
|
||||
struct timespec *ts)
|
||||
struct __kernel_old_timespec *ts)
|
||||
{
|
||||
unsigned long seq;
|
||||
u64 ns;
|
||||
@ -224,7 +224,7 @@ notrace static __always_inline int do_monotonic_stick(struct vvar_data *vvar,
|
||||
}
|
||||
|
||||
notrace static int do_realtime_coarse(struct vvar_data *vvar,
|
||||
struct timespec *ts)
|
||||
struct __kernel_old_timespec *ts)
|
||||
{
|
||||
unsigned long seq;
|
||||
|
||||
@ -237,7 +237,7 @@ notrace static int do_realtime_coarse(struct vvar_data *vvar,
|
||||
}
|
||||
|
||||
notrace static int do_monotonic_coarse(struct vvar_data *vvar,
|
||||
struct timespec *ts)
|
||||
struct __kernel_old_timespec *ts)
|
||||
{
|
||||
unsigned long seq;
|
||||
|
||||
@ -251,7 +251,7 @@ notrace static int do_monotonic_coarse(struct vvar_data *vvar,
|
||||
}
|
||||
|
||||
notrace int
|
||||
__vdso_clock_gettime(clockid_t clock, struct timespec *ts)
|
||||
__vdso_clock_gettime(clockid_t clock, struct __kernel_old_timespec *ts)
|
||||
{
|
||||
struct vvar_data *vvd = get_vvar_data();
|
||||
|
||||
@ -275,11 +275,11 @@ __vdso_clock_gettime(clockid_t clock, struct timespec *ts)
|
||||
return vdso_fallback_gettime(clock, ts);
|
||||
}
|
||||
int
|
||||
clock_gettime(clockid_t, struct timespec *)
|
||||
clock_gettime(clockid_t, struct __kernel_old_timespec *)
|
||||
__attribute__((weak, alias("__vdso_clock_gettime")));
|
||||
|
||||
notrace int
|
||||
__vdso_clock_gettime_stick(clockid_t clock, struct timespec *ts)
|
||||
__vdso_clock_gettime_stick(clockid_t clock, struct __kernel_old_timespec *ts)
|
||||
{
|
||||
struct vvar_data *vvd = get_vvar_data();
|
||||
|
||||
@ -304,15 +304,15 @@ __vdso_clock_gettime_stick(clockid_t clock, struct timespec *ts)
|
||||
}
|
||||
|
||||
notrace int
|
||||
__vdso_gettimeofday(struct timeval *tv, struct timezone *tz)
|
||||
__vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
|
||||
{
|
||||
struct vvar_data *vvd = get_vvar_data();
|
||||
|
||||
if (likely(vvd->vclock_mode != VCLOCK_NONE)) {
|
||||
if (likely(tv != NULL)) {
|
||||
union tstv_t {
|
||||
struct timespec ts;
|
||||
struct timeval tv;
|
||||
struct __kernel_old_timespec ts;
|
||||
struct __kernel_old_timeval tv;
|
||||
} *tstv = (union tstv_t *) tv;
|
||||
do_realtime(vvd, &tstv->ts);
|
||||
/*
|
||||
@ -336,19 +336,19 @@ __vdso_gettimeofday(struct timeval *tv, struct timezone *tz)
|
||||
return vdso_fallback_gettimeofday(tv, tz);
|
||||
}
|
||||
int
|
||||
gettimeofday(struct timeval *, struct timezone *)
|
||||
gettimeofday(struct __kernel_old_timeval *, struct timezone *)
|
||||
__attribute__((weak, alias("__vdso_gettimeofday")));
|
||||
|
||||
notrace int
|
||||
__vdso_gettimeofday_stick(struct timeval *tv, struct timezone *tz)
|
||||
__vdso_gettimeofday_stick(struct __kernel_old_timeval *tv, struct timezone *tz)
|
||||
{
|
||||
struct vvar_data *vvd = get_vvar_data();
|
||||
|
||||
if (likely(vvd->vclock_mode != VCLOCK_NONE)) {
|
||||
if (likely(tv != NULL)) {
|
||||
union tstv_t {
|
||||
struct timespec ts;
|
||||
struct timeval tv;
|
||||
struct __kernel_old_timespec ts;
|
||||
struct __kernel_old_timeval tv;
|
||||
} *tstv = (union tstv_t *) tv;
|
||||
do_realtime_stick(vvd, &tstv->ts);
|
||||
/*
|
||||
|
@ -15,7 +15,7 @@
|
||||
#include "../../../../lib/vdso/gettimeofday.c"
|
||||
|
||||
extern int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz);
|
||||
extern time_t __vdso_time(time_t *t);
|
||||
extern __kernel_old_time_t __vdso_time(__kernel_old_time_t *t);
|
||||
|
||||
int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
|
||||
{
|
||||
@ -25,12 +25,12 @@ int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
|
||||
int gettimeofday(struct __kernel_old_timeval *, struct timezone *)
|
||||
__attribute__((weak, alias("__vdso_gettimeofday")));
|
||||
|
||||
time_t __vdso_time(time_t *t)
|
||||
__kernel_old_time_t __vdso_time(__kernel_old_time_t *t)
|
||||
{
|
||||
return __cvdso_time(t);
|
||||
}
|
||||
|
||||
time_t time(time_t *t) __attribute__((weak, alias("__vdso_time")));
|
||||
__kernel_old_time_t time(__kernel_old_time_t *t) __attribute__((weak, alias("__vdso_time")));
|
||||
|
||||
|
||||
#if defined(CONFIG_X86_64) && !defined(BUILD_VDSO32_64)
|
||||
|
@ -184,7 +184,7 @@ bool emulate_vsyscall(unsigned long error_code,
|
||||
*/
|
||||
switch (vsyscall_nr) {
|
||||
case 0:
|
||||
if (!write_ok_or_segv(regs->di, sizeof(struct timeval)) ||
|
||||
if (!write_ok_or_segv(regs->di, sizeof(struct __kernel_old_timeval)) ||
|
||||
!write_ok_or_segv(regs->si, sizeof(struct timezone))) {
|
||||
ret = -EFAULT;
|
||||
goto check_fault;
|
||||
@ -194,7 +194,7 @@ bool emulate_vsyscall(unsigned long error_code,
|
||||
break;
|
||||
|
||||
case 1:
|
||||
if (!write_ok_or_segv(regs->di, sizeof(time_t))) {
|
||||
if (!write_ok_or_segv(regs->di, sizeof(__kernel_old_time_t))) {
|
||||
ret = -EFAULT;
|
||||
goto check_fault;
|
||||
}
|
||||
|
@ -15,9 +15,9 @@
|
||||
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
__kernel_long_t msg_stime; /* last msgsnd time */
|
||||
__kernel_long_t msg_rtime; /* last msgrcv time */
|
||||
__kernel_long_t msg_ctime; /* last change time */
|
||||
__kernel_ulong_t msg_cbytes; /* current number of bytes on queue */
|
||||
__kernel_ulong_t msg_qnum; /* number of messages in queue */
|
||||
__kernel_ulong_t msg_qbytes; /* max number of bytes on queue */
|
||||
|
@ -21,9 +21,9 @@ struct semid64_ds {
|
||||
unsigned long sem_ctime; /* last change time */
|
||||
unsigned long sem_ctime_high;
|
||||
#else
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
__kernel_long_t sem_otime; /* last semop time */
|
||||
__kernel_ulong_t __unused1;
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
__kernel_long_t sem_ctime; /* last change time */
|
||||
__kernel_ulong_t __unused2;
|
||||
#endif
|
||||
__kernel_ulong_t sem_nsems; /* no. of semaphores in array */
|
||||
|
@ -16,9 +16,9 @@
|
||||
struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
size_t shm_segsz; /* size of segment (bytes) */
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
__kernel_long_t shm_atime; /* last attach time */
|
||||
__kernel_long_t shm_dtime; /* last detach time */
|
||||
__kernel_long_t shm_ctime; /* last change time */
|
||||
__kernel_pid_t shm_cpid; /* pid of creator */
|
||||
__kernel_pid_t shm_lpid; /* pid of last operator */
|
||||
__kernel_ulong_t shm_nattch; /* no. of current attaches */
|
||||
|
@ -13,7 +13,7 @@
|
||||
#include <linux/getcpu.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
int __vdso_clock_gettime(clockid_t clock, struct timespec *ts)
|
||||
int __vdso_clock_gettime(clockid_t clock, struct __kernel_old_timespec *ts)
|
||||
{
|
||||
long ret;
|
||||
|
||||
@ -22,10 +22,10 @@ int __vdso_clock_gettime(clockid_t clock, struct timespec *ts)
|
||||
|
||||
return ret;
|
||||
}
|
||||
int clock_gettime(clockid_t, struct timespec *)
|
||||
int clock_gettime(clockid_t, struct __kernel_old_timespec *)
|
||||
__attribute__((weak, alias("__vdso_clock_gettime")));
|
||||
|
||||
int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz)
|
||||
int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
|
||||
{
|
||||
long ret;
|
||||
|
||||
@ -34,10 +34,10 @@ int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz)
|
||||
|
||||
return ret;
|
||||
}
|
||||
int gettimeofday(struct timeval *, struct timezone *)
|
||||
int gettimeofday(struct __kernel_old_timeval *, struct timezone *)
|
||||
__attribute__((weak, alias("__vdso_gettimeofday")));
|
||||
|
||||
time_t __vdso_time(time_t *t)
|
||||
__kernel_old_time_t __vdso_time(__kernel_old_time_t *t)
|
||||
{
|
||||
long secs;
|
||||
|
||||
@ -47,7 +47,7 @@ time_t __vdso_time(time_t *t)
|
||||
|
||||
return secs;
|
||||
}
|
||||
time_t time(time_t *t) __attribute__((weak, alias("__vdso_time")));
|
||||
__kernel_old_time_t time(__kernel_old_time_t *t) __attribute__((weak, alias("__vdso_time")));
|
||||
|
||||
long
|
||||
__vdso_getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *unused)
|
||||
|
2
fs/aio.c
2
fs/aio.c
@ -2056,7 +2056,7 @@ static long do_io_getevents(aio_context_t ctx_id,
|
||||
* specifies an infinite timeout. Note that the timeout pointed to by
|
||||
* timeout is relative. Will fail with -ENOSYS if not implemented.
|
||||
*/
|
||||
#if !defined(CONFIG_64BIT_TIME) || defined(CONFIG_64BIT)
|
||||
#ifdef CONFIG_64BIT
|
||||
|
||||
SYSCALL_DEFINE5(io_getevents, aio_context_t, ctx_id,
|
||||
long, min_nr,
|
||||
|
@ -1489,18 +1489,18 @@ static void fill_prstatus(struct elf_prstatus *prstatus,
|
||||
* group-wide total, not its individual thread total.
|
||||
*/
|
||||
thread_group_cputime(p, &cputime);
|
||||
prstatus->pr_utime = ns_to_timeval(cputime.utime);
|
||||
prstatus->pr_stime = ns_to_timeval(cputime.stime);
|
||||
prstatus->pr_utime = ns_to_kernel_old_timeval(cputime.utime);
|
||||
prstatus->pr_stime = ns_to_kernel_old_timeval(cputime.stime);
|
||||
} else {
|
||||
u64 utime, stime;
|
||||
|
||||
task_cputime(p, &utime, &stime);
|
||||
prstatus->pr_utime = ns_to_timeval(utime);
|
||||
prstatus->pr_stime = ns_to_timeval(stime);
|
||||
prstatus->pr_utime = ns_to_kernel_old_timeval(utime);
|
||||
prstatus->pr_stime = ns_to_kernel_old_timeval(stime);
|
||||
}
|
||||
|
||||
prstatus->pr_cutime = ns_to_timeval(p->signal->cutime);
|
||||
prstatus->pr_cstime = ns_to_timeval(p->signal->cstime);
|
||||
prstatus->pr_cutime = ns_to_kernel_old_timeval(p->signal->cutime);
|
||||
prstatus->pr_cstime = ns_to_kernel_old_timeval(p->signal->cstime);
|
||||
}
|
||||
|
||||
static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
|
||||
|
@ -1359,17 +1359,17 @@ static void fill_prstatus(struct elf_prstatus *prstatus,
|
||||
* group-wide total, not its individual thread total.
|
||||
*/
|
||||
thread_group_cputime(p, &cputime);
|
||||
prstatus->pr_utime = ns_to_timeval(cputime.utime);
|
||||
prstatus->pr_stime = ns_to_timeval(cputime.stime);
|
||||
prstatus->pr_utime = ns_to_kernel_old_timeval(cputime.utime);
|
||||
prstatus->pr_stime = ns_to_kernel_old_timeval(cputime.stime);
|
||||
} else {
|
||||
u64 utime, stime;
|
||||
|
||||
task_cputime(p, &utime, &stime);
|
||||
prstatus->pr_utime = ns_to_timeval(utime);
|
||||
prstatus->pr_stime = ns_to_timeval(stime);
|
||||
prstatus->pr_utime = ns_to_kernel_old_timeval(utime);
|
||||
prstatus->pr_stime = ns_to_kernel_old_timeval(stime);
|
||||
}
|
||||
prstatus->pr_cutime = ns_to_timeval(p->signal->cutime);
|
||||
prstatus->pr_cstime = ns_to_timeval(p->signal->cstime);
|
||||
prstatus->pr_cutime = ns_to_kernel_old_timeval(p->signal->cutime);
|
||||
prstatus->pr_cstime = ns_to_kernel_old_timeval(p->signal->cstime);
|
||||
|
||||
prstatus->pr_exec_fdpic_loadmap = p->mm->context.exec_fdpic_loadmap;
|
||||
prstatus->pr_interp_fdpic_loadmap = p->mm->context.interp_fdpic_loadmap;
|
||||
|
@ -48,8 +48,8 @@
|
||||
#define elf_prstatus compat_elf_prstatus
|
||||
#define elf_prpsinfo compat_elf_prpsinfo
|
||||
|
||||
#undef ns_to_timeval
|
||||
#define ns_to_timeval ns_to_old_timeval32
|
||||
#undef ns_to_kernel_old_timeval
|
||||
#define ns_to_kernel_old_timeval ns_to_old_timeval32
|
||||
|
||||
/*
|
||||
* To use this file, asm/elf.h must define compat_elf_check_arch.
|
||||
|
10
fs/select.c
10
fs/select.c
@ -321,7 +321,7 @@ static int poll_select_finish(struct timespec64 *end_time,
|
||||
switch (pt_type) {
|
||||
case PT_TIMEVAL:
|
||||
{
|
||||
struct timeval rtv;
|
||||
struct __kernel_old_timeval rtv;
|
||||
|
||||
if (sizeof(rtv) > sizeof(rtv.tv_sec) + sizeof(rtv.tv_usec))
|
||||
memset(&rtv, 0, sizeof(rtv));
|
||||
@ -698,10 +698,10 @@ out_nofds:
|
||||
}
|
||||
|
||||
static int kern_select(int n, fd_set __user *inp, fd_set __user *outp,
|
||||
fd_set __user *exp, struct timeval __user *tvp)
|
||||
fd_set __user *exp, struct __kernel_old_timeval __user *tvp)
|
||||
{
|
||||
struct timespec64 end_time, *to = NULL;
|
||||
struct timeval tv;
|
||||
struct __kernel_old_timeval tv;
|
||||
int ret;
|
||||
|
||||
if (tvp) {
|
||||
@ -720,7 +720,7 @@ static int kern_select(int n, fd_set __user *inp, fd_set __user *outp,
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE5(select, int, n, fd_set __user *, inp, fd_set __user *, outp,
|
||||
fd_set __user *, exp, struct timeval __user *, tvp)
|
||||
fd_set __user *, exp, struct __kernel_old_timeval __user *, tvp)
|
||||
{
|
||||
return kern_select(n, inp, outp, exp, tvp);
|
||||
}
|
||||
@ -810,7 +810,7 @@ SYSCALL_DEFINE6(pselect6_time32, int, n, fd_set __user *, inp, fd_set __user *,
|
||||
struct sel_arg_struct {
|
||||
unsigned long n;
|
||||
fd_set __user *inp, *outp, *exp;
|
||||
struct timeval __user *tvp;
|
||||
struct __kernel_old_timeval __user *tvp;
|
||||
};
|
||||
|
||||
SYSCALL_DEFINE1(old_select, struct sel_arg_struct __user *, arg)
|
||||
|
14
fs/timerfd.c
14
fs/timerfd.c
@ -302,11 +302,11 @@ static ssize_t timerfd_read(struct file *file, char __user *buf, size_t count,
|
||||
static void timerfd_show(struct seq_file *m, struct file *file)
|
||||
{
|
||||
struct timerfd_ctx *ctx = file->private_data;
|
||||
struct itimerspec t;
|
||||
struct timespec64 value, interval;
|
||||
|
||||
spin_lock_irq(&ctx->wqh.lock);
|
||||
t.it_value = ktime_to_timespec(timerfd_get_remaining(ctx));
|
||||
t.it_interval = ktime_to_timespec(ctx->tintv);
|
||||
value = ktime_to_timespec64(timerfd_get_remaining(ctx));
|
||||
interval = ktime_to_timespec64(ctx->tintv);
|
||||
spin_unlock_irq(&ctx->wqh.lock);
|
||||
|
||||
seq_printf(m,
|
||||
@ -318,10 +318,10 @@ static void timerfd_show(struct seq_file *m, struct file *file)
|
||||
ctx->clockid,
|
||||
(unsigned long long)ctx->ticks,
|
||||
ctx->settime_flags,
|
||||
(unsigned long long)t.it_value.tv_sec,
|
||||
(unsigned long long)t.it_value.tv_nsec,
|
||||
(unsigned long long)t.it_interval.tv_sec,
|
||||
(unsigned long long)t.it_interval.tv_nsec);
|
||||
(unsigned long long)value.tv_sec,
|
||||
(unsigned long long)value.tv_nsec,
|
||||
(unsigned long long)interval.tv_sec,
|
||||
(unsigned long long)interval.tv_nsec);
|
||||
}
|
||||
#else
|
||||
#define timerfd_show NULL
|
||||
|
@ -161,9 +161,9 @@ SYSCALL_DEFINE4(utimensat, int, dfd, const char __user *, filename,
|
||||
* utimensat() instead.
|
||||
*/
|
||||
static long do_futimesat(int dfd, const char __user *filename,
|
||||
struct timeval __user *utimes)
|
||||
struct __kernel_old_timeval __user *utimes)
|
||||
{
|
||||
struct timeval times[2];
|
||||
struct __kernel_old_timeval times[2];
|
||||
struct timespec64 tstimes[2];
|
||||
|
||||
if (utimes) {
|
||||
@ -190,13 +190,13 @@ static long do_futimesat(int dfd, const char __user *filename,
|
||||
|
||||
|
||||
SYSCALL_DEFINE3(futimesat, int, dfd, const char __user *, filename,
|
||||
struct timeval __user *, utimes)
|
||||
struct __kernel_old_timeval __user *, utimes)
|
||||
{
|
||||
return do_futimesat(dfd, filename, utimes);
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE2(utimes, char __user *, filename,
|
||||
struct timeval __user *, utimes)
|
||||
struct __kernel_old_timeval __user *, utimes)
|
||||
{
|
||||
return do_futimesat(AT_FDCWD, filename, utimes);
|
||||
}
|
||||
|
@ -116,14 +116,7 @@ typedef __compat_gid32_t compat_gid_t;
|
||||
struct compat_sel_arg_struct;
|
||||
struct rusage;
|
||||
|
||||
struct compat_itimerval {
|
||||
struct old_timeval32 it_interval;
|
||||
struct old_timeval32 it_value;
|
||||
};
|
||||
|
||||
struct itimerval;
|
||||
int get_compat_itimerval(struct itimerval *, const struct compat_itimerval __user *);
|
||||
int put_compat_itimerval(struct compat_itimerval __user *, const struct itimerval *);
|
||||
struct old_itimerval32;
|
||||
|
||||
struct compat_tms {
|
||||
compat_clock_t tms_utime;
|
||||
@ -666,10 +659,10 @@ compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,
|
||||
|
||||
/* kernel/itimer.c */
|
||||
asmlinkage long compat_sys_getitimer(int which,
|
||||
struct compat_itimerval __user *it);
|
||||
struct old_itimerval32 __user *it);
|
||||
asmlinkage long compat_sys_setitimer(int which,
|
||||
struct compat_itimerval __user *in,
|
||||
struct compat_itimerval __user *out);
|
||||
struct old_itimerval32 __user *in,
|
||||
struct old_itimerval32 __user *out);
|
||||
|
||||
/* kernel/kexec.c */
|
||||
asmlinkage long compat_sys_kexec_load(compat_ulong_t entry,
|
||||
@ -935,10 +928,10 @@ static inline bool in_compat_syscall(void) { return is_compat_task(); }
|
||||
*/
|
||||
static inline struct old_timeval32 ns_to_old_timeval32(s64 nsec)
|
||||
{
|
||||
struct timeval tv;
|
||||
struct __kernel_old_timeval tv;
|
||||
struct old_timeval32 ctv;
|
||||
|
||||
tv = ns_to_timeval(nsec);
|
||||
tv = ns_to_kernel_old_timeval(nsec);
|
||||
ctv.tv_sec = tv.tv_sec;
|
||||
ctv.tv_usec = tv.tv_usec;
|
||||
|
||||
|
@ -3658,9 +3658,12 @@ static inline void skb_get_new_timestamp(const struct sk_buff *skb,
|
||||
}
|
||||
|
||||
static inline void skb_get_timestampns(const struct sk_buff *skb,
|
||||
struct timespec *stamp)
|
||||
struct __kernel_old_timespec *stamp)
|
||||
{
|
||||
*stamp = ktime_to_timespec(skb->tstamp);
|
||||
struct timespec64 ts = ktime_to_timespec64(skb->tstamp);
|
||||
|
||||
stamp->tv_sec = ts.tv_sec;
|
||||
stamp->tv_nsec = ts.tv_nsec;
|
||||
}
|
||||
|
||||
static inline void skb_get_new_timestampns(const struct sk_buff *skb,
|
||||
|
@ -51,7 +51,7 @@ struct statx;
|
||||
struct __sysctl_args;
|
||||
struct sysinfo;
|
||||
struct timespec;
|
||||
struct timeval;
|
||||
struct __kernel_old_timeval;
|
||||
struct __kernel_timex;
|
||||
struct timezone;
|
||||
struct tms;
|
||||
@ -732,9 +732,9 @@ asmlinkage long sys_prctl(int option, unsigned long arg2, unsigned long arg3,
|
||||
asmlinkage long sys_getcpu(unsigned __user *cpu, unsigned __user *node, struct getcpu_cache __user *cache);
|
||||
|
||||
/* kernel/time.c */
|
||||
asmlinkage long sys_gettimeofday(struct timeval __user *tv,
|
||||
asmlinkage long sys_gettimeofday(struct __kernel_old_timeval __user *tv,
|
||||
struct timezone __user *tz);
|
||||
asmlinkage long sys_settimeofday(struct timeval __user *tv,
|
||||
asmlinkage long sys_settimeofday(struct __kernel_old_timeval __user *tv,
|
||||
struct timezone __user *tz);
|
||||
asmlinkage long sys_adjtimex(struct __kernel_timex __user *txc_p);
|
||||
asmlinkage long sys_adjtimex_time32(struct old_timex32 __user *txc_p);
|
||||
@ -1076,15 +1076,15 @@ asmlinkage long sys_fadvise64(int fd, loff_t offset, size_t len, int advice);
|
||||
asmlinkage long sys_alarm(unsigned int seconds);
|
||||
asmlinkage long sys_getpgrp(void);
|
||||
asmlinkage long sys_pause(void);
|
||||
asmlinkage long sys_time(time_t __user *tloc);
|
||||
asmlinkage long sys_time(__kernel_old_time_t __user *tloc);
|
||||
asmlinkage long sys_time32(old_time32_t __user *tloc);
|
||||
#ifdef __ARCH_WANT_SYS_UTIME
|
||||
asmlinkage long sys_utime(char __user *filename,
|
||||
struct utimbuf __user *times);
|
||||
asmlinkage long sys_utimes(char __user *filename,
|
||||
struct timeval __user *utimes);
|
||||
struct __kernel_old_timeval __user *utimes);
|
||||
asmlinkage long sys_futimesat(int dfd, const char __user *filename,
|
||||
struct timeval __user *utimes);
|
||||
struct __kernel_old_timeval __user *utimes);
|
||||
#endif
|
||||
asmlinkage long sys_futimesat_time32(unsigned int dfd,
|
||||
const char __user *filename,
|
||||
@ -1098,7 +1098,7 @@ asmlinkage long sys_getdents(unsigned int fd,
|
||||
struct linux_dirent __user *dirent,
|
||||
unsigned int count);
|
||||
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 __kernel_old_timeval __user *tvp);
|
||||
asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds,
|
||||
int timeout);
|
||||
asmlinkage long sys_epoll_wait(int epfd, struct epoll_event __user *events,
|
||||
@ -1116,7 +1116,7 @@ asmlinkage long sys_sysfs(int option,
|
||||
asmlinkage long sys_fork(void);
|
||||
|
||||
/* obsolete: kernel/time/time.c */
|
||||
asmlinkage long sys_stime(time_t __user *tptr);
|
||||
asmlinkage long sys_stime(__kernel_old_time_t __user *tptr);
|
||||
asmlinkage long sys_stime32(old_time32_t __user *tptr);
|
||||
|
||||
/* obsolete: kernel/signal.c */
|
||||
|
@ -35,10 +35,11 @@ extern time64_t mktime64(const unsigned int year, const unsigned int mon,
|
||||
extern u32 (*arch_gettimeoffset)(void);
|
||||
#endif
|
||||
|
||||
struct itimerval;
|
||||
extern int do_setitimer(int which, struct itimerval *value,
|
||||
struct itimerval *ovalue);
|
||||
extern int do_getitimer(int which, struct itimerval *value);
|
||||
#ifdef CONFIG_POSIX_TIMERS
|
||||
extern void clear_itimer(void);
|
||||
#else
|
||||
static inline void clear_itimer(void) {}
|
||||
#endif
|
||||
|
||||
extern long do_utimes(int dfd, const char __user *filename, struct timespec64 *times, int flags);
|
||||
|
||||
|
@ -12,7 +12,7 @@
|
||||
#include <linux/time64.h>
|
||||
#include <linux/timex.h>
|
||||
|
||||
#define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
|
||||
#define TIME_T_MAX (__kernel_old_time_t)((1UL << ((sizeof(__kernel_old_time_t) << 3) - 1)) - 1)
|
||||
|
||||
typedef s32 old_time32_t;
|
||||
|
||||
|
@ -67,7 +67,7 @@ typedef __kernel_ptrdiff_t ptrdiff_t;
|
||||
|
||||
#ifndef _TIME_T
|
||||
#define _TIME_T
|
||||
typedef __kernel_time_t time_t;
|
||||
typedef __kernel_old_time_t time_t;
|
||||
#endif
|
||||
|
||||
#ifndef _CLOCK_T
|
||||
|
@ -303,7 +303,7 @@ DEFINE_EVENT(hrtimer_class, hrtimer_cancel,
|
||||
*/
|
||||
TRACE_EVENT(itimer_state,
|
||||
|
||||
TP_PROTO(int which, const struct itimerval *const value,
|
||||
TP_PROTO(int which, const struct itimerspec64 *const value,
|
||||
unsigned long long expires),
|
||||
|
||||
TP_ARGS(which, value, expires),
|
||||
@ -312,24 +312,24 @@ TRACE_EVENT(itimer_state,
|
||||
__field( int, which )
|
||||
__field( unsigned long long, expires )
|
||||
__field( long, value_sec )
|
||||
__field( long, value_usec )
|
||||
__field( long, value_nsec )
|
||||
__field( long, interval_sec )
|
||||
__field( long, interval_usec )
|
||||
__field( long, interval_nsec )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->which = which;
|
||||
__entry->expires = expires;
|
||||
__entry->value_sec = value->it_value.tv_sec;
|
||||
__entry->value_usec = value->it_value.tv_usec;
|
||||
__entry->value_nsec = value->it_value.tv_nsec;
|
||||
__entry->interval_sec = value->it_interval.tv_sec;
|
||||
__entry->interval_usec = value->it_interval.tv_usec;
|
||||
__entry->interval_nsec = value->it_interval.tv_nsec;
|
||||
),
|
||||
|
||||
TP_printk("which=%d expires=%llu it_value=%ld.%ld it_interval=%ld.%ld",
|
||||
TP_printk("which=%d expires=%llu it_value=%ld.%06ld it_interval=%ld.%06ld",
|
||||
__entry->which, __entry->expires,
|
||||
__entry->value_sec, __entry->value_usec,
|
||||
__entry->interval_sec, __entry->interval_usec)
|
||||
__entry->value_sec, __entry->value_nsec / NSEC_PER_USEC,
|
||||
__entry->interval_sec, __entry->interval_nsec / NSEC_PER_USEC)
|
||||
);
|
||||
|
||||
/**
|
||||
|
@ -13,9 +13,9 @@
|
||||
* everyone just ended up making identical copies without specific
|
||||
* optimizations, so we may just as well all use the same one.
|
||||
*
|
||||
* 64 bit architectures typically define a 64 bit __kernel_time_t,
|
||||
* so they do not need the first three padding words.
|
||||
* On big-endian systems, the padding is in the wrong place.
|
||||
* 64 bit architectures use a 64-bit long time field here, while
|
||||
* 32 bit architectures have a pair of unsigned long values.
|
||||
* On big-endian systems, the lower half is in the wrong place.
|
||||
*
|
||||
* Pad space is left for:
|
||||
* - 2 miscellaneous 32-bit values
|
||||
@ -24,9 +24,9 @@
|
||||
struct msqid64_ds {
|
||||
struct ipc64_perm msg_perm;
|
||||
#if __BITS_PER_LONG == 64
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
long msg_stime; /* last msgsnd time */
|
||||
long msg_rtime; /* last msgrcv time */
|
||||
long msg_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long msg_stime; /* last msgsnd time */
|
||||
unsigned long msg_stime_high;
|
||||
|
@ -86,6 +86,7 @@ typedef struct {
|
||||
*/
|
||||
typedef __kernel_long_t __kernel_off_t;
|
||||
typedef long long __kernel_loff_t;
|
||||
typedef __kernel_long_t __kernel_old_time_t;
|
||||
typedef __kernel_long_t __kernel_time_t;
|
||||
typedef long long __kernel_time64_t;
|
||||
typedef __kernel_long_t __kernel_clock_t;
|
||||
|
@ -13,9 +13,8 @@
|
||||
* everyone just ended up making identical copies without specific
|
||||
* optimizations, so we may just as well all use the same one.
|
||||
*
|
||||
* 64 bit architectures use a 64-bit __kernel_time_t here, while
|
||||
* 64 bit architectures use a 64-bit long time field here, while
|
||||
* 32 bit architectures have a pair of unsigned long values.
|
||||
* so they do not need the first two padding words.
|
||||
*
|
||||
* On big-endian systems, the padding is in the wrong place for
|
||||
* historic reasons, so user space has to reconstruct a time_t
|
||||
@ -29,8 +28,8 @@
|
||||
struct semid64_ds {
|
||||
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
|
||||
#if __BITS_PER_LONG == 64
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
__kernel_time_t sem_ctime; /* last change time */
|
||||
long sem_otime; /* last semop time */
|
||||
long sem_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long sem_otime; /* last semop time */
|
||||
unsigned long sem_otime_high;
|
||||
|
@ -13,9 +13,9 @@
|
||||
* everyone just ended up making identical copies without specific
|
||||
* optimizations, so we may just as well all use the same one.
|
||||
*
|
||||
* 64 bit architectures typically define a 64 bit __kernel_time_t,
|
||||
* so they do not need the first two padding words.
|
||||
* On big-endian systems, the padding is in the wrong place.
|
||||
* 64 bit architectures use a 64-bit long time field here, while
|
||||
* 32 bit architectures have a pair of unsigned long values.
|
||||
* On big-endian systems, the lower half is in the wrong place.
|
||||
*
|
||||
*
|
||||
* Pad space is left for:
|
||||
@ -26,9 +26,9 @@ struct shmid64_ds {
|
||||
struct ipc64_perm shm_perm; /* operation perms */
|
||||
size_t shm_segsz; /* size of segment (bytes) */
|
||||
#if __BITS_PER_LONG == 64
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
long shm_atime; /* last attach time */
|
||||
long shm_dtime; /* last detach time */
|
||||
long shm_ctime; /* last change time */
|
||||
#else
|
||||
unsigned long shm_atime; /* last attach time */
|
||||
unsigned long shm_atime_high;
|
||||
|
@ -83,9 +83,9 @@ struct cyclades_monitor {
|
||||
* open)
|
||||
*/
|
||||
struct cyclades_idle_stats {
|
||||
__kernel_time_t in_use; /* Time device has been in use (secs) */
|
||||
__kernel_time_t recv_idle; /* Time since last char received (secs) */
|
||||
__kernel_time_t xmit_idle; /* Time since last char transmitted (secs) */
|
||||
__kernel_old_time_t in_use; /* Time device has been in use (secs) */
|
||||
__kernel_old_time_t recv_idle; /* Time since last char received (secs) */
|
||||
__kernel_old_time_t xmit_idle; /* Time since last char transmitted (secs) */
|
||||
unsigned long recv_bytes; /* Bytes received */
|
||||
unsigned long xmit_bytes; /* Bytes transmitted */
|
||||
unsigned long overruns; /* Input overruns */
|
||||
|
@ -53,10 +53,10 @@ struct elf_prstatus
|
||||
pid_t pr_ppid;
|
||||
pid_t pr_pgrp;
|
||||
pid_t pr_sid;
|
||||
struct timeval pr_utime; /* User time */
|
||||
struct timeval pr_stime; /* System time */
|
||||
struct timeval pr_cutime; /* Cumulative user time */
|
||||
struct timeval pr_cstime; /* Cumulative system time */
|
||||
struct __kernel_old_timeval pr_utime; /* User time */
|
||||
struct __kernel_old_timeval pr_stime; /* System time */
|
||||
struct __kernel_old_timeval pr_cutime; /* Cumulative user time */
|
||||
struct __kernel_old_timeval pr_cstime; /* Cumulative system time */
|
||||
#if 0
|
||||
long pr_instr; /* Current instruction */
|
||||
#endif
|
||||
|
@ -37,9 +37,16 @@ struct sock_extended_err {
|
||||
* The timestamping interfaces SO_TIMESTAMPING, MSG_TSTAMP_*
|
||||
* communicate network timestamps by passing this struct in a cmsg with
|
||||
* recvmsg(). See Documentation/networking/timestamping.txt for details.
|
||||
* User space sees a timespec definition that matches either
|
||||
* __kernel_timespec or __kernel_old_timespec, in the kernel we
|
||||
* require two structure definitions to provide both.
|
||||
*/
|
||||
struct scm_timestamping {
|
||||
#ifdef __KERNEL__
|
||||
struct __kernel_old_timespec ts[3];
|
||||
#else
|
||||
struct timespec ts[3];
|
||||
#endif
|
||||
};
|
||||
|
||||
struct scm_timestamping64 {
|
||||
|
@ -19,9 +19,9 @@ struct msqid_ds {
|
||||
struct ipc_perm msg_perm;
|
||||
struct msg *msg_first; /* first message on queue,unused */
|
||||
struct msg *msg_last; /* last message in queue,unused */
|
||||
__kernel_time_t msg_stime; /* last msgsnd time */
|
||||
__kernel_time_t msg_rtime; /* last msgrcv time */
|
||||
__kernel_time_t msg_ctime; /* last change time */
|
||||
__kernel_old_time_t msg_stime; /* last msgsnd time */
|
||||
__kernel_old_time_t msg_rtime; /* last msgrcv time */
|
||||
__kernel_old_time_t msg_ctime; /* last change time */
|
||||
unsigned long msg_lcbytes; /* Reuse junk fields for 32 bit */
|
||||
unsigned long msg_lqbytes; /* ditto */
|
||||
unsigned short msg_cbytes; /* current number of bytes on queue */
|
||||
|
@ -148,8 +148,8 @@ struct ppp_comp_stats {
|
||||
* based on the libc time_t.
|
||||
*/
|
||||
struct ppp_idle {
|
||||
__kernel_time_t xmit_idle; /* time since last NP packet sent */
|
||||
__kernel_time_t recv_idle; /* time since last NP packet received */
|
||||
__kernel_old_time_t xmit_idle; /* time since last NP packet sent */
|
||||
__kernel_old_time_t recv_idle; /* time since last NP packet received */
|
||||
};
|
||||
|
||||
struct ppp_idle32 {
|
||||
|
@ -22,8 +22,8 @@
|
||||
#define RUSAGE_THREAD 1 /* only the calling thread */
|
||||
|
||||
struct rusage {
|
||||
struct timeval ru_utime; /* user time used */
|
||||
struct timeval ru_stime; /* system time used */
|
||||
struct __kernel_old_timeval ru_utime; /* user time used */
|
||||
struct __kernel_old_timeval ru_stime; /* system time used */
|
||||
__kernel_long_t ru_maxrss; /* maximum resident set size */
|
||||
__kernel_long_t ru_ixrss; /* integral shared memory size */
|
||||
__kernel_long_t ru_idrss; /* integral unshared data size */
|
||||
|
@ -24,8 +24,8 @@
|
||||
/* Obsolete, used only for backwards compatibility and libc5 compiles */
|
||||
struct semid_ds {
|
||||
struct ipc_perm sem_perm; /* permissions .. see ipc.h */
|
||||
__kernel_time_t sem_otime; /* last semop time */
|
||||
__kernel_time_t sem_ctime; /* create/last semctl() time */
|
||||
__kernel_old_time_t sem_otime; /* last semop time */
|
||||
__kernel_old_time_t sem_ctime; /* create/last semctl() time */
|
||||
struct sem *sem_base; /* ptr to first semaphore in array */
|
||||
struct sem_queue *sem_pending; /* pending operations to be processed */
|
||||
struct sem_queue **sem_pending_last; /* last pending operation */
|
||||
|
@ -28,9 +28,9 @@
|
||||
struct shmid_ds {
|
||||
struct ipc_perm shm_perm; /* operation perms */
|
||||
int shm_segsz; /* size of segment (bytes) */
|
||||
__kernel_time_t shm_atime; /* last attach time */
|
||||
__kernel_time_t shm_dtime; /* last detach time */
|
||||
__kernel_time_t shm_ctime; /* last change time */
|
||||
__kernel_old_time_t shm_atime; /* last attach time */
|
||||
__kernel_old_time_t shm_dtime; /* last detach time */
|
||||
__kernel_old_time_t shm_ctime; /* last change time */
|
||||
__kernel_ipc_pid_t shm_cpid; /* pid of creator */
|
||||
__kernel_ipc_pid_t shm_lpid; /* pid of last operator */
|
||||
unsigned short shm_nattch; /* no. of current attaches */
|
||||
|
@ -8,13 +8,13 @@
|
||||
#ifndef _STRUCT_TIMESPEC
|
||||
#define _STRUCT_TIMESPEC
|
||||
struct timespec {
|
||||
__kernel_time_t tv_sec; /* seconds */
|
||||
long tv_nsec; /* nanoseconds */
|
||||
__kernel_old_time_t tv_sec; /* seconds */
|
||||
long tv_nsec; /* nanoseconds */
|
||||
};
|
||||
#endif
|
||||
|
||||
struct timeval {
|
||||
__kernel_time_t tv_sec; /* seconds */
|
||||
__kernel_old_time_t tv_sec; /* seconds */
|
||||
__kernel_suseconds_t tv_usec; /* microseconds */
|
||||
};
|
||||
|
||||
|
@ -28,6 +28,11 @@ struct __kernel_old_timeval {
|
||||
};
|
||||
#endif
|
||||
|
||||
struct __kernel_old_timespec {
|
||||
__kernel_old_time_t tv_sec; /* seconds */
|
||||
long tv_nsec; /* nanoseconds */
|
||||
};
|
||||
|
||||
struct __kernel_sock_timeval {
|
||||
__s64 tv_sec;
|
||||
__s64 tv_usec;
|
||||
|
@ -5,8 +5,8 @@
|
||||
#include <linux/types.h>
|
||||
|
||||
struct utimbuf {
|
||||
__kernel_time_t actime;
|
||||
__kernel_time_t modtime;
|
||||
__kernel_old_time_t actime;
|
||||
__kernel_old_time_t modtime;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -30,7 +30,7 @@ int ksys_ipc(unsigned int call, int first, unsigned long second,
|
||||
return ksys_semtimedop(first, (struct sembuf __user *)ptr,
|
||||
second, NULL);
|
||||
case SEMTIMEDOP:
|
||||
if (IS_ENABLED(CONFIG_64BIT) || !IS_ENABLED(CONFIG_64BIT_TIME))
|
||||
if (IS_ENABLED(CONFIG_64BIT))
|
||||
return ksys_semtimedop(first, ptr, second,
|
||||
(const struct __kernel_timespec __user *)fifth);
|
||||
else if (IS_ENABLED(CONFIG_COMPAT_32BIT_TIME))
|
||||
|
@ -90,30 +90,6 @@ int compat_put_timespec(const struct timespec *ts, void __user *uts)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(compat_put_timespec);
|
||||
|
||||
int get_compat_itimerval(struct itimerval *o, const struct compat_itimerval __user *i)
|
||||
{
|
||||
struct compat_itimerval v32;
|
||||
|
||||
if (copy_from_user(&v32, i, sizeof(struct compat_itimerval)))
|
||||
return -EFAULT;
|
||||
o->it_interval.tv_sec = v32.it_interval.tv_sec;
|
||||
o->it_interval.tv_usec = v32.it_interval.tv_usec;
|
||||
o->it_value.tv_sec = v32.it_value.tv_sec;
|
||||
o->it_value.tv_usec = v32.it_value.tv_usec;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int put_compat_itimerval(struct compat_itimerval __user *o, const struct itimerval *i)
|
||||
{
|
||||
struct compat_itimerval v32;
|
||||
|
||||
v32.it_interval.tv_sec = i->it_interval.tv_sec;
|
||||
v32.it_interval.tv_usec = i->it_interval.tv_usec;
|
||||
v32.it_value.tv_sec = i->it_value.tv_sec;
|
||||
v32.it_value.tv_usec = i->it_value.tv_usec;
|
||||
return copy_to_user(o, &v32, sizeof(struct compat_itimerval)) ? -EFAULT : 0;
|
||||
}
|
||||
|
||||
#ifdef __ARCH_WANT_SYS_SIGPROCMASK
|
||||
|
||||
/*
|
||||
|
@ -179,7 +179,7 @@ extern void swsusp_close(fmode_t);
|
||||
extern int swsusp_unmark(void);
|
||||
#endif
|
||||
|
||||
struct timeval;
|
||||
struct __kernel_old_timeval;
|
||||
/* kernel/power/swsusp.c */
|
||||
extern void swsusp_show_speed(ktime_t, ktime_t, unsigned int, char *);
|
||||
|
||||
|
@ -1763,8 +1763,8 @@ void getrusage(struct task_struct *p, int who, struct rusage *r)
|
||||
unlock_task_sighand(p, &flags);
|
||||
|
||||
out:
|
||||
r->ru_utime = ns_to_timeval(utime);
|
||||
r->ru_stime = ns_to_timeval(stime);
|
||||
r->ru_utime = ns_to_kernel_old_timeval(utime);
|
||||
r->ru_stime = ns_to_kernel_old_timeval(stime);
|
||||
|
||||
if (who != RUSAGE_CHILDREN) {
|
||||
struct mm_struct *mm = get_task_mm(p);
|
||||
|
@ -410,6 +410,29 @@ COND_SYSCALL(send);
|
||||
COND_SYSCALL(bdflush);
|
||||
COND_SYSCALL(uselib);
|
||||
|
||||
/* optional: time32 */
|
||||
COND_SYSCALL(time32);
|
||||
COND_SYSCALL(stime32);
|
||||
COND_SYSCALL(utime32);
|
||||
COND_SYSCALL(adjtimex_time32);
|
||||
COND_SYSCALL(sched_rr_get_interval_time32);
|
||||
COND_SYSCALL(nanosleep_time32);
|
||||
COND_SYSCALL(rt_sigtimedwait_time32);
|
||||
COND_SYSCALL_COMPAT(rt_sigtimedwait_time32);
|
||||
COND_SYSCALL(timer_settime32);
|
||||
COND_SYSCALL(timer_gettime32);
|
||||
COND_SYSCALL(clock_settime32);
|
||||
COND_SYSCALL(clock_gettime32);
|
||||
COND_SYSCALL(clock_getres_time32);
|
||||
COND_SYSCALL(clock_nanosleep_time32);
|
||||
COND_SYSCALL(utimes_time32);
|
||||
COND_SYSCALL(futimesat_time32);
|
||||
COND_SYSCALL(pselect6_time32);
|
||||
COND_SYSCALL_COMPAT(pselect6_time32);
|
||||
COND_SYSCALL(ppoll_time32);
|
||||
COND_SYSCALL_COMPAT(ppoll_time32);
|
||||
COND_SYSCALL(utimensat_time32);
|
||||
COND_SYSCALL(clock_adjtime32);
|
||||
|
||||
/*
|
||||
* The syscalls below are not found in include/uapi/asm-generic/unistd.h
|
||||
|
@ -1940,7 +1940,7 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if !defined(CONFIG_64BIT_TIME) || defined(CONFIG_64BIT)
|
||||
#ifdef CONFIG_64BIT
|
||||
|
||||
SYSCALL_DEFINE2(nanosleep, struct __kernel_timespec __user *, rqtp,
|
||||
struct __kernel_timespec __user *, rmtp)
|
||||
|
@ -26,7 +26,7 @@
|
||||
* Returns the delta between the expiry time and now, which can be
|
||||
* less than zero or 1usec for an pending expired timer
|
||||
*/
|
||||
static struct timeval itimer_get_remtime(struct hrtimer *timer)
|
||||
static struct timespec64 itimer_get_remtime(struct hrtimer *timer)
|
||||
{
|
||||
ktime_t rem = __hrtimer_get_remaining(timer, true);
|
||||
|
||||
@ -41,11 +41,11 @@ static struct timeval itimer_get_remtime(struct hrtimer *timer)
|
||||
} else
|
||||
rem = 0;
|
||||
|
||||
return ktime_to_timeval(rem);
|
||||
return ktime_to_timespec64(rem);
|
||||
}
|
||||
|
||||
static void get_cpu_itimer(struct task_struct *tsk, unsigned int clock_id,
|
||||
struct itimerval *const value)
|
||||
struct itimerspec64 *const value)
|
||||
{
|
||||
u64 val, interval;
|
||||
struct cpu_itimer *it = &tsk->signal->it[clock_id];
|
||||
@ -69,11 +69,11 @@ static void get_cpu_itimer(struct task_struct *tsk, unsigned int clock_id,
|
||||
|
||||
spin_unlock_irq(&tsk->sighand->siglock);
|
||||
|
||||
value->it_value = ns_to_timeval(val);
|
||||
value->it_interval = ns_to_timeval(interval);
|
||||
value->it_value = ns_to_timespec64(val);
|
||||
value->it_interval = ns_to_timespec64(interval);
|
||||
}
|
||||
|
||||
int do_getitimer(int which, struct itimerval *value)
|
||||
static int do_getitimer(int which, struct itimerspec64 *value)
|
||||
{
|
||||
struct task_struct *tsk = current;
|
||||
|
||||
@ -82,7 +82,7 @@ int do_getitimer(int which, struct itimerval *value)
|
||||
spin_lock_irq(&tsk->sighand->siglock);
|
||||
value->it_value = itimer_get_remtime(&tsk->signal->real_timer);
|
||||
value->it_interval =
|
||||
ktime_to_timeval(tsk->signal->it_real_incr);
|
||||
ktime_to_timespec64(tsk->signal->it_real_incr);
|
||||
spin_unlock_irq(&tsk->sighand->siglock);
|
||||
break;
|
||||
case ITIMER_VIRTUAL:
|
||||
@ -97,34 +97,59 @@ int do_getitimer(int which, struct itimerval *value)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int put_itimerval(struct itimerval __user *o,
|
||||
const struct itimerspec64 *i)
|
||||
{
|
||||
struct itimerval v;
|
||||
|
||||
v.it_interval.tv_sec = i->it_interval.tv_sec;
|
||||
v.it_interval.tv_usec = i->it_interval.tv_nsec / NSEC_PER_USEC;
|
||||
v.it_value.tv_sec = i->it_value.tv_sec;
|
||||
v.it_value.tv_usec = i->it_value.tv_nsec / NSEC_PER_USEC;
|
||||
return copy_to_user(o, &v, sizeof(struct itimerval)) ? -EFAULT : 0;
|
||||
}
|
||||
|
||||
|
||||
SYSCALL_DEFINE2(getitimer, int, which, struct itimerval __user *, value)
|
||||
{
|
||||
int error = -EFAULT;
|
||||
struct itimerval get_buffer;
|
||||
struct itimerspec64 get_buffer;
|
||||
int error = do_getitimer(which, &get_buffer);
|
||||
|
||||
if (value) {
|
||||
error = do_getitimer(which, &get_buffer);
|
||||
if (!error &&
|
||||
copy_to_user(value, &get_buffer, sizeof(get_buffer)))
|
||||
error = -EFAULT;
|
||||
}
|
||||
if (!error && put_itimerval(value, &get_buffer))
|
||||
error = -EFAULT;
|
||||
return error;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
COMPAT_SYSCALL_DEFINE2(getitimer, int, which,
|
||||
struct compat_itimerval __user *, it)
|
||||
{
|
||||
struct itimerval kit;
|
||||
int error = do_getitimer(which, &kit);
|
||||
#if defined(CONFIG_COMPAT) || defined(CONFIG_ALPHA)
|
||||
struct old_itimerval32 {
|
||||
struct old_timeval32 it_interval;
|
||||
struct old_timeval32 it_value;
|
||||
};
|
||||
|
||||
if (!error && put_compat_itimerval(it, &kit))
|
||||
static int put_old_itimerval32(struct old_itimerval32 __user *o,
|
||||
const struct itimerspec64 *i)
|
||||
{
|
||||
struct old_itimerval32 v32;
|
||||
|
||||
v32.it_interval.tv_sec = i->it_interval.tv_sec;
|
||||
v32.it_interval.tv_usec = i->it_interval.tv_nsec / NSEC_PER_USEC;
|
||||
v32.it_value.tv_sec = i->it_value.tv_sec;
|
||||
v32.it_value.tv_usec = i->it_value.tv_nsec / NSEC_PER_USEC;
|
||||
return copy_to_user(o, &v32, sizeof(struct old_itimerval32)) ? -EFAULT : 0;
|
||||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE2(getitimer, int, which,
|
||||
struct old_itimerval32 __user *, value)
|
||||
{
|
||||
struct itimerspec64 get_buffer;
|
||||
int error = do_getitimer(which, &get_buffer);
|
||||
|
||||
if (!error && put_old_itimerval32(value, &get_buffer))
|
||||
error = -EFAULT;
|
||||
return error;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* The timer is automagically restarted, when interval != 0
|
||||
*/
|
||||
@ -141,8 +166,8 @@ enum hrtimer_restart it_real_fn(struct hrtimer *timer)
|
||||
}
|
||||
|
||||
static void set_cpu_itimer(struct task_struct *tsk, unsigned int clock_id,
|
||||
const struct itimerval *const value,
|
||||
struct itimerval *const ovalue)
|
||||
const struct itimerspec64 *const value,
|
||||
struct itimerspec64 *const ovalue)
|
||||
{
|
||||
u64 oval, nval, ointerval, ninterval;
|
||||
struct cpu_itimer *it = &tsk->signal->it[clock_id];
|
||||
@ -151,8 +176,8 @@ static void set_cpu_itimer(struct task_struct *tsk, unsigned int clock_id,
|
||||
* Use the to_ktime conversion because that clamps the maximum
|
||||
* value to KTIME_MAX and avoid multiplication overflows.
|
||||
*/
|
||||
nval = ktime_to_ns(timeval_to_ktime(value->it_value));
|
||||
ninterval = ktime_to_ns(timeval_to_ktime(value->it_interval));
|
||||
nval = timespec64_to_ns(&value->it_value);
|
||||
ninterval = timespec64_to_ns(&value->it_interval);
|
||||
|
||||
spin_lock_irq(&tsk->sighand->siglock);
|
||||
|
||||
@ -171,8 +196,8 @@ static void set_cpu_itimer(struct task_struct *tsk, unsigned int clock_id,
|
||||
spin_unlock_irq(&tsk->sighand->siglock);
|
||||
|
||||
if (ovalue) {
|
||||
ovalue->it_value = ns_to_timeval(oval);
|
||||
ovalue->it_interval = ns_to_timeval(ointerval);
|
||||
ovalue->it_value = ns_to_timespec64(oval);
|
||||
ovalue->it_interval = ns_to_timespec64(ointerval);
|
||||
}
|
||||
}
|
||||
|
||||
@ -182,19 +207,13 @@ static void set_cpu_itimer(struct task_struct *tsk, unsigned int clock_id,
|
||||
#define timeval_valid(t) \
|
||||
(((t)->tv_sec >= 0) && (((unsigned long) (t)->tv_usec) < USEC_PER_SEC))
|
||||
|
||||
int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue)
|
||||
static int do_setitimer(int which, struct itimerspec64 *value,
|
||||
struct itimerspec64 *ovalue)
|
||||
{
|
||||
struct task_struct *tsk = current;
|
||||
struct hrtimer *timer;
|
||||
ktime_t expires;
|
||||
|
||||
/*
|
||||
* Validate the timevals in value.
|
||||
*/
|
||||
if (!timeval_valid(&value->it_value) ||
|
||||
!timeval_valid(&value->it_interval))
|
||||
return -EINVAL;
|
||||
|
||||
switch (which) {
|
||||
case ITIMER_REAL:
|
||||
again:
|
||||
@ -203,7 +222,7 @@ again:
|
||||
if (ovalue) {
|
||||
ovalue->it_value = itimer_get_remtime(timer);
|
||||
ovalue->it_interval
|
||||
= ktime_to_timeval(tsk->signal->it_real_incr);
|
||||
= ktime_to_timespec64(tsk->signal->it_real_incr);
|
||||
}
|
||||
/* We are sharing ->siglock with it_real_fn() */
|
||||
if (hrtimer_try_to_cancel(timer) < 0) {
|
||||
@ -211,10 +230,10 @@ again:
|
||||
hrtimer_cancel_wait_running(timer);
|
||||
goto again;
|
||||
}
|
||||
expires = timeval_to_ktime(value->it_value);
|
||||
expires = timespec64_to_ktime(value->it_value);
|
||||
if (expires != 0) {
|
||||
tsk->signal->it_real_incr =
|
||||
timeval_to_ktime(value->it_interval);
|
||||
timespec64_to_ktime(value->it_interval);
|
||||
hrtimer_start(timer, expires, HRTIMER_MODE_REL);
|
||||
} else
|
||||
tsk->signal->it_real_incr = 0;
|
||||
@ -234,6 +253,17 @@ again:
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SECURITY_SELINUX
|
||||
void clear_itimer(void)
|
||||
{
|
||||
struct itimerspec64 v = {};
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
do_setitimer(i, &v, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __ARCH_WANT_SYS_ALARM
|
||||
|
||||
/**
|
||||
@ -250,15 +280,15 @@ again:
|
||||
*/
|
||||
static unsigned int alarm_setitimer(unsigned int seconds)
|
||||
{
|
||||
struct itimerval it_new, it_old;
|
||||
struct itimerspec64 it_new, it_old;
|
||||
|
||||
#if BITS_PER_LONG < 64
|
||||
if (seconds > INT_MAX)
|
||||
seconds = INT_MAX;
|
||||
#endif
|
||||
it_new.it_value.tv_sec = seconds;
|
||||
it_new.it_value.tv_usec = 0;
|
||||
it_new.it_interval.tv_sec = it_new.it_interval.tv_usec = 0;
|
||||
it_new.it_value.tv_nsec = 0;
|
||||
it_new.it_interval.tv_sec = it_new.it_interval.tv_nsec = 0;
|
||||
|
||||
do_setitimer(ITIMER_REAL, &it_new, &it_old);
|
||||
|
||||
@ -266,8 +296,8 @@ static unsigned int alarm_setitimer(unsigned int seconds)
|
||||
* We can't return 0 if we have an alarm pending ... And we'd
|
||||
* better return too much than too little anyway
|
||||
*/
|
||||
if ((!it_old.it_value.tv_sec && it_old.it_value.tv_usec) ||
|
||||
it_old.it_value.tv_usec >= 500000)
|
||||
if ((!it_old.it_value.tv_sec && it_old.it_value.tv_nsec) ||
|
||||
it_old.it_value.tv_nsec >= (NSEC_PER_SEC / 2))
|
||||
it_old.it_value.tv_sec++;
|
||||
|
||||
return it_old.it_value.tv_sec;
|
||||
@ -284,15 +314,35 @@ SYSCALL_DEFINE1(alarm, unsigned int, seconds)
|
||||
|
||||
#endif
|
||||
|
||||
static int get_itimerval(struct itimerspec64 *o, const struct itimerval __user *i)
|
||||
{
|
||||
struct itimerval v;
|
||||
|
||||
if (copy_from_user(&v, i, sizeof(struct itimerval)))
|
||||
return -EFAULT;
|
||||
|
||||
/* Validate the timevals in value. */
|
||||
if (!timeval_valid(&v.it_value) ||
|
||||
!timeval_valid(&v.it_interval))
|
||||
return -EINVAL;
|
||||
|
||||
o->it_interval.tv_sec = v.it_interval.tv_sec;
|
||||
o->it_interval.tv_nsec = v.it_interval.tv_usec * NSEC_PER_USEC;
|
||||
o->it_value.tv_sec = v.it_value.tv_sec;
|
||||
o->it_value.tv_nsec = v.it_value.tv_usec * NSEC_PER_USEC;
|
||||
return 0;
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE3(setitimer, int, which, struct itimerval __user *, value,
|
||||
struct itimerval __user *, ovalue)
|
||||
{
|
||||
struct itimerval set_buffer, get_buffer;
|
||||
struct itimerspec64 set_buffer, get_buffer;
|
||||
int error;
|
||||
|
||||
if (value) {
|
||||
if(copy_from_user(&set_buffer, value, sizeof(set_buffer)))
|
||||
return -EFAULT;
|
||||
error = get_itimerval(&set_buffer, value);
|
||||
if (error)
|
||||
return error;
|
||||
} else {
|
||||
memset(&set_buffer, 0, sizeof(set_buffer));
|
||||
printk_once(KERN_WARNING "%s calls setitimer() with new_value NULL pointer."
|
||||
@ -304,30 +354,53 @@ SYSCALL_DEFINE3(setitimer, int, which, struct itimerval __user *, value,
|
||||
if (error || !ovalue)
|
||||
return error;
|
||||
|
||||
if (copy_to_user(ovalue, &get_buffer, sizeof(get_buffer)))
|
||||
if (put_itimerval(ovalue, &get_buffer))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
COMPAT_SYSCALL_DEFINE3(setitimer, int, which,
|
||||
struct compat_itimerval __user *, in,
|
||||
struct compat_itimerval __user *, out)
|
||||
#if defined(CONFIG_COMPAT) || defined(CONFIG_ALPHA)
|
||||
static int get_old_itimerval32(struct itimerspec64 *o, const struct old_itimerval32 __user *i)
|
||||
{
|
||||
struct itimerval kin, kout;
|
||||
struct old_itimerval32 v32;
|
||||
|
||||
if (copy_from_user(&v32, i, sizeof(struct old_itimerval32)))
|
||||
return -EFAULT;
|
||||
|
||||
/* Validate the timevals in value. */
|
||||
if (!timeval_valid(&v32.it_value) ||
|
||||
!timeval_valid(&v32.it_interval))
|
||||
return -EINVAL;
|
||||
|
||||
o->it_interval.tv_sec = v32.it_interval.tv_sec;
|
||||
o->it_interval.tv_nsec = v32.it_interval.tv_usec * NSEC_PER_USEC;
|
||||
o->it_value.tv_sec = v32.it_value.tv_sec;
|
||||
o->it_value.tv_nsec = v32.it_value.tv_usec * NSEC_PER_USEC;
|
||||
return 0;
|
||||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE3(setitimer, int, which,
|
||||
struct old_itimerval32 __user *, value,
|
||||
struct old_itimerval32 __user *, ovalue)
|
||||
{
|
||||
struct itimerspec64 set_buffer, get_buffer;
|
||||
int error;
|
||||
|
||||
if (in) {
|
||||
if (get_compat_itimerval(&kin, in))
|
||||
return -EFAULT;
|
||||
if (value) {
|
||||
error = get_old_itimerval32(&set_buffer, value);
|
||||
if (error)
|
||||
return error;
|
||||
} else {
|
||||
memset(&kin, 0, sizeof(kin));
|
||||
memset(&set_buffer, 0, sizeof(set_buffer));
|
||||
printk_once(KERN_WARNING "%s calls setitimer() with new_value NULL pointer."
|
||||
" Misfeature support will be removed\n",
|
||||
current->comm);
|
||||
}
|
||||
|
||||
error = do_setitimer(which, &kin, out ? &kout : NULL);
|
||||
if (error || !out)
|
||||
error = do_setitimer(which, &set_buffer, ovalue ? &get_buffer : NULL);
|
||||
if (error || !ovalue)
|
||||
return error;
|
||||
if (put_compat_itimerval(out, &kout))
|
||||
if (put_old_itimerval32(ovalue, &get_buffer))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
@ -59,9 +59,9 @@ EXPORT_SYMBOL(sys_tz);
|
||||
* why not move it into the appropriate arch directory (for those
|
||||
* architectures that need it).
|
||||
*/
|
||||
SYSCALL_DEFINE1(time, time_t __user *, tloc)
|
||||
SYSCALL_DEFINE1(time, __kernel_old_time_t __user *, tloc)
|
||||
{
|
||||
time_t i = (time_t)ktime_get_real_seconds();
|
||||
__kernel_old_time_t i = (__kernel_old_time_t)ktime_get_real_seconds();
|
||||
|
||||
if (tloc) {
|
||||
if (put_user(i,tloc))
|
||||
@ -78,7 +78,7 @@ SYSCALL_DEFINE1(time, time_t __user *, tloc)
|
||||
* architectures that need it).
|
||||
*/
|
||||
|
||||
SYSCALL_DEFINE1(stime, time_t __user *, tptr)
|
||||
SYSCALL_DEFINE1(stime, __kernel_old_time_t __user *, tptr)
|
||||
{
|
||||
struct timespec64 tv;
|
||||
int err;
|
||||
@ -137,7 +137,7 @@ SYSCALL_DEFINE1(stime32, old_time32_t __user *, tptr)
|
||||
#endif /* __ARCH_WANT_SYS_TIME32 */
|
||||
#endif
|
||||
|
||||
SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv,
|
||||
SYSCALL_DEFINE2(gettimeofday, struct __kernel_old_timeval __user *, tv,
|
||||
struct timezone __user *, tz)
|
||||
{
|
||||
if (likely(tv != NULL)) {
|
||||
@ -196,22 +196,21 @@ int do_sys_settimeofday64(const struct timespec64 *tv, const struct timezone *tz
|
||||
return 0;
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv,
|
||||
SYSCALL_DEFINE2(settimeofday, struct __kernel_old_timeval __user *, tv,
|
||||
struct timezone __user *, tz)
|
||||
{
|
||||
struct timespec64 new_ts;
|
||||
struct timeval user_tv;
|
||||
struct timezone new_tz;
|
||||
|
||||
if (tv) {
|
||||
if (copy_from_user(&user_tv, tv, sizeof(*tv)))
|
||||
if (get_user(new_ts.tv_sec, &tv->tv_sec) ||
|
||||
get_user(new_ts.tv_nsec, &tv->tv_usec))
|
||||
return -EFAULT;
|
||||
|
||||
if (!timeval_valid(&user_tv))
|
||||
if (new_ts.tv_nsec > USEC_PER_SEC || new_ts.tv_nsec < 0)
|
||||
return -EINVAL;
|
||||
|
||||
new_ts.tv_sec = user_tv.tv_sec;
|
||||
new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC;
|
||||
new_ts.tv_nsec *= NSEC_PER_USEC;
|
||||
}
|
||||
if (tz) {
|
||||
if (copy_from_user(&new_tz, tz, sizeof(*tz)))
|
||||
@ -245,18 +244,17 @@ COMPAT_SYSCALL_DEFINE2(settimeofday, struct old_timeval32 __user *, tv,
|
||||
struct timezone __user *, tz)
|
||||
{
|
||||
struct timespec64 new_ts;
|
||||
struct timeval user_tv;
|
||||
struct timezone new_tz;
|
||||
|
||||
if (tv) {
|
||||
if (compat_get_timeval(&user_tv, tv))
|
||||
if (get_user(new_ts.tv_sec, &tv->tv_sec) ||
|
||||
get_user(new_ts.tv_nsec, &tv->tv_usec))
|
||||
return -EFAULT;
|
||||
|
||||
if (!timeval_valid(&user_tv))
|
||||
if (new_ts.tv_nsec > USEC_PER_SEC || new_ts.tv_nsec < 0)
|
||||
return -EINVAL;
|
||||
|
||||
new_ts.tv_sec = user_tv.tv_sec;
|
||||
new_ts.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC;
|
||||
new_ts.tv_nsec *= NSEC_PER_USEC;
|
||||
}
|
||||
if (tz) {
|
||||
if (copy_from_user(&new_tz, tz, sizeof(*tz)))
|
||||
@ -267,7 +265,7 @@ COMPAT_SYSCALL_DEFINE2(settimeofday, struct old_timeval32 __user *, tv,
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_64BIT_TIME) || defined(CONFIG_64BIT)
|
||||
#ifdef CONFIG_64BIT
|
||||
SYSCALL_DEFINE1(adjtimex, struct __kernel_timex __user *, txc_p)
|
||||
{
|
||||
struct __kernel_timex txc; /* Local copy of parameter */
|
||||
@ -881,7 +879,7 @@ int get_timespec64(struct timespec64 *ts,
|
||||
ts->tv_sec = kts.tv_sec;
|
||||
|
||||
/* Zero out the padding for 32 bit systems or in compat mode */
|
||||
if (IS_ENABLED(CONFIG_64BIT_TIME) && in_compat_syscall())
|
||||
if (in_compat_syscall())
|
||||
kts.tv_nsec &= 0xFFFFFFFFUL;
|
||||
|
||||
ts->tv_nsec = kts.tv_nsec;
|
||||
|
@ -164,10 +164,10 @@ __cvdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
|
||||
}
|
||||
|
||||
#ifdef VDSO_HAS_TIME
|
||||
static __maybe_unused time_t __cvdso_time(time_t *time)
|
||||
static __maybe_unused __kernel_old_time_t __cvdso_time(__kernel_old_time_t *time)
|
||||
{
|
||||
const struct vdso_data *vd = __arch_get_vdso_data();
|
||||
time_t t = READ_ONCE(vd[CS_HRES_COARSE].basetime[CLOCK_REALTIME].sec);
|
||||
__kernel_old_time_t t = READ_ONCE(vd[CS_HRES_COARSE].basetime[CLOCK_REALTIME].sec);
|
||||
|
||||
if (time)
|
||||
*time = t;
|
||||
|
@ -232,7 +232,7 @@ int put_cmsg_compat(struct msghdr *kmsg, int level, int type, int len, void *dat
|
||||
(type == SO_TIMESTAMPNS_OLD || type == SO_TIMESTAMPING_OLD)) {
|
||||
int count = type == SO_TIMESTAMPNS_OLD ? 1 : 3;
|
||||
int i;
|
||||
struct timespec *ts = (struct timespec *)data;
|
||||
struct __kernel_old_timespec *ts = data;
|
||||
for (i = 0; i < count; i++) {
|
||||
cts[i].tv_sec = ts[i].tv_sec;
|
||||
cts[i].tv_nsec = ts[i].tv_nsec;
|
||||
|
@ -268,8 +268,10 @@ void put_cmsg_scm_timestamping(struct msghdr *msg, struct scm_timestamping_inter
|
||||
struct scm_timestamping tss;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(tss.ts); i++)
|
||||
tss.ts[i] = timespec64_to_timespec(tss_internal->ts[i]);
|
||||
for (i = 0; i < ARRAY_SIZE(tss.ts); i++) {
|
||||
tss.ts[i].tv_sec = tss_internal->ts[i].tv_sec;
|
||||
tss.ts[i].tv_nsec = tss_internal->ts[i].tv_nsec;
|
||||
}
|
||||
|
||||
put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMPING_OLD, sizeof(tss), &tss);
|
||||
}
|
||||
|
@ -1864,29 +1864,33 @@ static void tcp_recv_timestamp(struct msghdr *msg, const struct sock *sk,
|
||||
if (sock_flag(sk, SOCK_RCVTSTAMP)) {
|
||||
if (sock_flag(sk, SOCK_RCVTSTAMPNS)) {
|
||||
if (new_tstamp) {
|
||||
struct __kernel_timespec kts = {tss->ts[0].tv_sec, tss->ts[0].tv_nsec};
|
||||
|
||||
struct __kernel_timespec kts = {
|
||||
.tv_sec = tss->ts[0].tv_sec,
|
||||
.tv_nsec = tss->ts[0].tv_nsec,
|
||||
};
|
||||
put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMPNS_NEW,
|
||||
sizeof(kts), &kts);
|
||||
} else {
|
||||
struct timespec ts_old = timespec64_to_timespec(tss->ts[0]);
|
||||
|
||||
struct __kernel_old_timespec ts_old = {
|
||||
.tv_sec = tss->ts[0].tv_sec,
|
||||
.tv_nsec = tss->ts[0].tv_nsec,
|
||||
};
|
||||
put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMPNS_OLD,
|
||||
sizeof(ts_old), &ts_old);
|
||||
}
|
||||
} else {
|
||||
if (new_tstamp) {
|
||||
struct __kernel_sock_timeval stv;
|
||||
|
||||
stv.tv_sec = tss->ts[0].tv_sec;
|
||||
stv.tv_usec = tss->ts[0].tv_nsec / 1000;
|
||||
struct __kernel_sock_timeval stv = {
|
||||
.tv_sec = tss->ts[0].tv_sec,
|
||||
.tv_usec = tss->ts[0].tv_nsec / 1000,
|
||||
};
|
||||
put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMP_NEW,
|
||||
sizeof(stv), &stv);
|
||||
} else {
|
||||
struct __kernel_old_timeval tv;
|
||||
|
||||
tv.tv_sec = tss->ts[0].tv_sec;
|
||||
tv.tv_usec = tss->ts[0].tv_nsec / 1000;
|
||||
struct __kernel_old_timeval tv = {
|
||||
.tv_sec = tss->ts[0].tv_sec,
|
||||
.tv_usec = tss->ts[0].tv_nsec / 1000,
|
||||
};
|
||||
put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMP_OLD,
|
||||
sizeof(tv), &tv);
|
||||
}
|
||||
|
@ -795,7 +795,7 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
|
||||
put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMPNS_NEW,
|
||||
sizeof(ts), &ts);
|
||||
} else {
|
||||
struct timespec ts;
|
||||
struct __kernel_old_timespec ts;
|
||||
|
||||
skb_get_timestampns(skb, &ts);
|
||||
put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMPNS_OLD,
|
||||
@ -2946,7 +2946,7 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args)
|
||||
a[2], true);
|
||||
break;
|
||||
case SYS_RECVMMSG:
|
||||
if (IS_ENABLED(CONFIG_64BIT) || !IS_ENABLED(CONFIG_64BIT_TIME))
|
||||
if (IS_ENABLED(CONFIG_64BIT))
|
||||
err = __sys_recvmmsg(a0, (struct mmsghdr __user *)a1,
|
||||
a[2], a[3],
|
||||
(struct __kernel_timespec __user *)a[4],
|
||||
|
@ -2549,9 +2549,8 @@ static void selinux_bprm_committing_creds(struct linux_binprm *bprm)
|
||||
static void selinux_bprm_committed_creds(struct linux_binprm *bprm)
|
||||
{
|
||||
const struct task_security_struct *tsec = selinux_cred(current_cred());
|
||||
struct itimerval itimer;
|
||||
u32 osid, sid;
|
||||
int rc, i;
|
||||
int rc;
|
||||
|
||||
osid = tsec->osid;
|
||||
sid = tsec->sid;
|
||||
@ -2569,11 +2568,8 @@ static void selinux_bprm_committed_creds(struct linux_binprm *bprm)
|
||||
rc = avc_has_perm(&selinux_state,
|
||||
osid, sid, SECCLASS_PROCESS, PROCESS__SIGINH, NULL);
|
||||
if (rc) {
|
||||
if (IS_ENABLED(CONFIG_POSIX_TIMERS)) {
|
||||
memset(&itimer, 0, sizeof itimer);
|
||||
for (i = 0; i < 3; i++)
|
||||
do_setitimer(i, &itimer, NULL);
|
||||
}
|
||||
clear_itimer();
|
||||
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
if (!fatal_signal_pending(current)) {
|
||||
flush_sigqueue(¤t->pending);
|
||||
|
Loading…
Reference in New Issue
Block a user