Message ID | 20200224183413.13629-1-vgupta@synopsys.com |
---|---|
State | New |
Headers | show |
Series | Force 64-bit time based syscalls for TIMESIZE==64 on 32-bit arches | expand |
On Mon, Feb 24, 2020 at 10:34 AM Vineet Gupta <Vineet.Gupta1@synopsys.com> wrote: > > This provides better out-of-box support for 32-bit arches with 64-bit > time_t > > Signed-off-by: Vineet Gupta <vgupta@synopsys.com> > --- > sysdeps/unix/sysv/linux/generic/sysdep.h | 48 ++++++++++++++++++++++++ > 1 file changed, 48 insertions(+) > > diff --git a/sysdeps/unix/sysv/linux/generic/sysdep.h b/sysdeps/unix/sysv/linux/generic/sysdep.h > index 23defce7c3e1..27b0079a2a71 100644 > --- a/sysdeps/unix/sysv/linux/generic/sysdep.h > +++ b/sysdeps/unix/sysv/linux/generic/sysdep.h > @@ -17,6 +17,7 @@ > <https://www.gnu.org/licenses/>. */ > > #include <bits/wordsize.h> > +#include <bits/timesize.h> > #include <kernel-features.h> > #include <sysdeps/unix/sysdep.h> > #include <sysdeps/unix/sysv/linux/sysdep.h> > @@ -33,3 +34,50 @@ > #define __NR_pread __NR_pread64 > #define __NR_pwrite __NR_pwrite64 > #endif > + > +/* Override syscalls for asm-generic ABIs with 64-bit time. */ > +#if __WORDSIZE == 32 && __TIMESIZE == 64 > + > +# undef __NR_futex > +# define __NR_futex __NR_futex_time64 I think you should do what RV32 does and wrap these in ifndef's Alistair > + > +# undef __NR_rt_sigtimedwait > +# define __NR_rt_sigtimedwait __NR_rt_sigtimedwait_time64 > + > +# undef __NR_ppoll > +# define __NR_ppoll __NR_ppoll_time64 > + > +# undef __NR_utimensat > +# define __NR_utimensat __NR_utimensat_time64 > + > +# undef __NR_pselect6 > +# define __NR_pselect6 __NR_pselect6_time64 > + > +# undef __NR_recvmmsg > +# define __NR_recvmmsg __NR_recvmmsg_time64 > + > +# undef __NR_semtimedop > +# define __NR_semtimedop __NR_semtimedop_time64 > + > +# undef __NR_mq_timedreceive > +# define __NR_mq_timedreceive __NR_mq_timedreceive_time64 > + > +# undef __NR_mq_timedsend > +# define __NR_mq_timedsend __NR_mq_timedsend_time64 > + > +# undef __NR_clock_getres > +# define __NR_clock_getres __NR_clock_getres_time64 > + > +# undef __NR_timerfd_settime > +# define __NR_timerfd_settime __NR_timerfd_settime64 > + > +# undef __NR_timerfd_gettime > +# define __NR_timerfd_gettime __NR_timerfd_gettime64 > + > +# undef __NR_sched_rr_get_interval > +# define __NR_sched_rr_get_interval __NR_sched_rr_get_interval_time64 > + > +# undef __NR_clock_adjtime > +# define __NR_clock_adjtime __NR_clock_adjtime64 > + > +#endif > -- > 2.20.1 >
On 2/24/20 4:59 PM, Alistair Francis wrote: >> +/* Override syscalls for asm-generic ABIs with 64-bit time. */ >> +#if __WORDSIZE == 32 && __TIMESIZE == 64 >> + >> +# undef __NR_futex >> +# define __NR_futex __NR_futex_time64 > I think you should do what RV32 does and wrap these in ifndef's ARC asm-generic ABI is different from the ones newer arches have. For us the these syscalls already exist and the idea is to replace them with the 64-bit variants which requires #undef. -Vineet
* Vineet Gupta: > +/* Override syscalls for asm-generic ABIs with 64-bit time. */ > +#if __WORDSIZE == 32 && __TIMESIZE == 64 > + > +# undef __NR_futex > +# define __NR_futex __NR_futex_time64 > + > +# undef __NR_rt_sigtimedwait > +# define __NR_rt_sigtimedwait __NR_rt_sigtimedwait_time64 I'm not totally unsympathetic to this in principle, but I think if we start messing more with the system call numbers in this way, we should move away from the __NR_ prefixes and use our own constant names. Otherwise, the results could be very confusing, especially if there are exceptions to this exception and we need the original system call number after all. Thanks, Florian
Hi Florian, On 2/25/20 1:27 AM, Florian Weimer wrote: > * Vineet Gupta: > >> +/* Override syscalls for asm-generic ABIs with 64-bit time. */ >> +#if __WORDSIZE == 32 && __TIMESIZE == 64 >> + >> +# undef __NR_futex >> +# define __NR_futex __NR_futex_time64 >> + >> +# undef __NR_rt_sigtimedwait >> +# define __NR_rt_sigtimedwait __NR_rt_sigtimedwait_time64 > > I'm not totally unsympathetic to this in principle, but I think if we > start messing more with the system call numbers in this way, we should > move away from the __NR_ prefixes and use our own constant names. > > Otherwise, the results could be very confusing, especially if there are > exceptions to this exception and we need the original system call number > after all. OK I understand that redef could get messy. How about simple #undef of the 32-bit syscalls so they are not available in general and rely on generic code to fallback and DRT. Do note that this is mostly a "preventive" fix (for single exception see below) and new arches will hopefully not trip here as they won't have the 32-bit syscalls to begin with. It is applicable to arches with slightly older version of the asm-generic ABI. And for same reasons I can even move those into ARC sysdep.h - what would you recommend. FWIW the only relevant piece here is futex which generic lll code expects __NR_futex and we need to undef/redef to 64-bit variant (either here or in ARCH specific sysdep.h for RV32 and ARC) so having that part atleast in generic code will help future ports avoid the copy/paste. Thx, -Vineet
diff --git a/sysdeps/unix/sysv/linux/generic/sysdep.h b/sysdeps/unix/sysv/linux/generic/sysdep.h index 23defce7c3e1..27b0079a2a71 100644 --- a/sysdeps/unix/sysv/linux/generic/sysdep.h +++ b/sysdeps/unix/sysv/linux/generic/sysdep.h @@ -17,6 +17,7 @@ <https://www.gnu.org/licenses/>. */ #include <bits/wordsize.h> +#include <bits/timesize.h> #include <kernel-features.h> #include <sysdeps/unix/sysdep.h> #include <sysdeps/unix/sysv/linux/sysdep.h> @@ -33,3 +34,50 @@ #define __NR_pread __NR_pread64 #define __NR_pwrite __NR_pwrite64 #endif + +/* Override syscalls for asm-generic ABIs with 64-bit time. */ +#if __WORDSIZE == 32 && __TIMESIZE == 64 + +# undef __NR_futex +# define __NR_futex __NR_futex_time64 + +# undef __NR_rt_sigtimedwait +# define __NR_rt_sigtimedwait __NR_rt_sigtimedwait_time64 + +# undef __NR_ppoll +# define __NR_ppoll __NR_ppoll_time64 + +# undef __NR_utimensat +# define __NR_utimensat __NR_utimensat_time64 + +# undef __NR_pselect6 +# define __NR_pselect6 __NR_pselect6_time64 + +# undef __NR_recvmmsg +# define __NR_recvmmsg __NR_recvmmsg_time64 + +# undef __NR_semtimedop +# define __NR_semtimedop __NR_semtimedop_time64 + +# undef __NR_mq_timedreceive +# define __NR_mq_timedreceive __NR_mq_timedreceive_time64 + +# undef __NR_mq_timedsend +# define __NR_mq_timedsend __NR_mq_timedsend_time64 + +# undef __NR_clock_getres +# define __NR_clock_getres __NR_clock_getres_time64 + +# undef __NR_timerfd_settime +# define __NR_timerfd_settime __NR_timerfd_settime64 + +# undef __NR_timerfd_gettime +# define __NR_timerfd_gettime __NR_timerfd_gettime64 + +# undef __NR_sched_rr_get_interval +# define __NR_sched_rr_get_interval __NR_sched_rr_get_interval_time64 + +# undef __NR_clock_adjtime +# define __NR_clock_adjtime __NR_clock_adjtime64 + +#endif
This provides better out-of-box support for 32-bit arches with 64-bit time_t Signed-off-by: Vineet Gupta <vgupta@synopsys.com> --- sysdeps/unix/sysv/linux/generic/sysdep.h | 48 ++++++++++++++++++++++++ 1 file changed, 48 insertions(+)