[PATCH] RISC-V: Using SYS_clock_gettime64 for rv32 libgloss.

Kito Cheng <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
 - RISC-V 32 bits linux/glibc didn't provide gettimeofday anymore
   after upstream, because RV32 didn't have backward compatible issue,
   so RV32 only support 64 bits time related system call.

 - So using clock_gettime64 call instead for rv32 libgloss.
---
 libgloss/riscv/machine/syscall.h  |  1 +
 libgloss/riscv/sys_gettimeofday.c | 21 +++++++++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/libgloss/riscv/machine/syscall.h b/libgloss/riscv/machine/syscall.h
index 88b9fdfda..1ac8b1a4b 100644
--- a/libgloss/riscv/machine/syscall.h
+++ b/libgloss/riscv/machine/syscall.h
@@ -44,6 +44,7 @@
 #define SYS_munmap 215
 #define SYS_mremap 216
 #define SYS_mmap 222
+#define SYS_clock_gettime64 403
 #define SYS_open 1024
 #define SYS_link 1025
 #define SYS_unlink 1026
diff --git a/libgloss/riscv/sys_gettimeofday.c b/libgloss/riscv/sys_gettimeofday.c
index daa14e475..81bea8e55 100644
--- a/libgloss/riscv/sys_gettimeofday.c
+++ b/libgloss/riscv/sys_gettimeofday.c
@@ -1,10 +1,31 @@
 #include <machine/syscall.h>
 #include <sys/time.h>
+#include <stdint.h>
 #include "internal_syscall.h"
 
 /* Get the current time.  Only relatively correct.  */
 int
 _gettimeofday(struct timeval *tp, void *tzp)
 {
+#if __riscv_xlen == 32
+  struct __timespec64
+  {
+    int64_t tv_sec;         /* Seconds */
+# if BYTE_ORDER == BIG_ENDIAN
+    int32_t __padding;      /* Padding */
+    int32_t tv_nsec;        /* Nanoseconds */
+# else
+    int32_t tv_nsec;        /* Nanoseconds */
+    int32_t __padding;      /* Padding */
+# endif
+  };
+  struct __timespec64 ts64;
+  int rv;
+  rv = syscall_errno (SYS_clock_gettime64, 2, 0, (long)&ts64, 0, 0, 0, 0);
+  tp->tv_sec = ts64.tv_sec;
+  tp->tv_usec = ts64.tv_nsec * 1000;
+  return rv;
+#else
   return syscall_errno (SYS_gettimeofday, 1, tp, 0, 0, 0, 0, 0);
+#endif
 }
-- 
2.31.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.