summaryrefslogtreecommitdiff
path: root/include/internal
diff options
context:
space:
mode:
authorDmitry Chestnykh <dm.chestnykh@gmail.com>2024-02-25 14:43:28 +0300
committerWaldemar Brodkorb <wbx@openadk.org>2024-02-25 19:27:48 +0100
commit81ed334f67e0c56ff0a89ade0fc156c0ba23f190 (patch)
tree09829cc5cd0d03a4f91887864f6a3c28213549af /include/internal
parent086a5f165096af104b01bb6d5639bd769bd17620 (diff)
Add support for using time64 on big-endian machines.
For BE architectures there is one significant difference in comparison with time64 support for little-endian architectures like ARMv7. The difference is that we strictly need to pass two 64bit values to system calls because Linux Kernel internally uses `struct __kernel_timespec` and similar, which consists of two 64bit fields. For this reason many files have been changed to convert pointers to timespec-family structures (mixed of 64bit and 32bit values) to the pointer of the similar but 64bit-only structures for using as system calls args. This is general prerequisite for any BE architecture. Signed-off-by: Dmitry Chestnykh <dm.chestnykh@gmail.com>
Diffstat (limited to 'include/internal')
-rw-r--r--include/internal/time64_helpers.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/include/internal/time64_helpers.h b/include/internal/time64_helpers.h
new file mode 100644
index 000000000..7a78e8388
--- /dev/null
+++ b/include/internal/time64_helpers.h
@@ -0,0 +1,31 @@
+#ifndef _TIME64_HELPERS_H
+#define _TIME64_HELPERS_H
+
+#include <bits/types.h>
+#include <time.h>
+#include <stddef.h>
+
+struct __ts64_struct {
+ __S64_TYPE tv_sec;
+ __S64_TYPE tv_nsec;
+};
+
+#define TO_TS64_P(__ts) (((struct timespec *)(__ts)) ? \
+ (&(struct __ts64_struct) {.tv_sec = ((struct timespec *)(__ts))->tv_sec, \
+ .tv_nsec = ((struct timespec *)(__ts))->tv_nsec}) : NULL)
+
+struct __its64_struct {
+ __S64_TYPE interval_tv_sec;
+ __S64_TYPE interval_tv_nsec;
+ __S64_TYPE value_tv_sec;
+ __S64_TYPE value_tv_nsec;
+};
+
+#define TO_ITS64_P(__its) (((struct itimerspec *)(__its)) ? \
+ (&(struct __its64_struct) {.interval_tv_sec = ((struct itimerspec *)(__its))->it_interval.tv_sec, \
+ .interval_tv_nsec = ((struct itimerspec *)(__its))->it_interval.tv_nsec, \
+ .value_tv_sec = ((struct itimerspec *)(__its))->it_value.tv_sec, \
+ .value_tv_nsec = ((struct itimerspec *)(__its))->it_value.tv_nsec}) : NULL)
+
+
+#endif /* _TIME64_HELPERS_H */