xenomai.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
* [stable 3.2.x][PATCH 0/7] Add full smokey compat support
@ 2023-02-23  7:04 Florian Bezdeka
  2023-02-23  7:04 ` [stable 3.2.x][PATCH 1/7] y2038: posix/mqueue: Fix compat case for mq_timedreceive64 Florian Bezdeka
                   ` (7 more replies)
  0 siblings, 8 replies; 9+ messages in thread
From: Florian Bezdeka @ 2023-02-23  7:04 UTC (permalink / raw)
  To: xenomai; +Cc: jan.kiszka, Florian Bezdeka

Hi all,

an internal customer detected some testing issues in the stable 3.2.x
branch. All of them were directly related to compat support.

With this series applied the complete smokey testsuite can be run in
compat mode without any issues. Patch 6 needed a backport (can driver
got a refactoring in next/master), all other patches were taken from
next/master without any modifications.

The failing testsuite looked like this:

/usr/lib/xenomai/testsuite/smokey --run \
                                  --keep-going \
                                  random_alloc_rounds=64
                                  pattern_check_rounds=64
dlopen OK
syscall-tests.c:712, assertion failed: !ret
xddp OK
vdso_access OK
tsc OK
timerfd OK
sigdebug OK
setsched OK
sched_tp OK
sched_quota OK
rtdm OK
posix_select OK
posix_mutex OK
posix_fork OK
posix_cond OK
posix_clock OK
setup.c:96, ioctl(fd, IOC_RT_IFINFO, &cmd): Inappropriate ioctl for device
setup.c:96, ioctl(fd, IOC_RT_IFINFO, &cmd): Inappropriate ioctl for device
setup.c:96, ioctl(fd, IOC_RT_IFINFO, &cmd): Inappropriate ioctl for device
memory_tlsf OK
memory_heapmem OK
memory_coreheap OK
leaks OK
iddp OK
gdb OK
fpu_stress OK
cpu_affinity OK
bufp OK
arith OK
start_timesyncd
false
child 269 returned: exited with status 1

Best regards,
Florian

Florian Bezdeka (7):
  y2038: posix/mqueue: Fix compat case for mq_timedreceive64
  y2038: cobalt: rtdm/fd: Take care of compat mode for recvmmsg64
  y2038: cobalt: posix/signal: Take care of compat mode for
    sigtimedwait64
  rtnet: Enable compat ioctl interface
  cobalt/rtdm/fd: Adding helpers for handling compat affected data
    structures
  drivers/rtcan: Implement compat support for the rtcan driver
  drivers/net/stack/ipv4/udp: Implement compat support for the udp
    driver

 include/cobalt/kernel/rtdm/fd.h               |  16 +++
 .../x86/include/asm/xenomai/syscall32-table.h |   3 +
 kernel/cobalt/posix/mqueue.c                  |  26 ++--
 kernel/cobalt/posix/mqueue.h                  |   2 +-
 kernel/cobalt/posix/syscall32.c               |  17 ++-
 kernel/cobalt/posix/syscall32.h               |   3 +-
 kernel/cobalt/rtdm/drvlib.c                   |  17 +--
 kernel/cobalt/rtdm/fd.c                       | 122 ++++++++++++++++++
 kernel/drivers/can/rtcan_raw.c                |  42 +++---
 kernel/drivers/net/stack/ipv4/udp/udp.c       |  29 +++--
 kernel/drivers/net/stack/rtnet_chrdev.c       |   1 +
 11 files changed, 208 insertions(+), 70 deletions(-)

-- 
2.39.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [stable 3.2.x][PATCH 1/7] y2038: posix/mqueue: Fix compat case for mq_timedreceive64
  2023-02-23  7:04 [stable 3.2.x][PATCH 0/7] Add full smokey compat support Florian Bezdeka
@ 2023-02-23  7:04 ` Florian Bezdeka
  2023-02-23  7:04 ` [stable 3.2.x][PATCH 2/7] y2038: cobalt: rtdm/fd: Take care of compat mode for recvmmsg64 Florian Bezdeka
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Florian Bezdeka @ 2023-02-23  7:04 UTC (permalink / raw)
  To: xenomai; +Cc: jan.kiszka, Florian Bezdeka

There is a pointer to ssize_t part of the ABI. The pointer itself is
autocorrected by the syscall enter machinery, but when reading/writing
we have to care about different sizes between compat and native case.

Signed-off-by: Florian Bezdeka <florian.bezdeka@siemens.com>
---
 .../x86/include/asm/xenomai/syscall32-table.h |  1 +
 kernel/cobalt/posix/mqueue.c                  | 26 +++++++++----------
 kernel/cobalt/posix/mqueue.h                  |  2 +-
 kernel/cobalt/posix/syscall32.c               | 17 ++++++++++--
 kernel/cobalt/posix/syscall32.h               |  3 ++-
 5 files changed, 32 insertions(+), 17 deletions(-)

diff --git a/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h b/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h
index fb55d8863..3c9c287e1 100644
--- a/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h
+++ b/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h
@@ -63,5 +63,6 @@ __COBALT_CALL32emu_THUNK(recvmsg)
 __COBALT_CALL32emu_THUNK(sendmsg)
 __COBALT_CALL32emu_THUNK(mmap)
 __COBALT_CALL32emu_THUNK(backtrace)
+__COBALT_CALL32emu_THUNK(mq_timedreceive64)
 
 #endif /* !_COBALT_X86_ASM_SYSCALL32_TABLE_H */
diff --git a/kernel/cobalt/posix/mqueue.c b/kernel/cobalt/posix/mqueue.c
index d93c0bdf6..a156af564 100644
--- a/kernel/cobalt/posix/mqueue.c
+++ b/kernel/cobalt/posix/mqueue.c
@@ -1048,21 +1048,12 @@ fail:
 }
 
 int __cobalt_mq_timedreceive64(mqd_t uqd, void __user *u_buf,
-			       ssize_t __user *u_len,
+			       ssize_t *len,
 			       unsigned int __user *u_prio,
 			       const void __user *u_ts)
 {
-	ssize_t len;
-	int ret;
-
-	ret = cobalt_copy_from_user(&len, u_len, sizeof(len));
-	if (ret)
-		return ret;
-
-	ret = __cobalt_mq_timedreceive(uqd, u_buf, &len, u_prio, u_ts,
-				       u_ts ? mq_fetch_timeout64 : NULL);
-
-	return ret ?: cobalt_copy_to_user(u_len, &len, sizeof(*u_len));
+	return __cobalt_mq_timedreceive(uqd, u_buf, len, u_prio, u_ts,
+					u_ts ? mq_fetch_timeout64 : NULL);
 }
 
 COBALT_SYSCALL(mq_timedreceive, primary,
@@ -1089,5 +1080,14 @@ COBALT_SYSCALL(mq_timedreceive64, primary,
 		unsigned int __user *u_prio,
 		const struct __kernel_timespec __user *u_ts))
 {
-	return __cobalt_mq_timedreceive64(uqd, u_buf, u_len, u_prio, u_ts);
+	ssize_t len;
+	int ret;
+
+	ret = cobalt_copy_from_user(&len, u_len, sizeof(len));
+	if (ret)
+		return ret;
+
+	ret = __cobalt_mq_timedreceive64(uqd, u_buf, &len, u_prio, u_ts);
+
+	return ret ?: cobalt_copy_to_user(u_len, &len, sizeof(*u_len));
 }
diff --git a/kernel/cobalt/posix/mqueue.h b/kernel/cobalt/posix/mqueue.h
index b4b263158..d9223866a 100644
--- a/kernel/cobalt/posix/mqueue.h
+++ b/kernel/cobalt/posix/mqueue.h
@@ -51,7 +51,7 @@ int __cobalt_mq_timedreceive(mqd_t uqd, void __user *u_buf,
 						  const void __user *u_ts));
 
 int __cobalt_mq_timedreceive64(mqd_t uqd, void __user *u_buf,
-			       ssize_t __user *u_len,
+			       ssize_t *len,
 			       unsigned int __user *u_prio,
 			       const void __user *u_ts);
 
diff --git a/kernel/cobalt/posix/syscall32.c b/kernel/cobalt/posix/syscall32.c
index b0b2785e0..9be0971a0 100644
--- a/kernel/cobalt/posix/syscall32.c
+++ b/kernel/cobalt/posix/syscall32.c
@@ -356,11 +356,24 @@ COBALT_SYSCALL32emu(mq_timedreceive, primary,
 }
 
 COBALT_SYSCALL32emu(mq_timedreceive64, primary,
-		    (mqd_t uqd, void __user *u_buf, ssize_t __user *u_len,
+		    (mqd_t uqd, void __user *u_buf,
+		     compat_ssize_t __user *u_len,
 		     unsigned int __user *u_prio,
 		     const struct __kernel_timespec __user *u_ts))
 {
-	return __cobalt_mq_timedreceive64(uqd, u_buf, u_len, u_prio, u_ts);
+	compat_ssize_t clen;
+	ssize_t len;
+	int ret;
+
+	ret = cobalt_copy_from_user(&clen, u_len, sizeof(*u_len));
+	if (ret)
+		return ret;
+
+	len = clen;
+	ret = __cobalt_mq_timedreceive64(uqd, u_buf, &len, u_prio, u_ts);
+	clen = len;
+
+	return ret ?: cobalt_copy_to_user(u_len, &clen, sizeof(*u_len));
 }
 
 static inline int mq_fetch_timeout(struct timespec64 *ts,
diff --git a/kernel/cobalt/posix/syscall32.h b/kernel/cobalt/posix/syscall32.h
index 72e32f4f8..37f58ef7c 100644
--- a/kernel/cobalt/posix/syscall32.h
+++ b/kernel/cobalt/posix/syscall32.h
@@ -133,7 +133,8 @@ COBALT_SYSCALL32emu_DECL(mq_timedreceive,
 			  const struct old_timespec32 __user *u_ts));
 
 COBALT_SYSCALL32emu_DECL(mq_timedreceive64,
-			 (mqd_t uqd, void __user *u_buf, ssize_t __user *u_len,
+			 (mqd_t uqd, void __user *u_buf,
+			  compat_ssize_t __user *u_len,
 			  unsigned int __user *u_prio,
 			  const struct __kernel_timespec __user *u_ts));
 
-- 
2.39.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [stable 3.2.x][PATCH 2/7] y2038: cobalt: rtdm/fd: Take care of compat mode for recvmmsg64
  2023-02-23  7:04 [stable 3.2.x][PATCH 0/7] Add full smokey compat support Florian Bezdeka
  2023-02-23  7:04 ` [stable 3.2.x][PATCH 1/7] y2038: posix/mqueue: Fix compat case for mq_timedreceive64 Florian Bezdeka
@ 2023-02-23  7:04 ` Florian Bezdeka
  2023-02-23  7:04 ` [stable 3.2.x][PATCH 3/7] y2038: cobalt: posix/signal: Take care of compat mode for sigtimedwait64 Florian Bezdeka
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Florian Bezdeka @ 2023-02-23  7:04 UTC (permalink / raw)
  To: xenomai; +Cc: jan.kiszka, Florian Bezdeka

The compat syscall was previously routed to the native entrypoint
which triggered a failure during mmsghdr validation.

Signed-off-by: Florian Bezdeka <florian.bezdeka@siemens.com>
---
 kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h b/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h
index 3c9c287e1..1c83ff4e3 100644
--- a/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h
+++ b/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h
@@ -64,5 +64,6 @@ __COBALT_CALL32emu_THUNK(sendmsg)
 __COBALT_CALL32emu_THUNK(mmap)
 __COBALT_CALL32emu_THUNK(backtrace)
 __COBALT_CALL32emu_THUNK(mq_timedreceive64)
+__COBALT_CALL32emu_THUNK(recvmmsg64)
 
 #endif /* !_COBALT_X86_ASM_SYSCALL32_TABLE_H */
-- 
2.39.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [stable 3.2.x][PATCH 3/7] y2038: cobalt: posix/signal: Take care of compat mode for sigtimedwait64
  2023-02-23  7:04 [stable 3.2.x][PATCH 0/7] Add full smokey compat support Florian Bezdeka
  2023-02-23  7:04 ` [stable 3.2.x][PATCH 1/7] y2038: posix/mqueue: Fix compat case for mq_timedreceive64 Florian Bezdeka
  2023-02-23  7:04 ` [stable 3.2.x][PATCH 2/7] y2038: cobalt: rtdm/fd: Take care of compat mode for recvmmsg64 Florian Bezdeka
@ 2023-02-23  7:04 ` Florian Bezdeka
  2023-02-23  7:04 ` [stable 3.2.x][PATCH 4/7] rtnet: Enable compat ioctl interface Florian Bezdeka
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Florian Bezdeka @ 2023-02-23  7:04 UTC (permalink / raw)
  To: xenomai; +Cc: jan.kiszka, Florian Bezdeka

The compat syscall was previously routed to the native entrypoint.
While the timeout is always based on time64_t the siginfo has to be
handled different in compat mode.

Signed-off-by: Florian Bezdeka <florian.bezdeka@siemens.com>
---
 kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h b/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h
index 1c83ff4e3..3986b227b 100644
--- a/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h
+++ b/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32-table.h
@@ -64,6 +64,7 @@ __COBALT_CALL32emu_THUNK(sendmsg)
 __COBALT_CALL32emu_THUNK(mmap)
 __COBALT_CALL32emu_THUNK(backtrace)
 __COBALT_CALL32emu_THUNK(mq_timedreceive64)
+__COBALT_CALL32emu_THUNK(sigtimedwait64)
 __COBALT_CALL32emu_THUNK(recvmmsg64)
 
 #endif /* !_COBALT_X86_ASM_SYSCALL32_TABLE_H */
-- 
2.39.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [stable 3.2.x][PATCH 4/7] rtnet: Enable compat ioctl interface
  2023-02-23  7:04 [stable 3.2.x][PATCH 0/7] Add full smokey compat support Florian Bezdeka
                   ` (2 preceding siblings ...)
  2023-02-23  7:04 ` [stable 3.2.x][PATCH 3/7] y2038: cobalt: posix/signal: Take care of compat mode for sigtimedwait64 Florian Bezdeka
@ 2023-02-23  7:04 ` Florian Bezdeka
  2023-02-23  7:04 ` [stable 3.2.x][PATCH 5/7] cobalt/rtdm/fd: Adding helpers for handling compat affected data structures Florian Bezdeka
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Florian Bezdeka @ 2023-02-23  7:04 UTC (permalink / raw)
  To: xenomai; +Cc: jan.kiszka, Florian Bezdeka

Running rtnet for compat applications failed because the compat ioctl
interface was not activated.

Signed-off-by: Florian Bezdeka <florian.bezdeka@siemens.com>
---
 kernel/drivers/net/stack/rtnet_chrdev.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/kernel/drivers/net/stack/rtnet_chrdev.c b/kernel/drivers/net/stack/rtnet_chrdev.c
index 9457661a1..fa859c3bc 100644
--- a/kernel/drivers/net/stack/rtnet_chrdev.c
+++ b/kernel/drivers/net/stack/rtnet_chrdev.c
@@ -195,6 +195,7 @@ void rtnet_unregister_ioctls(struct rtnet_ioctls *ioctls)
 static struct file_operations rtnet_fops = {
 	.owner = THIS_MODULE,
 	.unlocked_ioctl = rtnet_ioctl,
+	.compat_ioctl = rtnet_ioctl,
 };
 
 static struct miscdevice rtnet_chr_misc_dev = {
-- 
2.39.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [stable 3.2.x][PATCH 5/7] cobalt/rtdm/fd: Adding helpers for handling compat affected data structures
  2023-02-23  7:04 [stable 3.2.x][PATCH 0/7] Add full smokey compat support Florian Bezdeka
                   ` (3 preceding siblings ...)
  2023-02-23  7:04 ` [stable 3.2.x][PATCH 4/7] rtnet: Enable compat ioctl interface Florian Bezdeka
@ 2023-02-23  7:04 ` Florian Bezdeka
  2023-02-23  7:04 ` [stable 3.2.x][PATCH 6/7] drivers/rtcan: Implement compat support for the rtcan driver Florian Bezdeka
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Florian Bezdeka @ 2023-02-23  7:04 UTC (permalink / raw)
  To: xenomai; +Cc: jan.kiszka, Florian Bezdeka

Several drivers will have to read and write data structures that have
a different memory layout when handling compat applications. Moving
the decission if the compat path has to be taken into the rtdm layer
helps to keep the drivers simple and clean.

Added helpers
  - for reading and writing struct iovec
    (and its compat representation)
  - for reading and writing struct _rtdm_setsockaddr_args
    (and its compat representation)

Signed-off-by: Florian Bezdeka <florian.bezdeka@siemens.com>
---
 include/cobalt/kernel/rtdm/fd.h |  16 +++++
 kernel/cobalt/rtdm/drvlib.c     |  17 +----
 kernel/cobalt/rtdm/fd.c         | 122 ++++++++++++++++++++++++++++++++
 3 files changed, 140 insertions(+), 15 deletions(-)

diff --git a/include/cobalt/kernel/rtdm/fd.h b/include/cobalt/kernel/rtdm/fd.h
index 058a9c638..176c67e22 100644
--- a/include/cobalt/kernel/rtdm/fd.h
+++ b/include/cobalt/kernel/rtdm/fd.h
@@ -29,6 +29,8 @@
 struct vm_area_struct;
 struct rtdm_fd;
 struct _rtdm_mmap_request;
+struct _rtdm_setsockaddr_args;
+struct _rtdm_setsockopt_args;
 struct xnselector;
 struct cobalt_ppd;
 struct rtdm_device;
@@ -403,6 +405,20 @@ int rtdm_fd_valid_p(int ufd);
 int rtdm_fd_select(int ufd, struct xnselector *selector,
 		   unsigned int type);
 
+int rtdm_fd_get_setsockaddr_args(struct rtdm_fd *fd,
+				 struct _rtdm_setsockaddr_args *dst,
+				 const void *src);
+
+int rtdm_fd_get_setsockopt_args(struct rtdm_fd *fd,
+				struct _rtdm_setsockopt_args *dst,
+				const void *src);
+
+int rtdm_fd_get_iovec(struct rtdm_fd *fd, struct iovec *iov,
+		      const struct user_msghdr *msg, bool rw);
+
+int rtdm_fd_put_iovec(struct rtdm_fd *fd, const struct iovec *iov,
+		      const struct user_msghdr *msg);
+
 int rtdm_device_new_fd(struct rtdm_fd *fd, int ufd,
 		struct rtdm_device *dev);
 
diff --git a/kernel/cobalt/rtdm/drvlib.c b/kernel/cobalt/rtdm/drvlib.c
index 4ae1ed672..99d54f58f 100644
--- a/kernel/cobalt/rtdm/drvlib.c
+++ b/kernel/cobalt/rtdm/drvlib.c
@@ -2212,14 +2212,7 @@ int rtdm_get_iovec(struct rtdm_fd *fd, struct iovec **iovp,
 		return 0;
 	}
 
-#ifdef CONFIG_XENO_ARCH_SYS3264
-	if (rtdm_fd_is_compat(fd))
-		return sys32_get_iovec(iov,
-			       (struct compat_iovec __user *)msg->msg_iov,
-			       msg->msg_iovlen);
-#endif
-
-	return rtdm_copy_from_user(fd, iov, msg->msg_iov, len);
+	return rtdm_fd_get_iovec(fd, iov, msg, false);
 }
 EXPORT_SYMBOL_GPL(rtdm_get_iovec);
 
@@ -2234,13 +2227,7 @@ int rtdm_put_iovec(struct rtdm_fd *fd, struct iovec *iov,
 		memcpy(msg->msg_iov, iov, len);
 		ret = 0;
 	} else
-#ifdef CONFIG_XENO_ARCH_SYS3264
-		if (rtdm_fd_is_compat(fd))
-			ret = sys32_put_iovec((struct compat_iovec __user *)msg->msg_iov,
-					      iov, msg->msg_iovlen);
-		else
-#endif
-			ret = rtdm_copy_to_user(fd, msg->msg_iov, iov, len);
+		ret = rtdm_fd_put_iovec(fd, iov, msg);
 
 	if (iov != iov_fast)
 		xnfree(iov);
diff --git a/kernel/cobalt/rtdm/fd.c b/kernel/cobalt/rtdm/fd.c
index bbeea06ae..e63fab7dc 100644
--- a/kernel/cobalt/rtdm/fd.c
+++ b/kernel/cobalt/rtdm/fd.c
@@ -31,6 +31,7 @@
 #include <cobalt/kernel/time.h>
 #include <pipeline/inband_work.h>
 #include <trace/events/cobalt-rtdm.h>
+#include <rtdm/compat.h>
 #include <rtdm/fd.h>
 #include "internal.h"
 #include "posix/process.h"
@@ -999,6 +1000,127 @@ int rtdm_fd_select(int ufd, struct xnselector *selector,
 	return ret;
 }
 
+int rtdm_fd_get_setsockaddr_args(struct rtdm_fd *fd,
+				 struct _rtdm_setsockaddr_args *dst,
+				 const void *src)
+{
+
+#ifdef CONFIG_XENO_ARCH_SYS3264
+	if (rtdm_fd_is_compat(fd)) {
+		struct compat_rtdm_setsockaddr_args cargs;
+		int ret;
+
+		if (!rtdm_read_user_ok(fd, src, sizeof(cargs)))
+			return -EFAULT;
+
+		ret = rtdm_copy_from_user(fd, &cargs, src, sizeof(cargs));
+		if (ret)
+			return ret;
+
+		dst->addr = compat_ptr(cargs.addr);
+		dst->addrlen = cargs.addrlen;
+
+		return 0;
+	}
+#endif
+
+	if (!rtdm_read_user_ok(fd, src, sizeof(*dst)))
+		return -EFAULT;
+
+	return rtdm_copy_from_user(fd, dst, src, sizeof(*dst));
+}
+EXPORT_SYMBOL_GPL(rtdm_fd_get_setsockaddr_args);
+
+int rtdm_fd_get_setsockopt_args(struct rtdm_fd *fd,
+				struct _rtdm_setsockopt_args *dst,
+				const void *src)
+{
+
+#ifdef CONFIG_XENO_ARCH_SYS3264
+	if (rtdm_fd_is_compat(fd)) {
+		struct compat_rtdm_setsockopt_args cargs;
+		int ret;
+
+		if (!rtdm_read_user_ok(fd, src, sizeof(cargs)))
+			return -EFAULT;
+
+		ret = rtdm_copy_from_user(fd, &cargs, src, sizeof(cargs));
+		if (ret)
+			return ret;
+
+		dst->optlen = cargs.optlen;
+		dst->optval = compat_ptr(cargs.optval);
+		dst->optname = cargs.optname;
+		dst->level = cargs.level;
+
+		return 0;
+	}
+#endif
+
+	if (!rtdm_read_user_ok(fd, src, sizeof(*dst)))
+		return -EFAULT;
+
+	return rtdm_copy_from_user(fd, dst, src, sizeof(*dst));
+}
+EXPORT_SYMBOL_GPL(rtdm_fd_get_setsockopt_args);
+
+int rtdm_fd_get_iovec(struct rtdm_fd *fd, struct iovec *iov,
+		      const struct user_msghdr *msg, bool rw)
+{
+	size_t sz;
+
+#ifdef CONFIG_XENO_ARCH_SYS3264
+	sz = rtdm_fd_is_compat(fd) ? sizeof(struct compat_iovec) : sizeof(*iov);
+#else
+	sz = sizeof(*iov);
+#endif
+
+	sz *= msg->msg_iovlen;
+
+	if (!rw && !rtdm_read_user_ok(fd, msg->msg_iov, sz))
+		return -EFAULT;
+
+	if (rw && !rtdm_rw_user_ok(fd, msg->msg_iov, sz))
+		return -EFAULT;
+
+#ifdef CONFIG_XENO_ARCH_SYS3264
+	if (rtdm_fd_is_compat(fd))
+		return sys32_get_iovec(
+			iov, (struct compat_iovec __user *)msg->msg_iov,
+			(int)msg->msg_iovlen);
+#endif
+
+	return rtdm_copy_from_user(fd, iov, msg->msg_iov, sz);
+}
+EXPORT_SYMBOL_GPL(rtdm_fd_get_iovec);
+
+int rtdm_fd_put_iovec(struct rtdm_fd *fd, const struct iovec *iov,
+		      const struct user_msghdr *msg)
+{
+	size_t sz;
+
+#ifdef CONFIG_XENO_ARCH_SYS3264
+	sz = rtdm_fd_is_compat(fd) ? sizeof(struct compat_iovec) : sizeof(*iov);
+#else
+	sz = sizeof(*iov);
+#endif
+
+	sz *= msg->msg_iovlen;
+
+	if (!rtdm_rw_user_ok(fd, msg->msg_iov, sz))
+		return -EFAULT;
+
+#ifdef CONFIG_XENO_ARCH_SYS3264
+	if (rtdm_fd_is_compat(fd))
+		return sys32_put_iovec(
+			(struct compat_iovec __user *)msg->msg_iov, iov,
+			(int)msg->msg_iovlen);
+#endif
+
+	return rtdm_copy_to_user(fd, msg->msg_iov, iov, sz);
+}
+EXPORT_SYMBOL_GPL(rtdm_fd_put_iovec);
+
 static void destroy_fd(void *cookie, struct xnid *id)
 {
 	struct cobalt_ppd *p = cookie;
-- 
2.39.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [stable 3.2.x][PATCH 6/7] drivers/rtcan: Implement compat support for the rtcan driver
  2023-02-23  7:04 [stable 3.2.x][PATCH 0/7] Add full smokey compat support Florian Bezdeka
                   ` (4 preceding siblings ...)
  2023-02-23  7:04 ` [stable 3.2.x][PATCH 5/7] cobalt/rtdm/fd: Adding helpers for handling compat affected data structures Florian Bezdeka
@ 2023-02-23  7:04 ` Florian Bezdeka
  2023-02-23  7:04 ` [stable 3.2.x][PATCH 7/7] drivers/net/stack/ipv4/udp: Implement compat support for the udp driver Florian Bezdeka
  2023-02-23 17:50 ` [stable 3.2.x][PATCH 0/7] Add full smokey compat support Jan Kiszka
  7 siblings, 0 replies; 9+ messages in thread
From: Florian Bezdeka @ 2023-02-23  7:04 UTC (permalink / raw)
  To: xenomai; +Cc: jan.kiszka, Florian Bezdeka

[ This is a backport of 74478a4063ae5c3df7bfeb489eaefd0802179a5d ]

Once Xenomai was running as compat application (=32bit applicaiton over
64bit kernel) the can smokey test failed. This patch fixes the test by
implementing the necessary compat bits.

Affected ioctls:
  - _RTIOC_BIND
  - _RTIOC_SETSOCKOPT

Affected syscalls:
  - recvmsg
  - sendmsg

Signed-off-by: Florian Bezdeka <florian.bezdeka@siemens.com>
---
 kernel/drivers/can/rtcan_raw.c | 42 ++++++++++++++--------------------
 1 file changed, 17 insertions(+), 25 deletions(-)

diff --git a/kernel/drivers/can/rtcan_raw.c b/kernel/drivers/can/rtcan_raw.c
index b6b456939..441bfbc6d 100644
--- a/kernel/drivers/can/rtcan_raw.c
+++ b/kernel/drivers/can/rtcan_raw.c
@@ -41,6 +41,7 @@
 #include <rtdm/driver.h>
 
 #include <rtdm/can.h>
+#include <rtdm/compat.h>
 #include "rtcan_version.h"
 #include "rtcan_socket.h"
 #include "rtcan_list.h"
@@ -411,17 +412,15 @@ int rtcan_raw_ioctl(struct rtdm_fd *fd,
     int ret = 0;
 
     switch (request) {
-    case _RTIOC_BIND: {
+    COMPAT_CASE(_RTIOC_BIND): {
+
 	struct _rtdm_setsockaddr_args *setaddr, setaddr_buf;
 	struct sockaddr_can *sockaddr, sockaddr_buf;
 
 	if (rtdm_fd_is_user(fd)) {
-	    /* Copy argument structure from userspace */
-	    if (!rtdm_read_user_ok(fd, arg,
-				   sizeof(struct _rtdm_setsockaddr_args)) ||
-		rtdm_copy_from_user(fd, &setaddr_buf, arg,
-				    sizeof(struct _rtdm_setsockaddr_args)))
-		return -EFAULT;
+	    ret = rtdm_fd_get_setsockaddr_args(fd, &setaddr_buf, arg);
+	    if (ret)
+		return ret;
 
 	    setaddr = &setaddr_buf;
 
@@ -447,16 +446,14 @@ int rtcan_raw_ioctl(struct rtdm_fd *fd,
 	break;
     }
 
-    case _RTIOC_SETSOCKOPT: {
+    COMPAT_CASE(_RTIOC_SETSOCKOPT): {
 	struct _rtdm_setsockopt_args *setopt;
 	struct _rtdm_setsockopt_args setopt_buf;
 
 	if (rtdm_fd_is_user(fd)) {
-	    if (!rtdm_read_user_ok(fd, arg,
-				   sizeof(struct _rtdm_setsockopt_args)) ||
-		rtdm_copy_from_user(fd, &setopt_buf, arg,
-				    sizeof(struct _rtdm_setsockopt_args)))
-		return -EFAULT;
+	    ret = rtdm_fd_get_setsockopt_args(fd, &setopt_buf, arg);
+	    if (ret)
+		    return ret;
 
 	    setopt = &setopt_buf;
 	} else
@@ -575,11 +572,9 @@ ssize_t rtcan_raw_recvmsg(struct rtdm_fd *fd,
 
     if (rtdm_fd_is_user(fd)) {
 	/* Copy IO vector from userspace */
-	if (!rtdm_rw_user_ok(fd, msg->msg_iov,
-			     sizeof(struct iovec)) ||
-	    rtdm_copy_from_user(fd, &iov_buf, msg->msg_iov,
-				sizeof(struct iovec)))
-	    return -EFAULT;
+	ret = rtdm_fd_get_iovec(fd, &iov_buf, msg, true);
+	if (ret)
+		return -EFAULT;
 
 	iov = &iov_buf;
     }
@@ -716,9 +711,9 @@ ssize_t rtcan_raw_recvmsg(struct rtdm_fd *fd,
 	iov->iov_base += sizeof(can_frame_t);
 	iov->iov_len -= sizeof(can_frame_t);
 	/* ... and copy it, too. */
-	if (rtdm_copy_to_user(fd, msg->msg_iov, iov,
-			      sizeof(struct iovec)))
-	    return -EFAULT;
+	ret = rtdm_fd_put_iovec(fd, iov, msg);
+	if (ret)
+		return -EFAULT;
 
 	/* Copy timestamp if existent and wanted */
 	if (msg->msg_controllen) {
@@ -832,10 +827,7 @@ ssize_t rtcan_raw_sendmsg(struct rtdm_fd *fd,
 
     if (rtdm_fd_is_user(fd)) {
 	/* Copy IO vector from userspace */
-	if (!rtdm_rw_user_ok(fd, msg->msg_iov,
-			     sizeof(struct iovec)) ||
-	    rtdm_copy_from_user(fd, &iov_buf, msg->msg_iov,
-				sizeof(struct iovec)))
+	if (rtdm_fd_get_iovec(fd, &iov_buf, msg, false))
 	    return -EFAULT;
 
 	iov = &iov_buf;
-- 
2.39.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [stable 3.2.x][PATCH 7/7] drivers/net/stack/ipv4/udp: Implement compat support for the udp driver
  2023-02-23  7:04 [stable 3.2.x][PATCH 0/7] Add full smokey compat support Florian Bezdeka
                   ` (5 preceding siblings ...)
  2023-02-23  7:04 ` [stable 3.2.x][PATCH 6/7] drivers/rtcan: Implement compat support for the rtcan driver Florian Bezdeka
@ 2023-02-23  7:04 ` Florian Bezdeka
  2023-02-23 17:50 ` [stable 3.2.x][PATCH 0/7] Add full smokey compat support Jan Kiszka
  7 siblings, 0 replies; 9+ messages in thread
From: Florian Bezdeka @ 2023-02-23  7:04 UTC (permalink / raw)
  To: xenomai; +Cc: jan.kiszka, Florian Bezdeka

The rtnet interface was lacking compat support for the following ioctl
commands:
  - _RTIOC_BIND
  - _RTIOC_CONNECT

This patch is heavily inspired by Konstantin's proposal but migrated
to some rtnet APIs that allow us to stay away from
  #ifdef CONFIG_XENO_ARCH_SYS3264
sections.

Signed-off-by: Florian Bezdeka <florian.bezdeka@siemens.com>
---
 kernel/drivers/net/stack/ipv4/udp/udp.c | 29 ++++++++++++++-----------
 1 file changed, 16 insertions(+), 13 deletions(-)

diff --git a/kernel/drivers/net/stack/ipv4/udp/udp.c b/kernel/drivers/net/stack/ipv4/udp/udp.c
index 5977a3bc2..777c8a27a 100644
--- a/kernel/drivers/net/stack/ipv4/udp/udp.c
+++ b/kernel/drivers/net/stack/ipv4/udp/udp.c
@@ -31,6 +31,7 @@
 #include <linux/tcp.h>
 #include <linux/list.h>
 
+#include <rtdm/compat.h>
 #include <rtskb.h>
 #include <rtnet_internal.h>
 #include <rtnet_checksum.h>
@@ -355,25 +356,27 @@ void rt_udp_close(struct rtdm_fd *fd)
 int rt_udp_ioctl(struct rtdm_fd *fd, unsigned int request, void __user *arg)
 {
 	struct rtsocket *sock = rtdm_fd_to_private(fd);
-	const struct _rtdm_setsockaddr_args *setaddr;
-	struct _rtdm_setsockaddr_args _setaddr;
+	struct _rtdm_setsockaddr_args args;
+	bool do_bind = false;
+	int ret;
 
 	/* fast path for common socket IOCTLs */
 	if (_IOC_TYPE(request) == RTIOC_TYPE_NETWORK)
 		return rt_socket_common_ioctl(fd, request, arg);
 
 	switch (request) {
-	case _RTIOC_BIND:
-	case _RTIOC_CONNECT:
-		setaddr = rtnet_get_arg(fd, &_setaddr, arg, sizeof(_setaddr));
-		if (IS_ERR(setaddr))
-			return PTR_ERR(setaddr);
-		if (request == _RTIOC_BIND)
-			return rt_udp_bind(fd, sock, setaddr->addr,
-					   setaddr->addrlen);
-
-		return rt_udp_connect(fd, sock, setaddr->addr,
-				      setaddr->addrlen);
+	COMPAT_CASE(_RTIOC_BIND):
+		do_bind = true;
+		fallthrough;
+	COMPAT_CASE(_RTIOC_CONNECT):
+		ret = rtdm_fd_get_setsockaddr_args(fd, &args, arg);
+		if (ret)
+			return ret;
+
+		if (do_bind)
+			return rt_udp_bind(fd, sock, args.addr, args.addrlen);
+
+		return rt_udp_connect(fd, sock, args.addr, args.addrlen);
 
 	default:
 		return rt_ip_ioctl(fd, request, arg);
-- 
2.39.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [stable 3.2.x][PATCH 0/7] Add full smokey compat support
  2023-02-23  7:04 [stable 3.2.x][PATCH 0/7] Add full smokey compat support Florian Bezdeka
                   ` (6 preceding siblings ...)
  2023-02-23  7:04 ` [stable 3.2.x][PATCH 7/7] drivers/net/stack/ipv4/udp: Implement compat support for the udp driver Florian Bezdeka
@ 2023-02-23 17:50 ` Jan Kiszka
  7 siblings, 0 replies; 9+ messages in thread
From: Jan Kiszka @ 2023-02-23 17:50 UTC (permalink / raw)
  To: Florian Bezdeka, xenomai

On 23.02.23 08:04, Florian Bezdeka wrote:
> Hi all,
> 
> an internal customer detected some testing issues in the stable 3.2.x
> branch. All of them were directly related to compat support.
> 
> With this series applied the complete smokey testsuite can be run in
> compat mode without any issues. Patch 6 needed a backport (can driver
> got a refactoring in next/master), all other patches were taken from
> next/master without any modifications.
> 
> The failing testsuite looked like this:
> 
> /usr/lib/xenomai/testsuite/smokey --run \
>                                   --keep-going \
>                                   random_alloc_rounds=64
>                                   pattern_check_rounds=64
> dlopen OK
> syscall-tests.c:712, assertion failed: !ret
> xddp OK
> vdso_access OK
> tsc OK
> timerfd OK
> sigdebug OK
> setsched OK
> sched_tp OK
> sched_quota OK
> rtdm OK
> posix_select OK
> posix_mutex OK
> posix_fork OK
> posix_cond OK
> posix_clock OK
> setup.c:96, ioctl(fd, IOC_RT_IFINFO, &cmd): Inappropriate ioctl for device
> setup.c:96, ioctl(fd, IOC_RT_IFINFO, &cmd): Inappropriate ioctl for device
> setup.c:96, ioctl(fd, IOC_RT_IFINFO, &cmd): Inappropriate ioctl for device
> memory_tlsf OK
> memory_heapmem OK
> memory_coreheap OK
> leaks OK
> iddp OK
> gdb OK
> fpu_stress OK
> cpu_affinity OK
> bufp OK
> arith OK
> start_timesyncd
> false
> child 269 returned: exited with status 1
> 
> Best regards,
> Florian
> 
> Florian Bezdeka (7):
>   y2038: posix/mqueue: Fix compat case for mq_timedreceive64
>   y2038: cobalt: rtdm/fd: Take care of compat mode for recvmmsg64
>   y2038: cobalt: posix/signal: Take care of compat mode for
>     sigtimedwait64
>   rtnet: Enable compat ioctl interface
>   cobalt/rtdm/fd: Adding helpers for handling compat affected data
>     structures
>   drivers/rtcan: Implement compat support for the rtcan driver
>   drivers/net/stack/ipv4/udp: Implement compat support for the udp
>     driver
> 
>  include/cobalt/kernel/rtdm/fd.h               |  16 +++
>  .../x86/include/asm/xenomai/syscall32-table.h |   3 +
>  kernel/cobalt/posix/mqueue.c                  |  26 ++--
>  kernel/cobalt/posix/mqueue.h                  |   2 +-
>  kernel/cobalt/posix/syscall32.c               |  17 ++-
>  kernel/cobalt/posix/syscall32.h               |   3 +-
>  kernel/cobalt/rtdm/drvlib.c                   |  17 +--
>  kernel/cobalt/rtdm/fd.c                       | 122 ++++++++++++++++++
>  kernel/drivers/can/rtcan_raw.c                |  42 +++---
>  kernel/drivers/net/stack/ipv4/udp/udp.c       |  29 +++--
>  kernel/drivers/net/stack/rtnet_chrdev.c       |   1 +
>  11 files changed, 208 insertions(+), 70 deletions(-)
> 

Thanks, applied to stable/v3.2.x.

Jan

-- 
Siemens AG, Technology
Competence Center Embedded Linux


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2023-02-23 17:50 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-23  7:04 [stable 3.2.x][PATCH 0/7] Add full smokey compat support Florian Bezdeka
2023-02-23  7:04 ` [stable 3.2.x][PATCH 1/7] y2038: posix/mqueue: Fix compat case for mq_timedreceive64 Florian Bezdeka
2023-02-23  7:04 ` [stable 3.2.x][PATCH 2/7] y2038: cobalt: rtdm/fd: Take care of compat mode for recvmmsg64 Florian Bezdeka
2023-02-23  7:04 ` [stable 3.2.x][PATCH 3/7] y2038: cobalt: posix/signal: Take care of compat mode for sigtimedwait64 Florian Bezdeka
2023-02-23  7:04 ` [stable 3.2.x][PATCH 4/7] rtnet: Enable compat ioctl interface Florian Bezdeka
2023-02-23  7:04 ` [stable 3.2.x][PATCH 5/7] cobalt/rtdm/fd: Adding helpers for handling compat affected data structures Florian Bezdeka
2023-02-23  7:04 ` [stable 3.2.x][PATCH 6/7] drivers/rtcan: Implement compat support for the rtcan driver Florian Bezdeka
2023-02-23  7:04 ` [stable 3.2.x][PATCH 7/7] drivers/net/stack/ipv4/udp: Implement compat support for the udp driver Florian Bezdeka
2023-02-23 17:50 ` [stable 3.2.x][PATCH 0/7] Add full smokey compat support Jan Kiszka

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).