Message ID | 20200303175355.15770-5-alistair.francis@wdc.com |
---|---|
State | New, archived |
Headers | show |
On 03/03/2020 14:53, Alistair Francis wrote: > On y2038 safe 32-bit systems the Linux kernel expects itimerval > and rusage to use a 32-bit time_t, even though the other time_t's > are 64-bit. I think it worth to mention kernel does not intend to implement it and that timer_create should be used instead. > > There are also other occurances where the time passed to the kernel via I think it is spelled 'occurrences'. > timeval doesn't match the wordsize. > > To handle these cases let's define a new macro > __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64. This macro specifies if the > kernel's old_timeval matches the new timeval64. This should be true for > 64-bit architectures (expect for Alpha) and x32. I think you meant except. But you are making some confusion here with both alpha and x32: both itimerval are use 64-bit time_t. The issue for alpha is that what is different is old osf syscalls uses 32-bit time_t and they are provided only as compat symbols. > > Reviewed-by: Lukasz Majewski <lukma@denx.de>> --- > bits/typesizes.h | 6 ++++++ > sysdeps/unix/sysv/linux/alpha/bits/typesizes.h | 3 +++ > sysdeps/unix/sysv/linux/generic/bits/typesizes.h | 6 ++++++ > sysdeps/unix/sysv/linux/s390/bits/typesizes.h | 6 ++++++ > sysdeps/unix/sysv/linux/sparc/bits/typesizes.h | 6 ++++++ > sysdeps/unix/sysv/linux/x86/bits/typesizes.h | 3 +++ > 6 files changed, 30 insertions(+) > > diff --git a/bits/typesizes.h b/bits/typesizes.h > index 599408973e..8f16903a21 100644 > --- a/bits/typesizes.h > +++ b/bits/typesizes.h > @@ -76,10 +76,16 @@ > > /* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */ > # define __STATFS_MATCHES_STATFS64 1 > + > +/* And for getitimer, setitimer and rusage */ > +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 1 > #else > # define __RLIM_T_MATCHES_RLIM64_T 0 > > # define __STATFS_MATCHES_STATFS64 0 > + > +/* And for getitimer, setitimer and rusage */ > +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 0 > #endif > > /* Number of descriptors that can fit in an `fd_set'. */ Ok. > diff --git a/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h b/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h > index 28ee3e5920..e5d7774468 100644 > --- a/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h > +++ b/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h > @@ -73,6 +73,9 @@ > /* Not for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */ > # define __STATFS_MATCHES_STATFS64 0 > > +/* And for getitimer, setitimer and rusage */ > +#define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 0 > + > /* Number of descriptors that can fit in an `fd_set'. */ > #define __FD_SETSIZE 1024 > I think this is wrong, alpha does have a itimerval with 64-bit time_t. > diff --git a/sysdeps/unix/sysv/linux/generic/bits/typesizes.h b/sysdeps/unix/sysv/linux/generic/bits/typesizes.h > index 7c963e523e..4fb246ac74 100644 > --- a/sysdeps/unix/sysv/linux/generic/bits/typesizes.h > +++ b/sysdeps/unix/sysv/linux/generic/bits/typesizes.h > @@ -77,11 +77,17 @@ > > /* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */ > # define __STATFS_MATCHES_STATFS64 1 > + > +/* And for getitimer, setitimer and rusage */ > +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 1 > #else > # define __RLIM_T_MATCHES_RLIM64_T 0 > > # define __STATFS_MATCHES_STATFS64 0 > + > +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 0 > #endif > + > /* Number of descriptors that can fit in an `fd_set'. */ > #define __FD_SETSIZE 1024 > Ok. > diff --git a/sysdeps/unix/sysv/linux/s390/bits/typesizes.h b/sysdeps/unix/sysv/linux/s390/bits/typesizes.h > index e775e460bb..2bc87c1079 100644 > --- a/sysdeps/unix/sysv/linux/s390/bits/typesizes.h > +++ b/sysdeps/unix/sysv/linux/s390/bits/typesizes.h > @@ -82,10 +82,16 @@ > > /* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */ > # define __STATFS_MATCHES_STATFS64 1 > + > +/* And for getitimer, setitimer and rusage */ > +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 1 > #else > # define __RLIM_T_MATCHES_RLIM64_T 0 > > # define __STATFS_MATCHES_STATFS64 0 > + > +/* And for getitimer, setitimer and rusage */ > +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 0 > #endif > > /* Number of descriptors that can fit in an `fd_set'. */ Ok. > diff --git a/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h b/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h > index ac48c23e37..288a902b5f 100644 > --- a/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h > +++ b/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h > @@ -76,10 +76,16 @@ > > /* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */ > # define __STATFS_MATCHES_STATFS64 1 > + > +/* And for getitimer, setitimer and rusage */ > +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 1 > #else > # define __RLIM_T_MATCHES_RLIM64_T 0 > > # define __STATFS_MATCHES_STATFS64 0 > + > +/* And for getitimer, setitimer and rusage */ > +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 0 > #endif > > /* Number of descriptors that can fit in an `fd_set'. */ Ok. > diff --git a/sysdeps/unix/sysv/linux/x86/bits/typesizes.h b/sysdeps/unix/sysv/linux/x86/bits/typesizes.h > index 87c50a4f32..f68dfecc90 100644 > --- a/sysdeps/unix/sysv/linux/x86/bits/typesizes.h > +++ b/sysdeps/unix/sysv/linux/x86/bits/typesizes.h > @@ -94,6 +94,9 @@ > # define __STATFS_MATCHES_STATFS64 0 > #endif > > +/* And for getitimer, setitimer and rusage */ > +#define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 1 > + > /* Number of descriptors that can fit in an `fd_set'. */ > #define __FD_SETSIZE 1024 > > This is wrong for i686.
On Fri, Mar 27, 2020 at 10:58 AM Adhemerval Zanella via Libc-alpha <libc-alpha@sourceware.org> wrote: > > > > On 03/03/2020 14:53, Alistair Francis wrote: > > On y2038 safe 32-bit systems the Linux kernel expects itimerval > > and rusage to use a 32-bit time_t, even though the other time_t's > > are 64-bit. > > I think it worth to mention kernel does not intend to implement > it and that timer_create should be used instead. I haved added a sentence here. > > > > > There are also other occurances where the time passed to the kernel via > > I think it is spelled 'occurrences'. Fixed > > > timeval doesn't match the wordsize. > > > > To handle these cases let's define a new macro > > __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64. This macro specifies if the > > kernel's old_timeval matches the new timeval64. This should be true for > > 64-bit architectures (expect for Alpha) and x32. > > I think you meant except. But you are making some confusion here > with both alpha and x32: both itimerval are use 64-bit time_t. > The issue for alpha is that what is different is old osf syscalls > uses 32-bit time_t and they are provided only as compat symbols. I have fixed some mistakes here. > > > > > Reviewed-by: Lukasz Majewski <lukma@denx.de>> --- > > bits/typesizes.h | 6 ++++++ > > sysdeps/unix/sysv/linux/alpha/bits/typesizes.h | 3 +++ > > sysdeps/unix/sysv/linux/generic/bits/typesizes.h | 6 ++++++ > > sysdeps/unix/sysv/linux/s390/bits/typesizes.h | 6 ++++++ > > sysdeps/unix/sysv/linux/sparc/bits/typesizes.h | 6 ++++++ > > sysdeps/unix/sysv/linux/x86/bits/typesizes.h | 3 +++ > > 6 files changed, 30 insertions(+) > > > > diff --git a/bits/typesizes.h b/bits/typesizes.h > > index 599408973e..8f16903a21 100644 > > --- a/bits/typesizes.h > > +++ b/bits/typesizes.h > > @@ -76,10 +76,16 @@ > > > > /* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */ > > # define __STATFS_MATCHES_STATFS64 1 > > + > > +/* And for getitimer, setitimer and rusage */ > > +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 1 > > #else > > # define __RLIM_T_MATCHES_RLIM64_T 0 > > > > # define __STATFS_MATCHES_STATFS64 0 > > + > > +/* And for getitimer, setitimer and rusage */ > > +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 0 > > #endif > > > > /* Number of descriptors that can fit in an `fd_set'. */ > > Ok. > > > diff --git a/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h b/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h > > index 28ee3e5920..e5d7774468 100644 > > --- a/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h > > +++ b/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h > > @@ -73,6 +73,9 @@ > > /* Not for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */ > > # define __STATFS_MATCHES_STATFS64 0 > > > > +/* And for getitimer, setitimer and rusage */ > > +#define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 0 > > + > > /* Number of descriptors that can fit in an `fd_set'. */ > > #define __FD_SETSIZE 1024 > > > > I think this is wrong, alpha does have a itimerval with 64-bit > time_t. Ok, I have fixed this. > > > diff --git a/sysdeps/unix/sysv/linux/generic/bits/typesizes.h b/sysdeps/unix/sysv/linux/generic/bits/typesizes.h > > index 7c963e523e..4fb246ac74 100644 > > --- a/sysdeps/unix/sysv/linux/generic/bits/typesizes.h > > +++ b/sysdeps/unix/sysv/linux/generic/bits/typesizes.h > > @@ -77,11 +77,17 @@ > > > > /* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */ > > # define __STATFS_MATCHES_STATFS64 1 > > + > > +/* And for getitimer, setitimer and rusage */ > > +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 1 > > #else > > # define __RLIM_T_MATCHES_RLIM64_T 0 > > > > # define __STATFS_MATCHES_STATFS64 0 > > + > > +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 0 > > #endif > > + > > /* Number of descriptors that can fit in an `fd_set'. */ > > #define __FD_SETSIZE 1024 > > > > Ok. > > > diff --git a/sysdeps/unix/sysv/linux/s390/bits/typesizes.h b/sysdeps/unix/sysv/linux/s390/bits/typesizes.h > > index e775e460bb..2bc87c1079 100644 > > --- a/sysdeps/unix/sysv/linux/s390/bits/typesizes.h > > +++ b/sysdeps/unix/sysv/linux/s390/bits/typesizes.h > > @@ -82,10 +82,16 @@ > > > > /* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */ > > # define __STATFS_MATCHES_STATFS64 1 > > + > > +/* And for getitimer, setitimer and rusage */ > > +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 1 > > #else > > # define __RLIM_T_MATCHES_RLIM64_T 0 > > > > # define __STATFS_MATCHES_STATFS64 0 > > + > > +/* And for getitimer, setitimer and rusage */ > > +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 0 > > #endif > > > > /* Number of descriptors that can fit in an `fd_set'. */ > > Ok. > > > diff --git a/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h b/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h > > index ac48c23e37..288a902b5f 100644 > > --- a/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h > > +++ b/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h > > @@ -76,10 +76,16 @@ > > > > /* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */ > > # define __STATFS_MATCHES_STATFS64 1 > > + > > +/* And for getitimer, setitimer and rusage */ > > +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 1 > > #else > > # define __RLIM_T_MATCHES_RLIM64_T 0 > > > > # define __STATFS_MATCHES_STATFS64 0 > > + > > +/* And for getitimer, setitimer and rusage */ > > +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 0 > > #endif > > > > /* Number of descriptors that can fit in an `fd_set'. */ > > Ok. > > > diff --git a/sysdeps/unix/sysv/linux/x86/bits/typesizes.h b/sysdeps/unix/sysv/linux/x86/bits/typesizes.h > > index 87c50a4f32..f68dfecc90 100644 > > --- a/sysdeps/unix/sysv/linux/x86/bits/typesizes.h > > +++ b/sysdeps/unix/sysv/linux/x86/bits/typesizes.h > > @@ -94,6 +94,9 @@ > > # define __STATFS_MATCHES_STATFS64 0 > > #endif > > > > +/* And for getitimer, setitimer and rusage */ > > +#define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 1 > > + > > /* Number of descriptors that can fit in an `fd_set'. */ > > #define __FD_SETSIZE 1024 > > > > > > This is wrong for i686. Fixed. Alistair
diff --git a/bits/typesizes.h b/bits/typesizes.h index 599408973e..8f16903a21 100644 --- a/bits/typesizes.h +++ b/bits/typesizes.h @@ -76,10 +76,16 @@ /* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */ # define __STATFS_MATCHES_STATFS64 1 + +/* And for getitimer, setitimer and rusage */ +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 1 #else # define __RLIM_T_MATCHES_RLIM64_T 0 # define __STATFS_MATCHES_STATFS64 0 + +/* And for getitimer, setitimer and rusage */ +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 0 #endif /* Number of descriptors that can fit in an `fd_set'. */ diff --git a/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h b/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h index 28ee3e5920..e5d7774468 100644 --- a/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h +++ b/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h @@ -73,6 +73,9 @@ /* Not for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */ # define __STATFS_MATCHES_STATFS64 0 +/* And for getitimer, setitimer and rusage */ +#define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 0 + /* Number of descriptors that can fit in an `fd_set'. */ #define __FD_SETSIZE 1024 diff --git a/sysdeps/unix/sysv/linux/generic/bits/typesizes.h b/sysdeps/unix/sysv/linux/generic/bits/typesizes.h index 7c963e523e..4fb246ac74 100644 --- a/sysdeps/unix/sysv/linux/generic/bits/typesizes.h +++ b/sysdeps/unix/sysv/linux/generic/bits/typesizes.h @@ -77,11 +77,17 @@ /* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */ # define __STATFS_MATCHES_STATFS64 1 + +/* And for getitimer, setitimer and rusage */ +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 1 #else # define __RLIM_T_MATCHES_RLIM64_T 0 # define __STATFS_MATCHES_STATFS64 0 + +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 0 #endif + /* Number of descriptors that can fit in an `fd_set'. */ #define __FD_SETSIZE 1024 diff --git a/sysdeps/unix/sysv/linux/s390/bits/typesizes.h b/sysdeps/unix/sysv/linux/s390/bits/typesizes.h index e775e460bb..2bc87c1079 100644 --- a/sysdeps/unix/sysv/linux/s390/bits/typesizes.h +++ b/sysdeps/unix/sysv/linux/s390/bits/typesizes.h @@ -82,10 +82,16 @@ /* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */ # define __STATFS_MATCHES_STATFS64 1 + +/* And for getitimer, setitimer and rusage */ +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 1 #else # define __RLIM_T_MATCHES_RLIM64_T 0 # define __STATFS_MATCHES_STATFS64 0 + +/* And for getitimer, setitimer and rusage */ +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 0 #endif /* Number of descriptors that can fit in an `fd_set'. */ diff --git a/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h b/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h index ac48c23e37..288a902b5f 100644 --- a/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h +++ b/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h @@ -76,10 +76,16 @@ /* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */ # define __STATFS_MATCHES_STATFS64 1 + +/* And for getitimer, setitimer and rusage */ +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 1 #else # define __RLIM_T_MATCHES_RLIM64_T 0 # define __STATFS_MATCHES_STATFS64 0 + +/* And for getitimer, setitimer and rusage */ +# define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 0 #endif /* Number of descriptors that can fit in an `fd_set'. */ diff --git a/sysdeps/unix/sysv/linux/x86/bits/typesizes.h b/sysdeps/unix/sysv/linux/x86/bits/typesizes.h index 87c50a4f32..f68dfecc90 100644 --- a/sysdeps/unix/sysv/linux/x86/bits/typesizes.h +++ b/sysdeps/unix/sysv/linux/x86/bits/typesizes.h @@ -94,6 +94,9 @@ # define __STATFS_MATCHES_STATFS64 0 #endif +/* And for getitimer, setitimer and rusage */ +#define __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 1 + /* Number of descriptors that can fit in an `fd_set'. */ #define __FD_SETSIZE 1024
On y2038 safe 32-bit systems the Linux kernel expects itimerval and rusage to use a 32-bit time_t, even though the other time_t's are 64-bit. There are also other occurances where the time passed to the kernel via timeval doesn't match the wordsize. To handle these cases let's define a new macro __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64. This macro specifies if the kernel's old_timeval matches the new timeval64. This should be true for 64-bit architectures (expect for Alpha) and x32. Reviewed-by: Lukasz Majewski <lukma@denx.de> --- bits/typesizes.h | 6 ++++++ sysdeps/unix/sysv/linux/alpha/bits/typesizes.h | 3 +++ sysdeps/unix/sysv/linux/generic/bits/typesizes.h | 6 ++++++ sysdeps/unix/sysv/linux/s390/bits/typesizes.h | 6 ++++++ sysdeps/unix/sysv/linux/sparc/bits/typesizes.h | 6 ++++++ sysdeps/unix/sysv/linux/x86/bits/typesizes.h | 3 +++ 6 files changed, 30 insertions(+)