Module Name: src
Committed By: rin
Date: Sun Jul 30 06:52:21 UTC 2023
Modified Files:
src/sys/compat/netbsd32: files.netbsd32 netbsd32.h netbsd32_conv.h
syscalls.master
Added Files:
src/sys/compat/netbsd32: netbsd32_epoll.c
Log Message:
COMPAT_NETBSD32: Add support for epoll(2).
To generate a diff of this commit:
cvs rdiff -u -r1.54 -r1.55 src/sys/compat/netbsd32/files.netbsd32
cvs rdiff -u -r1.142 -r1.143 src/sys/compat/netbsd32/netbsd32.h
cvs rdiff -u -r1.47 -r1.48 src/sys/compat/netbsd32/netbsd32_conv.h
cvs rdiff -u -r0 -r1.1 src/sys/compat/netbsd32/netbsd32_epoll.c
cvs rdiff -u -r1.143 -r1.144 src/sys/compat/netbsd32/syscalls.master
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/netbsd32/files.netbsd32
diff -u src/sys/compat/netbsd32/files.netbsd32:1.54 src/sys/compat/netbsd32/files.netbsd32:1.55
--- src/sys/compat/netbsd32/files.netbsd32:1.54 Mon Dec 19 23:19:51 2022
+++ src/sys/compat/netbsd32/files.netbsd32 Sun Jul 30 06:52:20 2023
@@ -1,4 +1,4 @@
-# $NetBSD: files.netbsd32,v 1.54 2022/12/19 23:19:51 pgoyette Exp $
+# $NetBSD: files.netbsd32,v 1.55 2023/07/30 06:52:20 rin Exp $
#
# config file description for machine-independent netbsd32 compat code.
# included by ports that need it.
@@ -16,6 +16,7 @@ file compat/netbsd32/netbsd32_exec_elf32
file compat/netbsd32/netbsd32_exec_aout.c compat_netbsd32 & exec_aout
file compat/netbsd32/netbsd32_netbsd.c compat_netbsd32
#file compat/netbsd32/netbsd32_drm.c compat_netbsd32 & drmkms
+file compat/netbsd32/netbsd32_epoll.c compat_netbsd32
file compat/netbsd32/netbsd32_event.c compat_netbsd32
file compat/netbsd32/netbsd32_execve.c compat_netbsd32
file compat/netbsd32/netbsd32_fd.c compat_netbsd32
Index: src/sys/compat/netbsd32/netbsd32.h
diff -u src/sys/compat/netbsd32/netbsd32.h:1.142 src/sys/compat/netbsd32/netbsd32.h:1.143
--- src/sys/compat/netbsd32/netbsd32.h:1.142 Sat Jul 29 12:38:25 2023
+++ src/sys/compat/netbsd32/netbsd32.h Sun Jul 30 06:52:20 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32.h,v 1.142 2023/07/29 12:38:25 rin Exp $ */
+/* $NetBSD: netbsd32.h,v 1.143 2023/07/30 06:52:20 rin Exp $ */
/*
* Copyright (c) 1998, 2001, 2008, 2015 Matthew R. Green
@@ -208,6 +208,15 @@ typedef netbsd32_int64 netbsd32_off_t;
typedef netbsd32_uint64 netbsd32_ino_t;
typedef netbsd32_int64 netbsd32_blkcnt_t;
+/* from <sys/epoll.h> */
+typedef netbsd32_uint64 netbsd32_epoll_data_t;
+
+typedef netbsd32_pointer_t netbsd32_epoll_eventp_t;
+struct netbsd32_epoll_event {
+ uint32_t events;
+ netbsd32_epoll_data_t data;
+};
+
/* from <sys/spawn.h> */
typedef netbsd32_pointer_t netbsd32_posix_spawn_file_actionsp;
typedef netbsd32_pointer_t netbsd32_posix_spawnattrp;
Index: src/sys/compat/netbsd32/netbsd32_conv.h
diff -u src/sys/compat/netbsd32/netbsd32_conv.h:1.47 src/sys/compat/netbsd32/netbsd32_conv.h:1.48
--- src/sys/compat/netbsd32/netbsd32_conv.h:1.47 Sat Jul 29 12:38:25 2023
+++ src/sys/compat/netbsd32/netbsd32_conv.h Sun Jul 30 06:52:20 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_conv.h,v 1.47 2023/07/29 12:38:25 rin Exp $ */
+/* $NetBSD: netbsd32_conv.h,v 1.48 2023/07/30 06:52:20 rin Exp $ */
/*
* Copyright (c) 1998, 2001 Matthew R. Green
@@ -43,6 +43,7 @@
#include <sys/time.h>
#include <sys/timex.h>
#include <sys/event.h>
+#include <sys/epoll.h>
#include <compat/sys/dirent.h>
@@ -956,4 +957,24 @@ netbsd32_from_mq_attr(const struct mq_at
a32->mq_curmsgs = attr->mq_curmsgs;
}
+static __inline void
+netbsd32_to_epoll_event(const struct netbsd32_epoll_event *ee32,
+ struct epoll_event *ee)
+{
+
+ memset(ee, 0, sizeof(*ee));
+ ee->events = ee32->events;
+ ee->data = ee32->data;
+}
+
+static __inline void
+netbsd32_from_epoll_event(const struct epoll_event *ee,
+ struct netbsd32_epoll_event *ee32)
+{
+
+ memset(ee32, 0, sizeof(*ee32));
+ ee32->events = ee->events;
+ ee32->data = ee->data;
+}
+
#endif /* _COMPAT_NETBSD32_NETBSD32_CONV_H_ */
Index: src/sys/compat/netbsd32/syscalls.master
diff -u src/sys/compat/netbsd32/syscalls.master:1.143 src/sys/compat/netbsd32/syscalls.master:1.144
--- src/sys/compat/netbsd32/syscalls.master:1.143 Sun Jul 30 05:30:45 2023
+++ src/sys/compat/netbsd32/syscalls.master Sun Jul 30 06:52:20 2023
@@ -1,4 +1,4 @@
- $NetBSD: syscalls.master,v 1.143 2023/07/30 05:30:45 rin Exp $
+ $NetBSD: syscalls.master,v 1.144 2023/07/30 06:52:20 rin Exp $
; from: NetBSD: syscalls.master,v 1.81 1998/07/05 08:49:50 jonathan Exp
; @(#)syscalls.master 8.2 (Berkeley) 1/13/94
@@ -1222,6 +1222,10 @@
netbsd32_keventp_t eventlist, \
netbsd32_size_t nevents, \
const netbsd32_timespecp_t timeout); }
-502 UNIMPL epoll_create1
-503 UNIMPL epoll_ctl
-504 UNIMPL epoll_pwait2
+502 STD { int|netbsd32||epoll_create1(int flags); }
+503 STD { int|netbsd32||epoll_ctl(int epfd, int op, int fd, \
+ netbsd32_epoll_eventp_t event); }
+504 STD { int|netbsd32||epoll_pwait2(int epfd, \
+ netbsd32_epoll_eventp_t events, int maxevents, \
+ netbsd32_timespecp_t timeout, \
+ netbsd32_sigsetp_t sigmask); }
Added files:
Index: src/sys/compat/netbsd32/netbsd32_epoll.c
diff -u /dev/null src/sys/compat/netbsd32/netbsd32_epoll.c:1.1
--- /dev/null Sun Jul 30 06:52:21 2023
+++ src/sys/compat/netbsd32/netbsd32_epoll.c Sun Jul 30 06:52:20 2023
@@ -0,0 +1,151 @@
+/* $NetBSD: netbsd32_epoll.c,v 1.1 2023/07/30 06:52:20 rin Exp $ */
+
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2007 Roman Divacky
+ * Copyright (c) 2014 Dmitry Chagin <[email protected]>
+ *
+ * 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 AUTHOR 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 AUTHOR 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: netbsd32_epoll.c,v 1.1 2023/07/30 06:52:20 rin Exp $");
+
+#include <sys/types.h>
+#include <sys/epoll.h>
+#include <sys/kmem.h>
+#include <sys/systm.h>
+#include <sys/syscall.h>
+#include <sys/syscallargs.h>
+
+#include <compat/netbsd32/netbsd32.h>
+#include <compat/netbsd32/netbsd32_conv.h>
+#include <compat/netbsd32/netbsd32_syscall.h>
+#include <compat/netbsd32/netbsd32_syscallargs.h>
+
+int
+netbsd32_epoll_create1(struct lwp *l,
+ const struct netbsd32_epoll_create1_args *uap, register_t *retval)
+{
+ /* {
+ syscallarg(int) flags;
+ } */
+ struct sys_epoll_create1_args ua;
+
+ NETBSD32TO64_UAP(flags);
+ return sys_epoll_create1(l, &ua, retval);
+}
+
+int
+netbsd32_epoll_ctl(struct lwp *l, const struct netbsd32_epoll_ctl_args *uap,
+ register_t *retval)
+{
+ /* {
+ syscallarg(int) epfd;
+ syscallarg(int) op;
+ syscallarg(int) fd;
+ syscallarg(netbsd32_epoll_eventp_t) event;
+ } */
+ struct epoll_event ee, *eep;
+ int error;
+
+ if (SCARG(uap, op) != EPOLL_CTL_DEL) {
+ struct netbsd32_epoll_event ee32;
+
+ error = copyin(SCARG_P32(uap, event), &ee32, sizeof(ee32));
+ if (error != 0)
+ return error;
+
+ netbsd32_to_epoll_event(&ee32, &ee);
+ eep = ⅇ
+ } else
+ eep = NULL;
+
+ return epoll_ctl_common(l, retval, SCARG(uap, epfd), SCARG(uap, op),
+ SCARG(uap, fd), eep);
+}
+
+int
+netbsd32_epoll_pwait2(struct lwp *l,
+ const struct netbsd32_epoll_pwait2_args *uap, register_t *retval)
+{
+ /* {
+ syscallarg(int) epfd;
+ syscallarg(netbsd32_epoll_eventp_t) events;
+ syscallarg(int) maxevents;
+ syscallarg(netbsd32_timespecp_t) timeout;
+ syscallarg(netbsd32_sigsetp_t) sigmask;
+ } */
+ struct epoll_event *events;
+ struct timespec ts, *tsp;
+ sigset_t ss, *ssp;
+ int error;
+ const int maxevents = SCARG(uap, maxevents);
+
+ if (maxevents <= 0 || maxevents >= EPOLL_MAX_EVENTS)
+ return EINVAL;
+
+ if (SCARG_P32(uap, timeout) != NULL) {
+ struct netbsd32_timespec ts32;
+
+ error = copyin(SCARG_P32(uap, timeout), &ts32, sizeof(ts32));
+ if (error != 0)
+ return error;
+
+ netbsd32_to_timespec(&ts32, &ts);
+ tsp = &ts;
+ } else
+ tsp = NULL;
+
+ if (SCARG_P32(uap, sigmask) != NULL) {
+ error = copyin(SCARG_P32(uap, sigmask), &ss, sizeof(ss));
+ if (error != 0)
+ return error;
+
+ ssp = &ss;
+ } else
+ ssp = NULL;
+
+ events = kmem_alloc(maxevents * sizeof(*events), KM_SLEEP);
+
+ error = epoll_wait_common(l, retval, SCARG(uap, epfd), events,
+ maxevents, tsp, ssp);
+ if (error != 0) {
+ kmem_free(events, maxevents * sizeof(*events));
+ return error;
+ }
+
+ struct netbsd32_epoll_event *events32 =
+ kmem_alloc(*retval * sizeof(*events32), KM_SLEEP);
+
+ for (int i = 0; i < *retval; i++)
+ netbsd32_from_epoll_event(&events[i], &events32[i]);
+
+ kmem_free(events, maxevents * sizeof(*events));
+
+ error = copyout(events, SCARG_P32(uap, events),
+ *retval * sizeof(*events32));
+
+ kmem_free(events32, *retval * sizeof(*events32));
+
+ return error;
+}