From: Philippe Gerum <[email protected]>

As internal interfaces are gradually being made y2038-safe, the
deprecated timeval type is now available as __kernel_old_timeval in
the mainline kernel for the sake of clarity. Switch to this type until
Cobalt is y2038-safe as well.

A wrapper is provided to build on older kernels not defining
__kernel_old_timeval yet.

Signed-off-by: Philippe Gerum <[email protected]>
---
 include/cobalt/kernel/compat.h                       | 4 ++--
 kernel/cobalt/include/asm-generic/xenomai/wrappers.h | 4 ++++
 kernel/cobalt/posix/clock.h                          | 4 ++--
 kernel/cobalt/posix/compat.c                         | 4 ++--
 kernel/cobalt/posix/io.c                             | 6 +++---
 kernel/cobalt/posix/io.h                             | 2 +-
 kernel/cobalt/posix/syscall32.c                      | 2 +-
 kernel/drivers/ipc/bufp.c                            | 5 +++--
 kernel/drivers/ipc/iddp.c                            | 5 +++--
 kernel/drivers/ipc/internal.h                        | 9 +++++----
 kernel/drivers/ipc/rtipc.c                           | 9 +++++----
 kernel/drivers/ipc/xddp.c                            | 5 +++--
 kernel/drivers/net/stack/ipv4/tcp/tcp.c              | 2 +-
 13 files changed, 35 insertions(+), 26 deletions(-)

diff --git a/include/cobalt/kernel/compat.h b/include/cobalt/kernel/compat.h
index c9cb84f72..313b6251b 100644
--- a/include/cobalt/kernel/compat.h
+++ b/include/cobalt/kernel/compat.h
@@ -98,11 +98,11 @@ int sys32_get_itimerspec(struct itimerspec *its,
 int sys32_put_itimerspec(struct compat_itimerspec __user *cits,
                         const struct itimerspec *its);
 
-int sys32_get_timeval(struct timeval *tv,
+int sys32_get_timeval(struct __kernel_old_timeval *tv,
                      const struct compat_timeval __user *ctv);
 
 int sys32_put_timeval(struct compat_timeval __user *ctv,
-                     const struct timeval *tv);
+                     const struct __kernel_old_timeval *tv);
 
 int sys32_get_timex(struct timex *tx,
                    const struct old_timex32 __user *ctx);
diff --git a/kernel/cobalt/include/asm-generic/xenomai/wrappers.h 
b/kernel/cobalt/include/asm-generic/xenomai/wrappers.h
index e093676e1..2e9fb203a 100644
--- a/kernel/cobalt/include/asm-generic/xenomai/wrappers.h
+++ b/kernel/cobalt/include/asm-generic/xenomai/wrappers.h
@@ -162,4 +162,8 @@ devm_hwmon_device_register_with_groups(struct device *dev, 
const char *name,
 #define mmiowb()               do { } while (0)
 #endif
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0)
+#define __kernel_old_timeval   timeval
+#endif
+
 #endif /* _COBALT_ASM_GENERIC_WRAPPERS_H */
diff --git a/kernel/cobalt/posix/clock.h b/kernel/cobalt/posix/clock.h
index 0b06b9316..7cb161df2 100644
--- a/kernel/cobalt/posix/clock.h
+++ b/kernel/cobalt/posix/clock.h
@@ -43,7 +43,7 @@ static inline xnticks_t ts2ns(const struct timespec *ts)
        return nsecs;
 }
 
-static inline xnticks_t tv2ns(const struct timeval *tv)
+static inline xnticks_t tv2ns(const struct __kernel_old_timeval *tv)
 {
        xnticks_t nsecs = tv->tv_usec * 1000;
 
@@ -53,7 +53,7 @@ static inline xnticks_t tv2ns(const struct timeval *tv)
        return nsecs;
 }
 
-static inline void ticks2tv(struct timeval *tv, xnticks_t ticks)
+static inline void ticks2tv(struct __kernel_old_timeval *tv, xnticks_t ticks)
 {
        unsigned long nsecs;
 
diff --git a/kernel/cobalt/posix/compat.c b/kernel/cobalt/posix/compat.c
index e53e72e0c..2ffc0dbdf 100644
--- a/kernel/cobalt/posix/compat.c
+++ b/kernel/cobalt/posix/compat.c
@@ -60,7 +60,7 @@ int sys32_put_itimerspec(struct compat_itimerspec __user 
*cits,
 }
 EXPORT_SYMBOL_GPL(sys32_put_itimerspec);
 
-int sys32_get_timeval(struct timeval *tv,
+int sys32_get_timeval(struct __kernel_old_timeval *tv,
                      const struct compat_timeval __user *ctv)
 {
        return (ctv == NULL ||
@@ -71,7 +71,7 @@ int sys32_get_timeval(struct timeval *tv,
 EXPORT_SYMBOL_GPL(sys32_get_timeval);
 
 int sys32_put_timeval(struct compat_timeval __user *ctv,
-                     const struct timeval *tv)
+                     const struct __kernel_old_timeval *tv)
 {
        return (ctv == NULL ||
                !access_wok(ctv, sizeof(*ctv)) ||
diff --git a/kernel/cobalt/posix/io.c b/kernel/cobalt/posix/io.c
index f35aaf8cd..e9908feeb 100644
--- a/kernel/cobalt/posix/io.c
+++ b/kernel/cobalt/posix/io.c
@@ -212,13 +212,13 @@ int __cobalt_select_bind_all(struct xnselector *selector,
        return 0;
 }
 
-/* int select(int, fd_set *, fd_set *, fd_set *, struct timeval *) */
+/* int select(int, fd_set *, fd_set *, fd_set *, struct __kernel_old_timeval 
*) */
 COBALT_SYSCALL(select, primary,
               (int nfds,
                fd_set __user *u_rfds,
                fd_set __user *u_wfds,
                fd_set __user *u_xfds,
-               struct timeval __user *u_tv))
+               struct __kernel_old_timeval __user *u_tv))
 {
        fd_set __user *ufd_sets[XNSELECT_MAX_TYPES] = {
                [XNSELECT_READ] = u_rfds,
@@ -234,7 +234,7 @@ COBALT_SYSCALL(select, primary,
        xntmode_t mode = XN_RELATIVE;
        struct xnselector *selector;
        struct xnthread *curr;
-       struct timeval tv;
+       struct __kernel_old_timeval tv;
        size_t fds_size;
        int i, err;
 
diff --git a/kernel/cobalt/posix/io.h b/kernel/cobalt/posix/io.h
index 6f20dbedd..82187cc7b 100644
--- a/kernel/cobalt/posix/io.h
+++ b/kernel/cobalt/posix/io.h
@@ -71,6 +71,6 @@ COBALT_SYSCALL_DECL(select,
                     fd_set __user *u_rfds,
                     fd_set __user *u_wfds,
                     fd_set __user *u_xfds,
-                    struct timeval __user *u_tv));
+                    struct __kernel_old_timeval __user *u_tv));
 
 #endif /* !_COBALT_POSIX_IO_H */
diff --git a/kernel/cobalt/posix/syscall32.c b/kernel/cobalt/posix/syscall32.c
index c2fd6a1e0..cb02dacd3 100644
--- a/kernel/cobalt/posix/syscall32.c
+++ b/kernel/cobalt/posix/syscall32.c
@@ -715,7 +715,7 @@ COBALT_SYSCALL32emu(select, nonrestartable,
        xntmode_t mode = XN_RELATIVE;
        struct xnselector *selector;
        struct xnthread *curr;
-       struct timeval tv;
+       struct __kernel_old_timeval tv;
        xnsticks_t diff;
        size_t fds_size;
        int i, err;
diff --git a/kernel/drivers/ipc/bufp.c b/kernel/drivers/ipc/bufp.c
index d45480f94..5692f3146 100644
--- a/kernel/drivers/ipc/bufp.c
+++ b/kernel/drivers/ipc/bufp.c
@@ -22,6 +22,7 @@
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
+#include <linux/time.h>
 #include <cobalt/kernel/heap.h>
 #include <cobalt/kernel/map.h>
 #include <cobalt/kernel/bufd.h>
@@ -818,7 +819,7 @@ static int __bufp_setsockopt(struct bufp_socket *sk,
 {
        struct _rtdm_setsockopt_args sopt;
        struct rtipc_port_label plabel;
-       struct timeval tv;
+       struct __kernel_old_timeval tv;
        rtdm_lockctx_t s;
        size_t len;
        int ret;
@@ -907,7 +908,7 @@ static int __bufp_getsockopt(struct bufp_socket *sk,
 {
        struct _rtdm_getsockopt_args sopt;
        struct rtipc_port_label plabel;
-       struct timeval tv;
+       struct __kernel_old_timeval tv;
        rtdm_lockctx_t s;
        socklen_t len;
        int ret;
diff --git a/kernel/drivers/ipc/iddp.c b/kernel/drivers/ipc/iddp.c
index f31b9bb66..3a9de845f 100644
--- a/kernel/drivers/ipc/iddp.c
+++ b/kernel/drivers/ipc/iddp.c
@@ -22,6 +22,7 @@
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
+#include <linux/time.h>
 #include <cobalt/kernel/heap.h>
 #include <cobalt/kernel/bufd.h>
 #include <cobalt/kernel/map.h>
@@ -700,7 +701,7 @@ static int __iddp_setsockopt(struct iddp_socket *sk,
 {
        struct _rtdm_setsockopt_args sopt;
        struct rtipc_port_label plabel;
-       struct timeval tv;
+       struct __kernel_old_timeval tv;
        rtdm_lockctx_t s;
        size_t len;
        int ret;
@@ -789,7 +790,7 @@ static int __iddp_getsockopt(struct iddp_socket *sk,
 {
        struct _rtdm_getsockopt_args sopt;
        struct rtipc_port_label plabel;
-       struct timeval tv;
+       struct __kernel_old_timeval tv;
        rtdm_lockctx_t s;
        socklen_t len;
        int ret;
diff --git a/kernel/drivers/ipc/internal.h b/kernel/drivers/ipc/internal.h
index 7c09dd312..919a5d978 100644
--- a/kernel/drivers/ipc/internal.h
+++ b/kernel/drivers/ipc/internal.h
@@ -21,6 +21,7 @@
 #define _RTIPC_INTERNAL_H
 
 #include <linux/uio.h>
+#include <linux/time.h>
 #include <cobalt/kernel/registry.h>
 #include <cobalt/kernel/clock.h>
 #include <cobalt/kernel/select.h>
@@ -65,7 +66,7 @@ static inline void *rtipc_fd_to_state(struct rtdm_fd *fd)
        return p->state;
 }
 
-static inline nanosecs_rel_t rtipc_timeval_to_ns(const struct timeval *tv)
+static inline nanosecs_rel_t rtipc_timeval_to_ns(const struct 
__kernel_old_timeval *tv)
 {
        nanosecs_rel_t ns = tv->tv_usec * 1000;
 
@@ -75,7 +76,7 @@ static inline nanosecs_rel_t rtipc_timeval_to_ns(const struct 
timeval *tv)
        return ns;
 }
 
-static inline void rtipc_ns_to_timeval(struct timeval *tv, nanosecs_rel_t ns)
+static inline void rtipc_ns_to_timeval(struct __kernel_old_timeval *tv, 
nanosecs_rel_t ns)
 {
        unsigned long nsecs;
 
@@ -101,11 +102,11 @@ int rtipc_get_sockoptin(struct rtdm_fd *fd,
                        struct _rtdm_setsockopt_args *sopt,
                        const void *arg);
 
-int rtipc_get_timeval(struct rtdm_fd *fd, struct timeval *tv,
+int rtipc_get_timeval(struct rtdm_fd *fd, struct __kernel_old_timeval *tv,
                      const void *arg, size_t arglen);
 
 int rtipc_put_timeval(struct rtdm_fd *fd, void *arg,
-                     const struct timeval *tv, size_t arglen);
+                     const struct __kernel_old_timeval *tv, size_t arglen);
 
 int rtipc_get_length(struct rtdm_fd *fd, size_t *lenp,
                     const void *arg, size_t arglen);
diff --git a/kernel/drivers/ipc/rtipc.c b/kernel/drivers/ipc/rtipc.c
index 99f73202d..b6fafdb41 100644
--- a/kernel/drivers/ipc/rtipc.c
+++ b/kernel/drivers/ipc/rtipc.c
@@ -21,6 +21,7 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
+#include <linux/time.h>
 #include <rtdm/ipc.h>
 #include <rtdm/compat.h>
 #include "internal.h"
@@ -267,7 +268,7 @@ int rtipc_get_sockoptin(struct rtdm_fd *fd, struct 
_rtdm_setsockopt_args *sopt,
        return rtdm_safe_copy_from_user(fd, sopt, arg, sizeof(*sopt));
 }
 
-int rtipc_get_timeval(struct rtdm_fd *fd, struct timeval *tv,
+int rtipc_get_timeval(struct rtdm_fd *fd, struct __kernel_old_timeval *tv,
                      const void *arg, size_t arglen)
 {
 #ifdef CONFIG_XENO_ARCH_SYS3264
@@ -282,7 +283,7 @@ int rtipc_get_timeval(struct rtdm_fd *fd, struct timeval 
*tv,
                return -EINVAL;
 
        if (!rtdm_fd_is_user(fd)) {
-               *tv = *(struct timeval *)arg;
+               *tv = *(struct __kernel_old_timeval *)arg;
                return 0;
        }
 
@@ -290,7 +291,7 @@ int rtipc_get_timeval(struct rtdm_fd *fd, struct timeval 
*tv,
 }
 
 int rtipc_put_timeval(struct rtdm_fd *fd, void *arg,
-                     const struct timeval *tv, size_t arglen)
+                     const struct __kernel_old_timeval *tv, size_t arglen)
 {
 #ifdef CONFIG_XENO_ARCH_SYS3264
        if (rtdm_fd_is_compat(fd)) {
@@ -304,7 +305,7 @@ int rtipc_put_timeval(struct rtdm_fd *fd, void *arg,
                return -EINVAL;
 
        if (!rtdm_fd_is_user(fd)) {
-               *(struct timeval *)arg = *tv;
+               *(struct __kernel_old_timeval *)arg = *tv;
                return 0;
        }
 
diff --git a/kernel/drivers/ipc/xddp.c b/kernel/drivers/ipc/xddp.c
index c9236a229..25dd68a9d 100644
--- a/kernel/drivers/ipc/xddp.c
+++ b/kernel/drivers/ipc/xddp.c
@@ -21,6 +21,7 @@
 #include <linux/string.h>
 #include <linux/poll.h>
 #include <linux/slab.h>
+#include <linux/time.h>
 #include <cobalt/kernel/heap.h>
 #include <cobalt/kernel/bufd.h>
 #include <cobalt/kernel/pipe.h>
@@ -855,7 +856,7 @@ static int __xddp_setsockopt(struct xddp_socket *sk,
        int (*monitor)(struct rtdm_fd *fd, int event, long arg);
        struct _rtdm_setsockopt_args sopt;
        struct rtipc_port_label plabel;
-       struct timeval tv;
+       struct __kernel_old_timeval tv;
        rtdm_lockctx_t s;
        size_t len;
        int ret;
@@ -961,7 +962,7 @@ static int __xddp_getsockopt(struct xddp_socket *sk,
 {
        struct _rtdm_getsockopt_args sopt;
        struct rtipc_port_label plabel;
-       struct timeval tv;
+       struct __kernel_old_timeval tv;
        rtdm_lockctx_t s;
        socklen_t len;
        int ret;
diff --git a/kernel/drivers/net/stack/ipv4/tcp/tcp.c 
b/kernel/drivers/net/stack/ipv4/tcp/tcp.c
index 54d6f7925..08753e48a 100644
--- a/kernel/drivers/net/stack/ipv4/tcp/tcp.c
+++ b/kernel/drivers/net/stack/ipv4/tcp/tcp.c
@@ -1742,7 +1742,7 @@ static int rt_tcp_setsockopt(struct rtdm_fd *fd, struct 
tcp_socket *ts,
                             socklen_t optlen)
 {
        /* uint64_t val; */
-       struct timeval tv;
+       struct __kernel_old_timeval tv;
        rtdm_lockctx_t context;
 
        switch (optname) {
-- 
2.26.2


Reply via email to