Force 64-bit time based syscalls for TIMESIZE==64 on 32-bit arches

Message ID 20200224183413.13629-1-vgupta@synopsys.com
State Superseded
Headers

Commit Message

Vineet Gupta Feb. 24, 2020, 6:34 p.m. UTC
  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(+)
  

Comments

Alistair Francis Feb. 25, 2020, 12:59 a.m. UTC | #1
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
>
  
Vineet Gupta Feb. 25, 2020, 1:16 a.m. UTC | #2
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
  
Florian Weimer Feb. 25, 2020, 9:27 a.m. UTC | #3
* 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
  
Vineet Gupta March 11, 2020, 6:44 p.m. UTC | #4
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
  

Patch

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