Module Name: src Committed By: christos Date: Mon Jul 1 01:35:53 UTC 2024
Modified Files: src/sys/compat/linux/arch/aarch64: syscalls.master src/sys/compat/linux/arch/alpha: syscalls.master src/sys/compat/linux/arch/amd64: syscalls.master src/sys/compat/linux/arch/arm: syscalls.master src/sys/compat/linux/arch/i386: syscalls.master src/sys/compat/linux/arch/m68k: syscalls.master src/sys/compat/linux/arch/mips: syscalls.master src/sys/compat/linux/arch/powerpc: syscalls.master src/sys/compat/linux/common: linux_mod.c linux_types.h src/sys/kern: sys_mqueue.c src/sys/miscfs/procfs: procfs.h procfs_linux.c procfs_subr.c procfs_vfsops.c procfs_vnops.c src/sys/modules/compat_linux: Makefile Added Files: src/sys/compat/linux/common: linux_mqueue.c linux_mqueue.h Log Message: Add linux POSIX message queue support (Ricardo Branco) To generate a diff of this commit: cvs rdiff -u -r1.12 -r1.13 src/sys/compat/linux/arch/aarch64/syscalls.master cvs rdiff -u -r1.107 -r1.108 src/sys/compat/linux/arch/alpha/syscalls.master cvs rdiff -u -r1.73 -r1.74 src/sys/compat/linux/arch/amd64/syscalls.master cvs rdiff -u -r1.80 -r1.81 src/sys/compat/linux/arch/arm/syscalls.master cvs rdiff -u -r1.135 -r1.136 src/sys/compat/linux/arch/i386/syscalls.master cvs rdiff -u -r1.105 -r1.106 src/sys/compat/linux/arch/m68k/syscalls.master cvs rdiff -u -r1.80 -r1.81 src/sys/compat/linux/arch/mips/syscalls.master cvs rdiff -u -r1.85 -r1.86 src/sys/compat/linux/arch/powerpc/syscalls.master cvs rdiff -u -r1.15 -r1.16 src/sys/compat/linux/common/linux_mod.c cvs rdiff -u -r0 -r1.1 src/sys/compat/linux/common/linux_mqueue.c \ src/sys/compat/linux/common/linux_mqueue.h cvs rdiff -u -r1.33 -r1.34 src/sys/compat/linux/common/linux_types.h cvs rdiff -u -r1.48 -r1.49 src/sys/kern/sys_mqueue.c cvs rdiff -u -r1.86 -r1.87 src/sys/miscfs/procfs/procfs.h cvs rdiff -u -r1.88 -r1.89 src/sys/miscfs/procfs/procfs_linux.c cvs rdiff -u -r1.119 -r1.120 src/sys/miscfs/procfs/procfs_subr.c cvs rdiff -u -r1.116 -r1.117 src/sys/miscfs/procfs/procfs_vfsops.c cvs rdiff -u -r1.232 -r1.233 src/sys/miscfs/procfs/procfs_vnops.c cvs rdiff -u -r1.7 -r1.8 src/sys/modules/compat_linux/Makefile Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/linux/arch/aarch64/syscalls.master diff -u src/sys/compat/linux/arch/aarch64/syscalls.master:1.12 src/sys/compat/linux/arch/aarch64/syscalls.master:1.13 --- src/sys/compat/linux/arch/aarch64/syscalls.master:1.12 Sat Jun 29 09:46:09 2024 +++ src/sys/compat/linux/arch/aarch64/syscalls.master Sun Jun 30 21:35:52 2024 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.12 2024/06/29 13:46:09 christos Exp $ + $NetBSD: syscalls.master,v 1.13 2024/07/01 01:35:52 christos Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -63,6 +63,7 @@ #include <compat/linux/common/linux_shm.h> #include <compat/linux/common/linux_siginfo.h> #include <compat/linux/common/linux_signal.h> +#include <compat/linux/common/linux_mqueue.h> #include <compat/linux/linux_syscallargs.h> @@ -362,12 +363,23 @@ 177 NOARGS { gid_t|sys||getegid(void); } 178 STD { pid_t|linux_sys||gettid(void); } 179 STD { int|linux_sys||sysinfo(struct linux_sysinfo *arg); } -180 UNIMPL mq_open -181 UNIMPL mq_unlink -182 UNIMPL mq_timedsend -183 UNIMPL mq_timedreceive -184 UNIMPL mq_notify -185 UNIMPL mq_getsetattr +180 STD { linux_mqd_t|linux_sys||mq_open(const char *name, \ + int oflag, linux_umode_t mode, \ + struct linux_mq_attr *attr); } +181 STD { int|linux_sys||mq_unlink(const char *name); } +182 STD { int|linux_sys||mq_timedsend(linux_mqd_t mqdes, \ + const char *msg_ptr, size_t msg_len, \ + unsigned int msg_prio, \ + const struct linux_timespec *abs_timeout); } +183 STD { ssize_t|linux_sys||mq_timedreceive(linux_mqd_t mqdes, \ + char *msg_ptr, size_t msg_len, \ + unsigned int *msg_prio, \ + const struct linux_timespec *abs_timeout); } +184 STD { int|linux_sys||mq_notify(linux_mqd_t mqdes, \ + const struct linux_sigevent *sevp); } +185 STD { int|linux_sys||mq_getsetattr(linux_mqd_t mqdes, \ + const struct linux_mq_attr *newattr, \ + struct linux_mq_attr *oldattr); } #ifdef SYSVMSG 186 NOARGS { int|sys||msgget(key_t key, int msgflg); } 187 NOARGS { int|linux_sys||msgctl(int msqid, int cmd, \ Index: src/sys/compat/linux/arch/alpha/syscalls.master diff -u src/sys/compat/linux/arch/alpha/syscalls.master:1.107 src/sys/compat/linux/arch/alpha/syscalls.master:1.108 --- src/sys/compat/linux/arch/alpha/syscalls.master:1.107 Sat Jun 29 09:46:09 2024 +++ src/sys/compat/linux/arch/alpha/syscalls.master Sun Jun 30 21:35:52 2024 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.107 2024/06/29 13:46:09 christos Exp $ + $NetBSD: syscalls.master,v 1.108 2024/07/01 01:35:52 christos Exp $ ; ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -76,7 +76,8 @@ #include <compat/linux/common/linux_sem.h> #include <compat/linux/common/linux_shm.h> #include <compat/linux/common/linux_mmap.h> -;#include <compat/linux/common/linux_machdep.h> +#include <compat/linux/common/linux_machdep.h> +#include <compat/linux/common/linux_mqueue.h> #include <compat/linux/linux_syscallargs.h> #include <compat/linux/arch/alpha/linux_osf1.h> @@ -698,12 +699,23 @@ 429 UNIMPL mbind 430 UNIMPL get_mempolicy 431 UNIMPL set_mempolicy -432 UNIMPL mq_open -433 UNIMPL mq_unlink -434 UNIMPL mq_timedsend -435 UNIMPL mq_timedreceive -436 UNIMPL mq_notify -437 UNIMPL mq_getsetattr +432 STD { linux_mqd_t|linux_sys||mq_open(const char *name, \ + int oflag, linux_umode_t mode, \ + struct linux_mq_attr *attr); } +433 STD { int|linux_sys||mq_unlink(const char *name); } +434 STD { int|linux_sys||mq_timedsend(linux_mqd_t mqdes, \ + const char *msg_ptr, size_t msg_len, \ + unsigned int msg_prio, \ + const struct linux_timespec *abs_timeout); } +435 STD { ssize_t|linux_sys||mq_timedreceive(linux_mqd_t mqdes, \ + char *msg_ptr, size_t msg_len, \ + unsigned int *msg_prio, \ + const struct linux_timespec *abs_timeout); } +436 STD { int|linux_sys||mq_notify(linux_mqd_t mqdes, \ + const struct linux_sigevent *sevp); } +437 STD { int|linux_sys||mq_getsetattr(linux_mqd_t mqdes, \ + const struct linux_mq_attr *newattr, \ + struct linux_mq_attr *oldattr); } 438 STD { int|linux_sys||waitid(int idtype, id_t id, \ linux_siginfo_t *infop, int options, \ struct rusage50 *rusage); } Index: src/sys/compat/linux/arch/amd64/syscalls.master diff -u src/sys/compat/linux/arch/amd64/syscalls.master:1.73 src/sys/compat/linux/arch/amd64/syscalls.master:1.74 --- src/sys/compat/linux/arch/amd64/syscalls.master:1.73 Sat Jun 29 09:46:09 2024 +++ src/sys/compat/linux/arch/amd64/syscalls.master Sun Jun 30 21:35:52 2024 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.73 2024/06/29 13:46:09 christos Exp $ + $NetBSD: syscalls.master,v 1.74 2024/07/01 01:35:52 christos Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -60,6 +60,7 @@ #include <compat/linux/common/linux_shm.h> #include <compat/linux/common/linux_signal.h> #include <compat/linux/common/linux_siginfo.h> +#include <compat/linux/common/linux_mqueue.h> #include <compat/linux/common/linux_machdep.h> #include <compat/linux/linux_syscallargs.h> @@ -457,12 +458,23 @@ 237 UNIMPL mbind 238 UNIMPL set_mempolicy 239 UNIMPL get_mempolicy -240 UNIMPL mq_open -241 UNIMPL mq_unlink -242 UNIMPL mq_timedsend -243 UNIMPL mq_timedreceive -244 UNIMPL mq_notify -245 UNIMPL mq_getsetattr +240 STD { linux_mqd_t|linux_sys||mq_open(const char *name, \ + int oflag, linux_umode_t mode, \ + struct linux_mq_attr *attr); } +241 STD { int|linux_sys||mq_unlink(const char *name); } +242 STD { int|linux_sys||mq_timedsend(linux_mqd_t mqdes, \ + const char *msg_ptr, size_t msg_len, \ + unsigned int msg_prio, \ + const struct linux_timespec *abs_timeout); } +243 STD { ssize_t|linux_sys||mq_timedreceive(linux_mqd_t mqdes, \ + char *msg_ptr, size_t msg_len, \ + unsigned int *msg_prio, \ + const struct linux_timespec *abs_timeout); } +244 STD { int|linux_sys||mq_notify(linux_mqd_t mqdes, \ + const struct linux_sigevent *sevp); } +245 STD { int|linux_sys||mq_getsetattr(linux_mqd_t mqdes, \ + const struct linux_mq_attr *newattr, \ + struct linux_mq_attr *oldattr); } 246 UNIMPL kexec_load 247 STD { int|linux_sys||waitid(int idtype, id_t id, \ linux_siginfo_t *infop, int options, \ Index: src/sys/compat/linux/arch/arm/syscalls.master diff -u src/sys/compat/linux/arch/arm/syscalls.master:1.80 src/sys/compat/linux/arch/arm/syscalls.master:1.81 --- src/sys/compat/linux/arch/arm/syscalls.master:1.80 Sat Jun 29 09:46:09 2024 +++ src/sys/compat/linux/arch/arm/syscalls.master Sun Jun 30 21:35:52 2024 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.80 2024/06/29 13:46:09 christos Exp $ + $NetBSD: syscalls.master,v 1.81 2024/07/01 01:35:52 christos Exp $ ; Derived from sys/compat/linux/arch/*/syscalls.master ; and from Linux 2.4.12 arch/arm/kernel/calls.S @@ -48,6 +48,7 @@ #include <compat/linux/common/linux_signal.h> #include <compat/linux/common/linux_siginfo.h> #include <compat/linux/common/linux_machdep.h> +#include <compat/linux/common/linux_mqueue.h> #include <compat/linux/common/linux_sched.h> @@ -467,12 +468,23 @@ 271 UNIMPL pciconfig_iobase 272 UNIMPL pciconfig_read 273 UNIMPL pciconfig_write -274 UNIMPL mq_open -275 UNIMPL mq_unlink -276 UNIMPL mq_timedsend -277 UNIMPL mq_timedreceive -278 UNIMPL mq_notify -279 UNIMPL mq_getsetattr +274 STD { linux_mqd_t|linux_sys||mq_open(const char *name, \ + int oflag, linux_umode_t mode, \ + struct linux_mq_attr *attr); } +275 STD { int|linux_sys||mq_unlink(const char *name); } +276 STD { int|linux_sys||mq_timedsend(linux_mqd_t mqdes, \ + const char *msg_ptr, size_t msg_len, \ + unsigned int msg_prio, \ + const struct linux_timespec *abs_timeout); } +277 STD { ssize_t|linux_sys||mq_timedreceive(linux_mqd_t mqdes, \ + char *msg_ptr, size_t msg_len, \ + unsigned int *msg_prio, \ + const struct linux_timespec *abs_timeout); } +278 STD { int|linux_sys||mq_notify(linux_mqd_t mqdes, \ + const struct linux_sigevent *sevp); } +279 STD { int|linux_sys||mq_getsetattr(linux_mqd_t mqdes, \ + const struct linux_mq_attr *newattr, \ + struct linux_mq_attr *oldattr); } 280 STD { int|linux_sys||waitid(int idtype, id_t id, \ linux_siginfo_t *infop, int options, \ struct rusage50 *rusage); } Index: src/sys/compat/linux/arch/i386/syscalls.master diff -u src/sys/compat/linux/arch/i386/syscalls.master:1.135 src/sys/compat/linux/arch/i386/syscalls.master:1.136 --- src/sys/compat/linux/arch/i386/syscalls.master:1.135 Sat Jun 29 09:46:09 2024 +++ src/sys/compat/linux/arch/i386/syscalls.master Sun Jun 30 21:35:53 2024 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.135 2024/06/29 13:46:09 christos Exp $ + $NetBSD: syscalls.master,v 1.136 2024/07/01 01:35:53 christos Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -47,6 +47,7 @@ #include <compat/linux/common/linux_signal.h> #include <compat/linux/common/linux_siginfo.h> #include <compat/linux/common/linux_machdep.h> +#include <compat/linux/common/linux_mqueue.h> #include <compat/linux/common/linux_sched.h> #include <compat/linux/linux_syscallargs.h> @@ -469,12 +470,23 @@ 274 UNIMPL mbind 275 UNIMPL get_mempolicy 276 UNIMPL set_mempolicy -277 UNIMPL mq_open -278 UNIMPL mq_unlink -279 UNIMPL mq_timedsend -280 UNIMPL mq_timedreceive -281 UNIMPL mq_notify -282 UNIMPL mq_getsetattr +277 STD { linux_mqd_t|linux_sys||mq_open(const char *name, \ + int oflag, linux_umode_t mode, \ + struct linux_mq_attr *attr); } +278 STD { int|linux_sys||mq_unlink(const char *name); } +279 STD { int|linux_sys||mq_timedsend(linux_mqd_t mqdes, \ + const char *msg_ptr, size_t msg_len, \ + unsigned int msg_prio, \ + const struct linux_timespec *abs_timeout); } +280 STD { ssize_t|linux_sys||mq_timedreceive(linux_mqd_t mqdes, \ + char *msg_ptr, size_t msg_len, \ + unsigned int *msg_prio, \ + const struct linux_timespec *abs_timeout); } +281 STD { int|linux_sys||mq_notify(linux_mqd_t mqdes, \ + const struct linux_sigevent *sevp); } +282 STD { int|linux_sys||mq_getsetattr(linux_mqd_t mqdes, \ + const struct linux_mq_attr *newattr, \ + struct linux_mq_attr *oldattr); } 283 UNIMPL sys_kexec_load 284 STD { int|linux_sys||waitid(int idtype, id_t id, \ linux_siginfo_t *infop, int options, \ Index: src/sys/compat/linux/arch/m68k/syscalls.master diff -u src/sys/compat/linux/arch/m68k/syscalls.master:1.105 src/sys/compat/linux/arch/m68k/syscalls.master:1.106 --- src/sys/compat/linux/arch/m68k/syscalls.master:1.105 Sat Jun 29 09:46:10 2024 +++ src/sys/compat/linux/arch/m68k/syscalls.master Sun Jun 30 21:35:53 2024 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.105 2024/06/29 13:46:10 christos Exp $ + $NetBSD: syscalls.master,v 1.106 2024/07/01 01:35:53 christos Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -51,6 +51,7 @@ #include <compat/linux/common/linux_siginfo.h> #include <compat/linux/common/linux_machdep.h> #include <compat/linux/common/linux_mmap.h> +#include <compat/linux/common/linux_mqueue.h> #include <compat/linux/common/linux_sched.h> #include <compat/linux/linux_syscallargs.h> @@ -478,12 +479,23 @@ 268 UNIMPL mbind 269 UNIMPL get_mempolicy 270 UNIMPL set_mempolicy -271 UNIMPL mq_open -272 UNIMPL mq_unlink -273 UNIMPL mq_timedsend -274 UNIMPL mq_timedreceive -275 UNIMPL mq_notify -276 UNIMPL mq_getsetattr +271 STD { linux_mqd_t|linux_sys||mq_open(const char *name, \ + int oflag, linux_umode_t mode, \ + struct linux_mq_attr *attr); } +272 STD { int|linux_sys||mq_unlink(const char *name); } +273 STD { int|linux_sys||mq_timedsend(linux_mqd_t mqdes, \ + const char *msg_ptr, size_t msg_len, \ + unsigned int msg_prio, \ + const struct linux_timespec *abs_timeout); } +274 STD { ssize_t|linux_sys||mq_timedreceive(linux_mqd_t mqdes, \ + char *msg_ptr, size_t msg_len, \ + unsigned int *msg_prio, \ + const struct linux_timespec *abs_timeout); } +275 STD { int|linux_sys||mq_notify(linux_mqd_t mqdes, \ + const struct linux_sigevent *sevp); } +276 STD { int|linux_sys||mq_getsetattr(linux_mqd_t mqdes, \ + const struct linux_mq_attr *newattr, \ + struct linux_mq_attr *oldattr); } 277 UNIMPL waitid 278 UNIMPL vserver 279 UNIMPL add_key Index: src/sys/compat/linux/arch/mips/syscalls.master diff -u src/sys/compat/linux/arch/mips/syscalls.master:1.80 src/sys/compat/linux/arch/mips/syscalls.master:1.81 --- src/sys/compat/linux/arch/mips/syscalls.master:1.80 Sat Jun 29 09:46:10 2024 +++ src/sys/compat/linux/arch/mips/syscalls.master Sun Jun 30 21:35:53 2024 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.80 2024/06/29 13:46:10 christos Exp $ + $NetBSD: syscalls.master,v 1.81 2024/07/01 01:35:53 christos Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -52,6 +52,7 @@ #include <compat/linux/common/linux_siginfo.h> #include <compat/linux/common/linux_machdep.h> #include <compat/linux/common/linux_mmap.h> +#include <compat/linux/common/linux_mqueue.h> #include <compat/linux/common/linux_socketcall.h> #include <compat/linux/common/linux_sched.h> @@ -468,12 +469,23 @@ 268 UNIMPL mbind 269 UNIMPL get_mempolicy 270 UNIMPL set_mempolicy -271 UNIMPL mq_open -272 UNIMPL mq_unlink -273 UNIMPL mq_timedsend -274 UNIMPL mq_timedreceive -275 UNIMPL mq_notify -276 UNIMPL mq_getsetattr +271 STD { linux_mqd_t|linux_sys||mq_open(const char *name, \ + int oflag, linux_umode_t mode, \ + struct linux_mq_attr *attr); } +272 STD { int|linux_sys||mq_unlink(const char *name); } +273 STD { int|linux_sys||mq_timedsend(linux_mqd_t mqdes, \ + const char *msg_ptr, size_t msg_len, \ + unsigned int msg_prio, \ + const struct linux_timespec *abs_timeout); } +274 STD { ssize_t|linux_sys||mq_timedreceive(linux_mqd_t mqdes, \ + char *msg_ptr, size_t msg_len, \ + unsigned int *msg_prio, \ + const struct linux_timespec *abs_timeout); } +275 STD { int|linux_sys||mq_notify(linux_mqd_t mqdes, \ + const struct linux_sigevent *sevp); } +276 STD { int|linux_sys||mq_getsetattr(linux_mqd_t mqdes, \ + const struct linux_mq_attr *newattr, \ + struct linux_mq_attr *oldattr); } 277 UNIMPL vserve 278 STD { int|linux_sys||waitid(int idtype, id_t id, \ linux_siginfo_t *infop, int options, \ Index: src/sys/compat/linux/arch/powerpc/syscalls.master diff -u src/sys/compat/linux/arch/powerpc/syscalls.master:1.85 src/sys/compat/linux/arch/powerpc/syscalls.master:1.86 --- src/sys/compat/linux/arch/powerpc/syscalls.master:1.85 Sat Jun 29 09:46:10 2024 +++ src/sys/compat/linux/arch/powerpc/syscalls.master Sun Jun 30 21:35:53 2024 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.85 2024/06/29 13:46:10 christos Exp $ + $NetBSD: syscalls.master,v 1.86 2024/07/01 01:35:53 christos Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -74,6 +74,7 @@ #include <compat/linux/common/linux_siginfo.h> #include <compat/linux/common/linux_machdep.h> #include <compat/linux/common/linux_mmap.h> +#include <compat/linux/common/linux_mqueue.h> #include <compat/linux/common/linux_sched.h> #include <compat/linux/linux_syscallargs.h> @@ -469,12 +470,23 @@ 259 UNIMPL /* reserved for new sys_mbind */ 260 UNIMPL /* reserved for new sys_get_mempolicy */ 261 UNIMPL /* reserved for new sys_set_mempolicy */ -262 UNIMPL mq_open -263 UNIMPL mq_unlink -264 UNIMPL mq_timedsend -265 UNIMPL mq_timedreceive -266 UNIMPL mq_notify -267 UNIMPL mq_getsetattr +262 STD { linux_mqd_t|linux_sys||mq_open(const char *name, \ + int oflag, linux_umode_t mode, \ + struct linux_mq_attr *attr); } +263 STD { int|linux_sys||mq_unlink(const char *name); } +264 STD { int|linux_sys||mq_timedsend(linux_mqd_t mqdes, \ + const char *msg_ptr, size_t msg_len, \ + unsigned int msg_prio, \ + const struct linux_timespec *abs_timeout); } +265 STD { ssize_t|linux_sys||mq_timedreceive(linux_mqd_t mqdes, \ + char *msg_ptr, size_t msg_len, \ + unsigned int *msg_prio, \ + const struct linux_timespec *abs_timeout); } +266 STD { int|linux_sys||mq_notify(linux_mqd_t mqdes, \ + const struct linux_sigevent *sevp); } +267 STD { int|linux_sys||mq_getsetattr(linux_mqd_t mqdes, \ + const struct linux_mq_attr *newattr, \ + struct linux_mq_attr *oldattr); } 268 UNIMPL kexec_load 269 UNIMPL add_key 270 UNIMPL request_key Index: src/sys/compat/linux/common/linux_mod.c diff -u src/sys/compat/linux/common/linux_mod.c:1.15 src/sys/compat/linux/common/linux_mod.c:1.16 --- src/sys/compat/linux/common/linux_mod.c:1.15 Sat Aug 19 13:57:54 2023 +++ src/sys/compat/linux/common/linux_mod.c Sun Jun 30 21:35:53 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_mod.c,v 1.15 2023/08/19 17:57:54 christos Exp $ */ +/* $NetBSD: linux_mod.c,v 1.16 2024/07/01 01:35:53 christos Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_mod.c,v 1.15 2023/08/19 17:57:54 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_mod.c,v 1.16 2024/07/01 01:35:53 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_execfmt.h" @@ -66,7 +66,7 @@ __KERNEL_RCSID(0, "$NetBSD: linux_mod.c, # define MD3 "" #endif -#define REQ1 "compat_ossaudio,sysv_ipc,compat_util" +#define REQ1 "compat_ossaudio,sysv_ipc,mqueue,compat_util" #define REQ2 ",compat_50,compat_43" MODULE(MODULE_CLASS_EXEC, compat_linux, REQ1 REQ2 MD1 MD2 MD3); Index: src/sys/compat/linux/common/linux_types.h diff -u src/sys/compat/linux/common/linux_types.h:1.33 src/sys/compat/linux/common/linux_types.h:1.34 --- src/sys/compat/linux/common/linux_types.h:1.33 Wed Nov 24 21:27:08 2021 +++ src/sys/compat/linux/common/linux_types.h Sun Jun 30 21:35:53 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_types.h,v 1.33 2021/11/25 02:27:08 ryo Exp $ */ +/* $NetBSD: linux_types.h,v 1.34 2024/07/01 01:35:53 christos Exp $ */ /*- * Copyright (c) 1995, 1998 The NetBSD Foundation, Inc. @@ -58,6 +58,8 @@ typedef unsigned short linux_gid16_t; typedef unsigned short linux_uid16_t; typedef unsigned short linux_umode_t; +typedef long linux_mqd_t; + /* * From Linux include/asm-.../posix_types.h */ Index: src/sys/kern/sys_mqueue.c diff -u src/sys/kern/sys_mqueue.c:1.48 src/sys/kern/sys_mqueue.c:1.49 --- src/sys/kern/sys_mqueue.c:1.48 Sat May 23 19:42:43 2020 +++ src/sys/kern/sys_mqueue.c Sun Jun 30 21:35:53 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_mqueue.c,v 1.48 2020/05/23 23:42:43 ad Exp $ */ +/* $NetBSD: sys_mqueue.c,v 1.49 2024/07/01 01:35:53 christos Exp $ */ /* * Copyright (c) 2007-2011 Mindaugas Rasiukevicius <rmind at NetBSD org> @@ -43,7 +43,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_mqueue.c,v 1.48 2020/05/23 23:42:43 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_mqueue.c,v 1.49 2024/07/01 01:35:53 christos Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -70,11 +70,11 @@ __KERNEL_RCSID(0, "$NetBSD: sys_mqueue.c MODULE(MODULE_CLASS_MISC, mqueue, NULL); /* System-wide limits. */ -static u_int mq_open_max = MQ_OPEN_MAX; -static u_int mq_prio_max = MQ_PRIO_MAX; -static u_int mq_max_msgsize = 16 * MQ_DEF_MSGSIZE; -static u_int mq_def_maxmsg = 32; -static u_int mq_max_maxmsg = 16 * 32; +u_int mq_open_max = MQ_OPEN_MAX; +static u_int mq_prio_max = MQ_PRIO_MAX; +u_int mq_max_msgsize = 16 * MQ_DEF_MSGSIZE; +u_int mq_def_maxmsg = 32; +u_int mq_max_maxmsg = 16 * 32; static pool_cache_t mqmsg_cache __read_mostly; static kmutex_t mqlist_lock __cacheline_aligned; Index: src/sys/miscfs/procfs/procfs.h diff -u src/sys/miscfs/procfs/procfs.h:1.86 src/sys/miscfs/procfs/procfs.h:1.87 --- src/sys/miscfs/procfs/procfs.h:1.86 Sun May 12 13:26:50 2024 +++ src/sys/miscfs/procfs/procfs.h Sun Jun 30 21:35:53 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: procfs.h,v 1.86 2024/05/12 17:26:50 christos Exp $ */ +/* $NetBSD: procfs.h,v 1.87 2024/07/01 01:35:53 christos Exp $ */ /* * Copyright (c) 1993 @@ -103,6 +103,12 @@ typedef enum { PFSmem, /* the process's memory image */ PFSmeminfo, /* system memory info (if -o linux) */ PFSmounts, /* mounted filesystems (if -o linux) */ + PFSmqueue, /* sys/fs/mqueue subdirectory (if -o linux) */ + PFSmq_msg_def, /* sys/fs/mqueue/msg_default (if -o linux) */ + PFSmq_msg_max, /* sys/fs/mqueue/msg_max (if -o linux) */ + PFSmq_siz_def, /* sys/fs/mqueue/msgsize_default (if -o linux) */ + PFSmq_siz_max, /* sys/fs/mqueue/msgsize_max (if -o linux) */ + PFSmq_qmax, /* sys/fs/mqueue/queues_max (if -o linux) */ PFSnote, /* process notifier */ PFSnotepg, /* process group notifier */ PFSproc, /* a process-specific sub-directory */ @@ -112,6 +118,8 @@ typedef enum { PFSstat, /* process status (if -o linux) */ PFSstatm, /* process memory info (if -o linux) */ PFSstatus, /* process status */ + PFSsys, /* sys subdirectory (if -o linux) */ + PFSsysfs, /* sys/fs subdirectory (if -o linux) */ PFSsysvipc, /* sysvipc subdirectory (if -o linux) */ PFSsysvipc_msg, /* sysvipc msg info (if -o linux) */ PFSsysvipc_sem, /* sysvipc sem info (if -o linux) */ @@ -276,6 +284,16 @@ int procfs_dolimit(struct lwp *, struct struct uio *); int procfs_dolimits(struct lwp *, struct proc *, struct pfsnode *, struct uio *); +int procfs_domq_msg_def(struct lwp *, struct proc *, struct pfsnode *, + struct uio *); +int procfs_domq_msg_max(struct lwp *, struct proc *, struct pfsnode *, + struct uio *); +int procfs_domq_siz_def(struct lwp *, struct proc *, struct pfsnode *, + struct uio *); +int procfs_domq_siz_max(struct lwp *, struct proc *, struct pfsnode *, + struct uio *); +int procfs_domq_qmax(struct lwp *, struct proc *, struct pfsnode *, + struct uio *); int procfs_dosysvipc_msg(struct lwp *, struct proc *, struct pfsnode *, struct uio *); int procfs_dosysvipc_sem(struct lwp *, struct proc *, struct pfsnode *, Index: src/sys/miscfs/procfs/procfs_linux.c diff -u src/sys/miscfs/procfs/procfs_linux.c:1.88 src/sys/miscfs/procfs/procfs_linux.c:1.89 --- src/sys/miscfs/procfs/procfs_linux.c:1.88 Sun May 12 13:26:50 2024 +++ src/sys/miscfs/procfs/procfs_linux.c Sun Jun 30 21:35:53 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: procfs_linux.c,v 1.88 2024/05/12 17:26:50 christos Exp $ */ +/* $NetBSD: procfs_linux.c,v 1.89 2024/07/01 01:35:53 christos Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: procfs_linux.c,v 1.88 2024/05/12 17:26:50 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: procfs_linux.c,v 1.89 2024/07/01 01:35:53 christos Exp $"); #if defined(_KERNEL_OPT) #include "opt_sysv.h" @@ -71,6 +71,7 @@ __KERNEL_RCSID(0, "$NetBSD: procfs_linux #ifdef SYSVSHM #include <sys/shm.h> #endif +#include <sys/mqueue.h> #include <miscfs/procfs/procfs.h> @@ -82,6 +83,11 @@ __KERNEL_RCSID(0, "$NetBSD: procfs_linux extern struct devsw_conv *devsw_conv; extern int max_devsw_convs; +extern u_int mq_open_max; +extern u_int mq_max_msgsize; +extern u_int mq_def_maxmsg; +extern u_int mq_max_maxmsg; + #define PGTOB(p) ((unsigned long)(p) << PAGE_SHIFT) #define PGTOKB(p) ((unsigned long)(p) << (PAGE_SHIFT - 10)) @@ -897,3 +903,56 @@ out: free(bf, M_TEMP); return error; } + +static int +print_uint(unsigned int value, struct uio *uio) +{ + char *bf; + int offset = 0; + int error = EFBIG; + + bf = malloc(LBFSZ, M_TEMP, M_WAITOK); + offset += snprintf(bf, LBFSZ, "%u\n", value); + if (offset >= LBFSZ) + goto out; + + error = uiomove_frombuf(bf, offset, uio); +out: + free(bf, M_TEMP); + return error; +} + +int +procfs_domq_msg_def(struct lwp *curl, struct proc *p, + struct pfsnode *pfs, struct uio *uio) +{ + return print_uint(mq_def_maxmsg, uio); +} + +int +procfs_domq_msg_max(struct lwp *curl, struct proc *p, + struct pfsnode *pfs, struct uio *uio) +{ + return print_uint(mq_max_maxmsg, uio); +} + +int +procfs_domq_siz_def(struct lwp *curl, struct proc *p, + struct pfsnode *pfs, struct uio *uio) +{ + return print_uint(MQ_DEF_MSGSIZE, uio); +} + +int +procfs_domq_siz_max(struct lwp *curl, struct proc *p, + struct pfsnode *pfs, struct uio *uio) +{ + return print_uint(mq_max_msgsize, uio); +} + +int +procfs_domq_qmax(struct lwp *curl, struct proc *p, + struct pfsnode *pfs, struct uio *uio) +{ + return print_uint(mq_open_max, uio); +} Index: src/sys/miscfs/procfs/procfs_subr.c diff -u src/sys/miscfs/procfs/procfs_subr.c:1.119 src/sys/miscfs/procfs/procfs_subr.c:1.120 --- src/sys/miscfs/procfs/procfs_subr.c:1.119 Sun May 12 13:26:50 2024 +++ src/sys/miscfs/procfs/procfs_subr.c Sun Jun 30 21:35:53 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: procfs_subr.c,v 1.119 2024/05/12 17:26:50 christos Exp $ */ +/* $NetBSD: procfs_subr.c,v 1.120 2024/07/01 01:35:53 christos Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -102,7 +102,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: procfs_subr.c,v 1.119 2024/05/12 17:26:50 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: procfs_subr.c,v 1.120 2024/07/01 01:35:53 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -299,6 +299,26 @@ procfs_rw(void *v) error = procfs_dosysvipc_shm(curl, p, pfs, uio); break; + case PFSmq_msg_def: + error = procfs_domq_msg_def(curl, p, pfs, uio); + break; + + case PFSmq_msg_max: + error = procfs_domq_msg_max(curl, p, pfs, uio); + break; + + case PFSmq_siz_def: + error = procfs_domq_siz_def(curl, p, pfs, uio); + break; + + case PFSmq_siz_max: + error = procfs_domq_siz_max(curl, p, pfs, uio); + break; + + case PFSmq_qmax: + error = procfs_domq_qmax(curl, p, pfs, uio); + break; + #ifdef __HAVE_PROCFS_MACHDEP PROCFS_MACHDEP_NODETYPE_CASES error = procfs_machdep_rw(curl, l, pfs, uio); Index: src/sys/miscfs/procfs/procfs_vfsops.c diff -u src/sys/miscfs/procfs/procfs_vfsops.c:1.116 src/sys/miscfs/procfs/procfs_vfsops.c:1.117 --- src/sys/miscfs/procfs/procfs_vfsops.c:1.116 Sun May 12 13:26:50 2024 +++ src/sys/miscfs/procfs/procfs_vfsops.c Sun Jun 30 21:35:53 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: procfs_vfsops.c,v 1.116 2024/05/12 17:26:50 christos Exp $ */ +/* $NetBSD: procfs_vfsops.c,v 1.117 2024/07/01 01:35:53 christos Exp $ */ /* * Copyright (c) 1993 @@ -76,7 +76,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: procfs_vfsops.c,v 1.116 2024/05/12 17:26:50 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: procfs_vfsops.c,v 1.117 2024/07/01 01:35:53 christos Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -437,6 +437,9 @@ procfs_loadvnode(struct mount *mp, struc vp->v_type = VREG; break; + case PFSsys: /* /proc/sys = dr-xr-xr-x */ + case PFSsysfs: /* /proc/sys/fs = dr-xr-xr-x */ + case PFSmqueue: /* /proc/sys/fs/mqueue = dr-xr-xr-x */ case PFSsysvipc:/* /proc/sysvipc = dr-xr-xr-x */ if (pfs->pfs_fd == -1) { pfs->pfs_mode = S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP| @@ -445,6 +448,11 @@ procfs_loadvnode(struct mount *mp, struc break; } /*FALLTHROUGH*/ + case PFSmq_msg_def: /* /proc/sys/fs/mqueue/msg_default = -r--r--r-- */ + case PFSmq_msg_max: /* /proc/sys/fs/mqueue/msg_max = -r--r--r-- */ + case PFSmq_siz_def: /* /proc/sys/fs/mqueue/msgsize_default = -r--r--r-- */ + case PFSmq_siz_max: /* /proc/sys/fs/mqueue/msgsize_max = -r--r--r-- */ + case PFSmq_qmax: /* /proc/sys/fs/mqueue/queues_max = -r--r--r-- */ case PFSsysvipc_msg: /* /proc/sysvipc/msg = -r--r--r-- */ case PFSsysvipc_sem: /* /proc/sysvipc/sem = -r--r--r-- */ case PFSsysvipc_shm: /* /proc/sysvipc/shm = -r--r--r-- */ Index: src/sys/miscfs/procfs/procfs_vnops.c diff -u src/sys/miscfs/procfs/procfs_vnops.c:1.232 src/sys/miscfs/procfs/procfs_vnops.c:1.233 --- src/sys/miscfs/procfs/procfs_vnops.c:1.232 Sun May 12 13:26:51 2024 +++ src/sys/miscfs/procfs/procfs_vnops.c Sun Jun 30 21:35:53 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: procfs_vnops.c,v 1.232 2024/05/12 17:26:51 christos Exp $ */ +/* $NetBSD: procfs_vnops.c,v 1.233 2024/07/01 01:35:53 christos Exp $ */ /*- * Copyright (c) 2006, 2007, 2008, 2020 The NetBSD Foundation, Inc. @@ -105,7 +105,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: procfs_vnops.c,v 1.232 2024/05/12 17:26:51 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: procfs_vnops.c,v 1.233 2024/07/01 01:35:53 christos Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -203,6 +203,7 @@ static const struct proc_target proc_roo { DT_REG, N("stat"), PFScpustat, procfs_validfile_linux }, { DT_REG, N("loadavg"), PFSloadavg, procfs_validfile_linux }, { DT_REG, N("version"), PFSversion, procfs_validfile_linux }, + { DT_DIR, N("sys"), PFSsys, procfs_validfile_linux }, { DT_DIR, N("sysvipc"), PFSsysvipc, procfs_validfile_linux }, #undef N }; @@ -210,6 +211,52 @@ static const int nproc_root_targets = sizeof(proc_root_targets) / sizeof(proc_root_targets[0]); /* + * List of files in the sys directory + */ +static const struct proc_target proc_sys_targets[] = { +#define N(s) sizeof(s)-1, s + /* name type validp */ + { DT_DIR, N("."), PFSsys, procfs_validfile_linux }, + { DT_DIR, N(".."), PFSroot, NULL }, + { DT_REG, N("fs"), PFSsysfs, procfs_validfile_linux }, +#undef N +}; +static const int nproc_sys_targets = + sizeof(proc_sys_targets) / sizeof(proc_sys_targets[0]); + +/* + * List of files in the sys/fs directory + */ +static const struct proc_target proc_sysfs_targets[] = { +#define N(s) sizeof(s)-1, s + /* name type validp */ + { DT_DIR, N("."), PFSsysfs, procfs_validfile_linux }, + { DT_DIR, N(".."), PFSsys, procfs_validfile_linux }, + { DT_REG, N("mqueue"), PFSmqueue, procfs_validfile_linux }, +#undef N +}; +static const int nproc_sysfs_targets = + sizeof(proc_sysfs_targets) / sizeof(proc_sysfs_targets[0]); + +/* + * List of files in the sys/fs/mqueue directory + */ +static const struct proc_target proc_mqueue_targets[] = { +#define N(s) sizeof(s)-1, s + /* name type validp */ + { DT_DIR, N("."), PFSmqueue, procfs_validfile_linux }, + { DT_DIR, N(".."), PFSsysfs, procfs_validfile_linux }, + { DT_REG, N("msg_default"), PFSmq_msg_def, procfs_validfile_linux }, + { DT_REG, N("msg_max"), PFSmq_msg_max, procfs_validfile_linux }, + { DT_REG, N("msgsize_default"), PFSmq_siz_def, procfs_validfile_linux }, + { DT_REG, N("msgsize_max"), PFSmq_siz_max, procfs_validfile_linux }, + { DT_REG, N("queues_max"), PFSmq_qmax, procfs_validfile_linux }, +#undef N +}; +static const int nproc_mqueue_targets = + sizeof(proc_mqueue_targets) / sizeof(proc_mqueue_targets[0]); + +/* * List of files in the sysvipc directory */ static const struct proc_target proc_sysvipc_targets[] = { @@ -742,6 +789,11 @@ procfs_getattr(void *v) case PFSself: case PFScurproc: case PFSroot: + case PFSmq_msg_def: + case PFSmq_msg_max: + case PFSmq_siz_def: + case PFSmq_siz_max: + case PFSmq_qmax: case PFSsysvipc_msg: case PFSsysvipc_sem: case PFSsysvipc_shm: @@ -754,6 +806,17 @@ procfs_getattr(void *v) vap->va_uid = vap->va_gid = 0; break; + case PFSsys: /* proc/sys only contains "fs" */ + case PFSsysfs: /* proc/sys/fs only contains "mqueue" */ + vap->va_nlink = 3; + vap->va_uid = vap->va_gid = 0; + break; + + case PFSmqueue: + vap->va_nlink = 7; + vap->va_uid = vap->va_gid = 0; + break; + case PFSproc: case PFStask: case PFSfile: @@ -868,6 +931,14 @@ procfs_getattr(void *v) case PFSloadavg: case PFSstatm: case PFSversion: + case PFSsys: + case PFSsysfs: + case PFSmqueue: + case PFSmq_msg_def: + case PFSmq_msg_max: + case PFSmq_siz_def: + case PFSmq_siz_max: + case PFSmq_qmax: case PFSsysvipc: case PFSsysvipc_msg: case PFSsysvipc_sem: @@ -1188,15 +1259,47 @@ procfs_lookup(void *v) procfs_proc_unlock(p); return error; } - case PFSsysvipc: + case PFSsys: + case PFSsysfs: + case PFSmqueue: + case PFSsysvipc: { + const struct proc_target *targets; + int ntargets; + pfstype parent; + + switch (pfs->pfs_type) { + case PFSsys: + targets = proc_sys_targets; + ntargets = nproc_sys_targets; + parent = PFSroot; + break; + case PFSsysfs: + targets = proc_sysfs_targets; + ntargets = nproc_sysfs_targets; + parent = PFSsys; + break; + case PFSmqueue: + targets = proc_mqueue_targets; + ntargets = nproc_mqueue_targets; + parent = PFSsysfs; + break; + case PFSsysvipc: + targets = proc_sysvipc_targets; + ntargets = nproc_sysvipc_targets; + parent = PFSroot; + break; + default: + return (EINVAL); + } + if (cnp->cn_flags & ISDOTDOT) { - error = procfs_allocvp(dvp->v_mount, vpp, 0, PFSroot, + error = procfs_allocvp(dvp->v_mount, vpp, 0, parent, -1); return (error); } - for (i = 0; i < nproc_sysvipc_targets; i++) { - pt = &proc_sysvipc_targets[i]; + for (i = 0; i < ntargets; i++) { + pt = &targets[i]; /* * check for node match. proc is always NULL here, * so call pt_valid with constant NULL lwp. @@ -1208,13 +1311,14 @@ procfs_lookup(void *v) break; } - if (i != nproc_sysvipc_targets) { + if (i != ntargets) { error = procfs_allocvp(dvp->v_mount, vpp, 0, pt->pt_pfstype, -1); return (error); } return (ENOENT); + } default: return (ENOTDIR); @@ -1502,21 +1606,48 @@ procfs_readdir(void *v) } /* - * sysvipc subdirectory + * misc subdirectories */ + case PFSsys: + case PFSsysfs: + case PFSmqueue: case PFSsysvipc: { + const struct proc_target *targets; + int ntargets; + + switch (pfs->pfs_type) { + case PFSsys: + targets = proc_sys_targets; + ntargets = nproc_sys_targets; + break; + case PFSsysfs: + targets = proc_sysfs_targets; + ntargets = nproc_sysfs_targets; + break; + case PFSmqueue: + targets = proc_mqueue_targets; + ntargets = nproc_mqueue_targets; + break; + case PFSsysvipc: + targets = proc_sysvipc_targets; + ntargets = nproc_sysvipc_targets; + break; + default: + return (EINVAL); + } + if ((error = procfs_proc_lock(vp->v_mount, pfs->pfs_pid, &p, ESRCH)) != 0) return error; if (ap->a_ncookies) { - ncookies = uimin(ncookies, (nproc_sysvipc_targets - i)); + ncookies = uimin(ncookies, (ntargets - i)); cookies = malloc(ncookies * sizeof (off_t), M_TEMP, M_WAITOK); *ap->a_cookies = cookies; } - for (pt = &proc_sysvipc_targets[i]; - uio->uio_resid >= UIO_MX && i < nproc_sysvipc_targets; pt++, i++) { + for (pt = &targets[i]; + uio->uio_resid >= UIO_MX && i < ntargets; pt++, i++) { if (pt->pt_valid && (*pt->pt_valid)(NULL, vp->v_mount) == 0) continue; Index: src/sys/modules/compat_linux/Makefile diff -u src/sys/modules/compat_linux/Makefile:1.7 src/sys/modules/compat_linux/Makefile:1.8 --- src/sys/modules/compat_linux/Makefile:1.7 Mon Aug 21 15:43:22 2023 +++ src/sys/modules/compat_linux/Makefile Sun Jun 30 21:35:53 2024 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.7 2023/08/21 19:43:22 christos Exp $ +# $NetBSD: Makefile,v 1.8 2024/07/01 01:35:53 christos Exp $ .include "../Makefile.inc" .include "../Makefile.assym" @@ -13,7 +13,7 @@ SRCS+= linux_fdio.c linux_file.c linux_h SRCS+= linux_ipc.c linux_misc.c linux_mtio.c linux_sched.c SRCS+= linux_sg.c linux_signal.c linux_signo.c linux_socket.c SRCS+= linux_sysctl.c linux_termios.c linux_time.c linux_mod.c -SRCS+= linux_inotify.c +SRCS+= linux_inotify.c linux_mqueue.c .if ${MACHINE_CPU} == "aarch64" CPPFLAGS+= -DEXEC_ELF64 Added files: Index: src/sys/compat/linux/common/linux_mqueue.c diff -u /dev/null src/sys/compat/linux/common/linux_mqueue.c:1.1 --- /dev/null Sun Jun 30 21:35:54 2024 +++ src/sys/compat/linux/common/linux_mqueue.c Sun Jun 30 21:35:53 2024 @@ -0,0 +1,315 @@ +/* $NetBSD */ + +/*- + * Copyright (c) 2024 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: linux_mqueue.c,v 1.1 2024/07/01 01:35:53 christos Exp $"); + +#include <sys/param.h> +#include <sys/filedesc.h> +#include <sys/fcntl.h> +#include <sys/mqueue.h> +#include <sys/syscallargs.h> + +#include <compat/linux/common/linux_types.h> +#include <compat/linux/common/linux_sched.h> +#include <compat/linux/common/linux_fcntl.h> +#include <compat/linux/common/linux_ipc.h> +#include <compat/linux/common/linux_sem.h> +#include <compat/linux/common/linux_signal.h> +#include <compat/linux/common/linux_sigevent.h> +#include <compat/linux/common/linux_util.h> +#include <compat/linux/common/linux_mqueue.h> + +#include <compat/linux/linux_syscallargs.h> +#include <compat/linux/linux_syscall.h> + +static void +linux_to_bsd_mq_attr(const struct linux_mq_attr *lmp, struct mq_attr *bmp) +{ + memset(bmp, 0, sizeof(*bmp)); + bmp->mq_flags = cvtto_bsd_mask(lmp->mq_flags, LINUX_O_NONBLOCK, + O_NONBLOCK); + bmp->mq_maxmsg = lmp->mq_maxmsg; + bmp->mq_msgsize = lmp->mq_msgsize; + bmp->mq_curmsgs = lmp->mq_curmsgs; +} + +static void +bsd_to_linux_mq_attr(const struct mq_attr *bmp, struct linux_mq_attr *lmp) +{ + memset(lmp, 0, sizeof(*lmp)); + lmp->mq_flags = cvtto_linux_mask(bmp->mq_flags, O_NONBLOCK, + LINUX_O_NONBLOCK); + lmp->mq_maxmsg = bmp->mq_maxmsg; + lmp->mq_msgsize = bmp->mq_msgsize; + lmp->mq_curmsgs = bmp->mq_curmsgs; +} + +/* Adapted from sys_mq_open */ +int +linux_sys_mq_open(struct lwp *l, const struct linux_sys_mq_open_args *uap, + register_t *retval) +{ + /* { + syscallarg(const char *) name; + syscallarg(int) oflag; + syscallarg(linux_umode_t) mode; + syscallarg(struct linux_mq_attr *) attr; + } */ + struct linux_mq_attr lattr; + struct mq_attr *attr = NULL, a; + int error, oflag; + + oflag = linux_to_bsd_ioflags(SCARG(uap, oflag)); + + if ((oflag & O_CREAT) != 0 && SCARG(uap, attr) != NULL) { + error = copyin(SCARG(uap, attr), &lattr, sizeof(lattr)); + if (error) + return error; + linux_to_bsd_mq_attr(&lattr, &a); + attr = &a; + } + + return mq_handle_open(l, SCARG(uap, name), oflag, + (mode_t)SCARG(uap, mode), attr, retval); +} + +int +linux_sys_mq_unlink(struct lwp *l, const struct linux_sys_mq_unlink_args *uap, + register_t *retval) +{ + /* { + syscallarg(const char *) name; + } */ + struct sys_mq_unlink_args args; + + SCARG(&args, name) = SCARG(uap, name); + + return sys_mq_unlink(l, &args, retval); +} + +/* Adapted from sys___mq_timedsend50 */ +int +linux_sys_mq_timedsend(struct lwp *l, const struct linux_sys_mq_timedsend_args *uap, + register_t *retval) +{ + /* { + syscallarg(linux_mqd_t) mqdes; + syscallarg(const char *) msg_ptr; + syscallarg(size_t) msg_len; + syscallarg(unsigned int) msg_prio; + syscallarg(const struct linux_timespec *) abs_timeout; + } */ + struct linux_timespec lts; + struct timespec ts, *tsp; + int error; + + /* Get and convert time value */ + if (SCARG(uap, abs_timeout)) { + error = copyin(SCARG(uap, abs_timeout), <s, sizeof(lts)); + if (error) + return error; + linux_to_native_timespec(&ts, <s); + tsp = &ts; + } else { + tsp = NULL; + } + + return mq_send1((mqd_t)SCARG(uap, mqdes), SCARG(uap, msg_ptr), + SCARG(uap, msg_len), SCARG(uap, msg_prio), tsp); +} + +/* Adapted from sys___mq_timedreceive50 */ +int +linux_sys_mq_timedreceive(struct lwp *l, + const struct linux_sys_mq_timedreceive_args *uap, register_t *retval) +{ + /* { + syscallarg(linux_mqd_t) mqdes; + syscallarg(char *) msg_ptr; + syscallarg(size_t) msg_len; + syscallarg(unsigned int *) msg_prio; + syscallarg(const struct linux_timespec *) abs_timeout; + }; */ + struct linux_timespec lts; + struct timespec ts, *tsp; + ssize_t mlen; + int error; + + /* Get and convert time value */ + if (SCARG(uap, abs_timeout)) { + error = copyin(SCARG(uap, abs_timeout), <s, sizeof(lts)); + if (error) + return error; + linux_to_native_timespec(&ts, <s); + tsp = &ts; + } else { + tsp = NULL; + } + + error = mq_recv1((mqd_t)SCARG(uap, mqdes), SCARG(uap, msg_ptr), + SCARG(uap, msg_len), SCARG(uap, msg_prio), tsp, &mlen); + if (error == 0) + *retval = mlen; + + return error; +} + +/* Adapted from sys_mq_notify */ +int +linux_sys_mq_notify(struct lwp *l, const struct linux_sys_mq_notify_args *uap, + register_t *retval) +{ + /* { + syscallarg(linux_mqd_t) mqdes; + syscallarg(const struct linux_sigevent *) sevp; + } */ + struct mqueue *mq; + struct sigevent sig; + int error; + + if (SCARG(uap, sevp)) { + /* Get the signal from user-space */ + error = linux_sigevent_copyin(SCARG(uap, sevp), &sig, + sizeof(sig)); + if (error) + return error; + if (sig.sigev_notify == SIGEV_SIGNAL && + (sig.sigev_signo <= 0 || sig.sigev_signo >= NSIG)) + return EINVAL; + } + + error = mqueue_get((mqd_t)SCARG(uap, mqdes), 0, &mq); + if (error) + return error; + if (SCARG(uap, sevp)) { + /* Register notification: set the signal and target process */ + if (mq->mq_notify_proc == NULL) { + memcpy(&mq->mq_sig_notify, &sig, + sizeof(struct sigevent)); + mq->mq_notify_proc = l->l_proc; + } else { + /* Fail if someone else already registered */ + error = EBUSY; + } + } else { + /* Unregister the notification */ + mq->mq_notify_proc = NULL; + } + mutex_exit(&mq->mq_mtx); + fd_putfile((int)SCARG(uap, mqdes)); + + return error; +} + +/* Adapted from sys_mq_getattr */ +static int +linux_sys_mq_getattr(struct lwp *l, + const struct linux_sys_mq_getsetattr_args *uap, register_t *retval) +{ + /* { + syscallarg(linux_mqd_t) mqdes; + syscallarg(const struct linux_mq_attr *) newattr; + syscallarg(struct linux_mq_attr *) oldattr; + } */ + struct linux_mq_attr lattr; + struct mq_attr attr; + struct mqueue *mq; + int error; + + error = mqueue_get((mqd_t)SCARG(uap, mqdes), 0, &mq); + if (error) + return error; + memcpy(&attr, &mq->mq_attrib, sizeof(struct mq_attr)); + bsd_to_linux_mq_attr(&attr, &lattr); + mutex_exit(&mq->mq_mtx); + fd_putfile((int)SCARG(uap, mqdes)); + + return copyout(&lattr, SCARG(uap, oldattr), sizeof(lattr)); +} + +/* Adapted from sys_mq_setattr */ +static int +linux_sys_mq_setattr(struct lwp *l, + const struct linux_sys_mq_getsetattr_args *uap, register_t *retval) +{ + /* { + syscallarg(linux_mqd_t) mqdes; + syscallarg(const struct linux_mq_attr *) newattr; + syscallarg(struct linux_mq_attr *) oldattr; + } */ + struct linux_mq_attr lattr; + struct mq_attr attr; + struct mqueue *mq; + int error, nonblock; + + error = copyin(SCARG(uap, newattr), &lattr, sizeof(lattr)); + if (error) + return error; + linux_to_bsd_mq_attr(&lattr, &attr); + nonblock = (attr.mq_flags & O_NONBLOCK); + + error = mqueue_get((mqd_t)SCARG(uap, mqdes), 0, &mq); + if (error) + return error; + + /* Copy the old attributes, if needed */ + if (SCARG(uap, oldattr)) { + memcpy(&attr, &mq->mq_attrib, sizeof(struct mq_attr)); + bsd_to_linux_mq_attr(&attr, &lattr); + } + + /* Ignore everything, except O_NONBLOCK */ + if (nonblock) + mq->mq_attrib.mq_flags |= O_NONBLOCK; + else + mq->mq_attrib.mq_flags &= ~O_NONBLOCK; + + mutex_exit(&mq->mq_mtx); + fd_putfile((int)SCARG(uap, mqdes)); + + /* Copy the data to the user-space. */ + if (SCARG(uap, oldattr)) + return copyout(&lattr, SCARG(uap, oldattr), sizeof(lattr)); + + return 0; +} + +int +linux_sys_mq_getsetattr(struct lwp *l, + const struct linux_sys_mq_getsetattr_args *uap, register_t *retval) +{ + /* { + syscallarg(linux_mqd_t) mqdes; + syscallarg(const struct linux_mq_attr *) newattr; + syscallarg(struct linux_mq_attr *) oldattr; + } */ + if (SCARG(uap, newattr) == NULL) + return linux_sys_mq_getattr(l, uap, retval); + return linux_sys_mq_setattr(l, uap, retval); +} Index: src/sys/compat/linux/common/linux_mqueue.h diff -u /dev/null src/sys/compat/linux/common/linux_mqueue.h:1.1 --- /dev/null Sun Jun 30 21:35:54 2024 +++ src/sys/compat/linux/common/linux_mqueue.h Sun Jun 30 21:35:53 2024 @@ -0,0 +1,40 @@ +/* $NetBSD */ + +/*- + * Copyright (c) 2024 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _LINUX_MQUEUE_H +#define _LINUX_MQUEUE_H + +struct linux_mq_attr { + long mq_flags; /* message queue flags */ + long mq_maxmsg; /* maximum number of messages */ + long mq_msgsize; /* maximum message size */ + long mq_curmsgs; /* number of messages currently queued */ + long __reserved[4]; /* ignored for input, zeroed for output */ +}; + +#endif /* !_LINUX_MQUEUE_H */