Module Name: src
Committed By: rin
Date: Sat Jul 29 12:38:25 UTC 2023
Modified Files:
src/sys/compat/netbsd32: netbsd32.h netbsd32_compat_100.c
netbsd32_compat_50.c netbsd32_conv.h netbsd32_event.c
syscalls.master
Added Files:
src/sys/compat/netbsd32: netbsd32_event.h
Log Message:
COMPAT_NETBSD32: Catch up with sys___kevent100() addition.
XXX
Add epoll_* and memfd_create.
To generate a diff of this commit:
cvs rdiff -u -r1.141 -r1.142 src/sys/compat/netbsd32/netbsd32.h \
src/sys/compat/netbsd32/syscalls.master
cvs rdiff -u -r1.1 -r1.2 src/sys/compat/netbsd32/netbsd32_compat_100.c
cvs rdiff -u -r1.53 -r1.54 src/sys/compat/netbsd32/netbsd32_compat_50.c
cvs rdiff -u -r1.46 -r1.47 src/sys/compat/netbsd32/netbsd32_conv.h
cvs rdiff -u -r1.12 -r1.13 src/sys/compat/netbsd32/netbsd32_event.c
cvs rdiff -u -r0 -r1.1 src/sys/compat/netbsd32/netbsd32_event.h
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/netbsd32.h
diff -u src/sys/compat/netbsd32/netbsd32.h:1.141 src/sys/compat/netbsd32/netbsd32.h:1.142
--- src/sys/compat/netbsd32/netbsd32.h:1.141 Sun Feb 12 16:28:32 2023
+++ src/sys/compat/netbsd32/netbsd32.h Sat Jul 29 12:38:25 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32.h,v 1.141 2023/02/12 16:28:32 andvar Exp $ */
+/* $NetBSD: netbsd32.h,v 1.142 2023/07/29 12:38:25 rin Exp $ */
/*
* Copyright (c) 1998, 2001, 2008, 2015 Matthew R. Green
@@ -1024,6 +1024,19 @@ struct netbsd32_kevent {
uint32_t fflags;
netbsd32_int64 data;
netbsd32_pointer_t udata;
+ netbsd32_uint64 ext[4];
+};
+
+/* from <compat/sys/event.h> */
+typedef netbsd32_pointer_t netbsd32_kevent100p_t;
+
+struct netbsd32_kevent100 {
+ netbsd32_uintptr_t ident;
+ uint32_t filter;
+ uint32_t flags;
+ uint32_t fflags;
+ netbsd32_int64 data;
+ netbsd32_pointer_t udata;
};
/* from <sys/sched.h> */
Index: src/sys/compat/netbsd32/syscalls.master
diff -u src/sys/compat/netbsd32/syscalls.master:1.141 src/sys/compat/netbsd32/syscalls.master:1.142
--- src/sys/compat/netbsd32/syscalls.master:1.141 Mon Sep 20 01:07:45 2021
+++ src/sys/compat/netbsd32/syscalls.master Sat Jul 29 12:38:25 2023
@@ -1,4 +1,4 @@
- $NetBSD: syscalls.master,v 1.141 2021/09/20 01:07:45 thorpej Exp $
+ $NetBSD: syscalls.master,v 1.142 2023/07/29 12:38:25 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
@@ -783,9 +783,9 @@
344 NOARGS { int|sys||kqueue(void); }
345 COMPAT_50 MODULAR compat_netbsd32_50 \
{ int|netbsd32||kevent(int fd, \
- netbsd32_keventp_t changelist, \
+ netbsd32_kevent100p_t changelist, \
netbsd32_size_t nchanges, \
- netbsd32_keventp_t eventlist, \
+ netbsd32_kevent100p_t eventlist, \
netbsd32_size_t nevents, \
netbsd32_timespec50p_t timeout); }
; Scheduling system calls.
@@ -1016,10 +1016,11 @@
const netbsd32_timespecp_t ts, \
lwpid_t unpark, const netbsd32_voidp hint, \
const netbsd32_voidp unparkhint); }
-435 STD { int|netbsd32|50|kevent(int fd, \
- const netbsd32_keventp_t changelist, \
+435 COMPAT_100 MODULAR compat_netbsd32_100 \
+ { int|netbsd32|50|kevent(int fd, \
+ const netbsd32_kevent100p_t changelist, \
netbsd32_size_t nchanges, \
- netbsd32_keventp_t eventlist, \
+ netbsd32_kevent100p_t eventlist, \
netbsd32_size_t nevents, \
const netbsd32_timespecp_t timeout); }
436 STD { int|netbsd32|50|pselect(int nd, \
@@ -1213,3 +1214,13 @@
acl_type_t type, netbsd32_aclp_t aclp); }
499 STD { long|netbsd32||lpathconf(const netbsd32_charp path, \
int name); }
+500 UNIMPL memfd_create
+501 STD { int|netbsd32|100|kevent(int fd, \
+ const netbsd32_keventp_t changelist, \
+ netbsd32_size_t nchanges, \
+ 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
Index: src/sys/compat/netbsd32/netbsd32_compat_100.c
diff -u src/sys/compat/netbsd32/netbsd32_compat_100.c:1.1 src/sys/compat/netbsd32/netbsd32_compat_100.c:1.2
--- src/sys/compat/netbsd32/netbsd32_compat_100.c:1.1 Mon Dec 19 23:19:51 2022
+++ src/sys/compat/netbsd32/netbsd32_compat_100.c Sat Jul 29 12:38:25 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_compat_100.c,v 1.1 2022/12/19 23:19:51 pgoyette Exp $ */
+/* $NetBSD: netbsd32_compat_100.c,v 1.2 2023/07/29 12:38:25 rin Exp $ */
/*-
* Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -30,14 +30,126 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_100.c,v 1.1 2022/12/19 23:19:51 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_100.c,v 1.2 2023/07/29 12:38:25 rin Exp $");
+#include <sys/types.h>
+#include <sys/event.h>
+#include <sys/eventvar.h>
#include <sys/module.h>
+#include <sys/syscallvar.h>
+#include <sys/syscallargs.h>
+#include <sys/systm.h>
#include <compat/netbsd32/netbsd32.h>
#include <compat/netbsd32/netbsd32_syscall.h>
#include <compat/netbsd32/netbsd32_syscallargs.h>
#include <compat/netbsd32/netbsd32_conv.h>
+#include <compat/netbsd32/netbsd32_event.h>
+
+static int
+compat_100_netbsd32_kevent_fetch_timeout(const void *src, void *dest,
+ size_t length)
+{
+ struct netbsd32_timespec ts32;
+ int error;
+
+ KASSERT(length == sizeof(struct timespec));
+
+ error = copyin(src, &ts32, sizeof(ts32));
+ if (error)
+ return error;
+ netbsd32_to_timespec(&ts32, (struct timespec *)dest);
+ return 0;
+}
+
+static void
+compat_100_netbsd32_to_kevent(const struct netbsd32_kevent100 *ke32,
+ struct kevent *ke)
+{
+
+ memset(ke, 0, sizeof(*ke));
+ ke->ident = ke32->ident;
+ ke->filter = ke32->filter;
+ ke->flags = ke32->flags;
+ ke->fflags = ke32->fflags;
+ ke->data = ke32->data;
+ ke->udata = NETBSD32PTR64(ke32->udata);
+}
+
+static void
+compat_100_netbsd32_from_kevent(const struct kevent *ke,
+ struct netbsd32_kevent100 *ke32)
+{
+
+ memset(ke32, 0, sizeof(*ke32));
+ ke32->ident = ke->ident;
+ ke32->filter = ke->filter;
+ ke32->flags = ke->flags;
+ ke32->fflags = ke->fflags;
+ ke32->data = ke->data;
+ NETBSD32PTR32(ke32->udata, ke->udata);
+}
+
+int
+compat_100_netbsd32_kevent_fetch_changes(void *ctx,
+ const struct kevent *changelist, struct kevent *changes, size_t index,
+ int n)
+{
+ const struct netbsd32_kevent100 *src =
+ (const struct netbsd32_kevent100 *)changelist;
+ struct netbsd32_kevent100 *ke32, *changes32 = ctx;
+ int error, i;
+
+ error = copyin(src + index, changes32, n * sizeof(*changes32));
+ if (error)
+ return error;
+ for (i = 0, ke32 = changes32; i < n; i++, ke32++, changes++)
+ compat_100_netbsd32_to_kevent(ke32, changes);
+ return 0;
+}
+
+int
+compat_100_netbsd32_kevent_put_events(void *ctx, struct kevent *events,
+ struct kevent *eventlist, size_t index, int n)
+{
+ struct netbsd32_kevent100 *ke32, *events32 = ctx;
+ int i;
+
+ for (i = 0, ke32 = events32; i < n; i++, ke32++, events++)
+ compat_100_netbsd32_from_kevent(events, ke32);
+ ke32 = ((struct netbsd32_kevent100 *)eventlist) + index;
+ return copyout(events32, ke32, n * sizeof(*events32));
+}
+
+int
+compat_100_netbsd32___kevent50(struct lwp *l,
+ const struct compat_100_netbsd32___kevent50_args *uap, register_t *retval)
+{
+ /* {
+ syscallarg(int) fd;
+ syscallarg(const netbsd32_kevent100p_t) changelist;
+ syscallarg(netbsd32_size_t) nchanges;
+ syscallarg(netbsd32_kevent100p_t) eventlist;
+ syscallarg(netbsd32_size_t) nevents;
+ syscallarg(netbsd32_timespecp_t) timeout;
+ } */
+ struct kevent_ops netbsd32_kevent_ops = {
+ .keo_fetch_timeout = compat_100_netbsd32_kevent_fetch_timeout,
+ .keo_fetch_changes = compat_100_netbsd32_kevent_fetch_changes,
+ .keo_put_events = compat_100_netbsd32_kevent_put_events,
+ };
+
+ return netbsd32_kevent1(retval, SCARG(uap, fd),
+ (netbsd32_keventp_t)SCARG(uap, changelist), SCARG(uap, nchanges),
+ (netbsd32_keventp_t)SCARG(uap, eventlist), SCARG(uap, nevents),
+ SCARG(uap, timeout), &netbsd32_kevent_ops);
+}
+
+static struct syscall_package compat_netbsd32_100_syscalls[] = {
+ { NETBSD32_SYS_compat_100_netbsd32___kevent50, 0,
+ (sy_call_t *)compat_100_netbsd32___kevent50 },
+ { 0, 0, NULL },
+};
MODULE(MODULE_CLASS_EXEC, compat_netbsd32_100, "compat_netbsd32,compat_100");
@@ -47,10 +159,12 @@ compat_netbsd32_100_modcmd(modcmd_t cmd,
switch (cmd) {
case MODULE_CMD_INIT:
- return 0;
+ return syscall_establish(&emul_netbsd32,
+ compat_netbsd32_100_syscalls);
case MODULE_CMD_FINI:
- return 0;
+ return syscall_disestablish(&emul_netbsd32,
+ compat_netbsd32_100_syscalls);
default:
return ENOTTY;
Index: src/sys/compat/netbsd32/netbsd32_compat_50.c
diff -u src/sys/compat/netbsd32/netbsd32_compat_50.c:1.53 src/sys/compat/netbsd32/netbsd32_compat_50.c:1.54
--- src/sys/compat/netbsd32/netbsd32_compat_50.c:1.53 Wed Oct 26 23:23:52 2022
+++ src/sys/compat/netbsd32/netbsd32_compat_50.c Sat Jul 29 12:38:25 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_compat_50.c,v 1.53 2022/10/26 23:23:52 riastradh Exp $ */
+/* $NetBSD: netbsd32_compat_50.c,v 1.54 2023/07/29 12:38:25 rin Exp $ */
/*-
* Copyright (c) 2008, 2020 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_50.c,v 1.53 2022/10/26 23:23:52 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_50.c,v 1.54 2023/07/29 12:38:25 rin Exp $");
#if defined(_KERNEL_OPT)
#include "opt_compat_netbsd.h"
@@ -71,6 +71,7 @@ __KERNEL_RCSID(0, "$NetBSD: netbsd32_com
#include <compat/netbsd32/netbsd32_syscall.h>
#include <compat/netbsd32/netbsd32_syscallargs.h>
#include <compat/netbsd32/netbsd32_conv.h>
+#include <compat/netbsd32/netbsd32_event.h>
#include <compat/sys/mount.h>
#include <compat/sys/time.h>
#include <compat/sys/rnd.h>
@@ -577,7 +578,8 @@ compat_50_netbsd32__lwp_park(struct lwp
}
static int
-netbsd32_kevent_fetch_timeout(const void *src, void *dest, size_t length)
+compat_50_netbsd32_kevent_fetch_timeout(const void *src, void *dest,
+ size_t length)
{
struct netbsd32_timespec50 ts32;
int error;
@@ -591,71 +593,28 @@ netbsd32_kevent_fetch_timeout(const void
return 0;
}
-static int
-netbsd32_kevent_fetch_changes(void *ctx, const struct kevent *changelist,
- struct kevent *changes, size_t index, int n)
-{
- const struct netbsd32_kevent *src =
- (const struct netbsd32_kevent *)changelist;
- struct netbsd32_kevent *kev32, *changes32 = ctx;
- int error, i;
-
- error = copyin(src + index, changes32, n * sizeof(*changes32));
- if (error)
- return error;
- for (i = 0, kev32 = changes32; i < n; i++, kev32++, changes++)
- netbsd32_to_kevent(kev32, changes);
- return 0;
-}
-
-static int
-netbsd32_kevent_put_events(void *ctx, struct kevent *events,
- struct kevent *eventlist, size_t index, int n)
-{
- struct netbsd32_kevent *kev32, *events32 = ctx;
- int i;
-
- for (i = 0, kev32 = events32; i < n; i++, kev32++, events++)
- netbsd32_from_kevent(events, kev32);
- kev32 = (struct netbsd32_kevent *)eventlist;
- return copyout(events32, kev32, n * sizeof(*events32));
-}
-
int
compat_50_netbsd32_kevent(struct lwp *l,
const struct compat_50_netbsd32_kevent_args *uap, register_t *retval)
{
/* {
syscallarg(int) fd;
- syscallarg(netbsd32_keventp_t) changelist;
+ syscallarg(netbsd32_kevent100p_t) changelist;
syscallarg(netbsd32_size_t) nchanges;
- syscallarg(netbsd32_keventp_t) eventlist;
+ syscallarg(netbsd32_kevent100p_t) eventlist;
syscallarg(netbsd32_size_t) nevents;
syscallarg(netbsd32_timespec50p_t) timeout;
} */
- int error;
- size_t maxalloc, nchanges, nevents;
- struct kevent_ops netbsd32_kevent_ops = {
- .keo_fetch_timeout = netbsd32_kevent_fetch_timeout,
- .keo_fetch_changes = netbsd32_kevent_fetch_changes,
- .keo_put_events = netbsd32_kevent_put_events,
+ struct kevent_ops kops = {
+ .keo_fetch_timeout = compat_50_netbsd32_kevent_fetch_timeout,
+ .keo_fetch_changes = compat_100_netbsd32_kevent_fetch_changes,
+ .keo_put_events = compat_100_netbsd32_kevent_put_events,
};
- nchanges = SCARG(uap, nchanges);
- nevents = SCARG(uap, nevents);
- maxalloc = KQ_NEVENTS;
-
- netbsd32_kevent_ops.keo_private =
- kmem_alloc(maxalloc * sizeof(struct netbsd32_kevent), KM_SLEEP);
-
- error = kevent1(retval, SCARG(uap, fd),
- NETBSD32PTR64(SCARG(uap, changelist)), nchanges,
- NETBSD32PTR64(SCARG(uap, eventlist)), nevents,
- NETBSD32PTR64(SCARG(uap, timeout)), &netbsd32_kevent_ops);
-
- kmem_free(netbsd32_kevent_ops.keo_private,
- maxalloc * sizeof(struct netbsd32_kevent));
- return error;
+ return netbsd32_kevent1(retval, SCARG(uap, fd),
+ (netbsd32_keventp_t)SCARG(uap, changelist), SCARG(uap, nchanges),
+ (netbsd32_keventp_t)SCARG(uap, eventlist), SCARG(uap, nevents),
+ (netbsd32_timespecp_t)SCARG(uap, timeout), &kops);
}
int
Index: src/sys/compat/netbsd32/netbsd32_conv.h
diff -u src/sys/compat/netbsd32/netbsd32_conv.h:1.46 src/sys/compat/netbsd32/netbsd32_conv.h:1.47
--- src/sys/compat/netbsd32/netbsd32_conv.h:1.46 Tue Sep 7 11:43:05 2021
+++ src/sys/compat/netbsd32/netbsd32_conv.h Sat Jul 29 12:38:25 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_conv.h,v 1.46 2021/09/07 11:43:05 riastradh Exp $ */
+/* $NetBSD: netbsd32_conv.h,v 1.47 2023/07/29 12:38:25 rin Exp $ */
/*
* Copyright (c) 1998, 2001 Matthew R. Green
@@ -812,6 +812,7 @@ netbsd32_to_kevent(struct netbsd32_keven
ke->fflags = ke32->fflags;
ke->data = ke32->data;
ke->udata = NETBSD32PTR64(ke32->udata);
+ memcpy(&ke->ext, &ke32->ext, sizeof(ke->ext));
}
static __inline void
@@ -825,6 +826,7 @@ netbsd32_from_kevent(struct kevent *ke,
ke32->fflags = ke->fflags;
ke32->data = ke->data;
NETBSD32PTR32(ke32->udata, ke->udata);
+ memcpy(&ke32->ext, &ke->ext, sizeof(ke32->ext));
}
static __inline void
Index: src/sys/compat/netbsd32/netbsd32_event.c
diff -u src/sys/compat/netbsd32/netbsd32_event.c:1.12 src/sys/compat/netbsd32/netbsd32_event.c:1.13
--- src/sys/compat/netbsd32/netbsd32_event.c:1.12 Fri Sep 5 05:26:26 2014
+++ src/sys/compat/netbsd32/netbsd32_event.c Sat Jul 29 12:38:25 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_event.c,v 1.12 2014/09/05 05:26:26 matt Exp $ */
+/* $NetBSD: netbsd32_event.c,v 1.13 2023/07/29 12:38:25 rin Exp $ */
/*
* Copyright (c) 2005 The NetBSD Foundation.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_event.c,v 1.12 2014/09/05 05:26:26 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_event.c,v 1.13 2023/07/29 12:38:25 rin Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -44,6 +44,7 @@ __KERNEL_RCSID(0, "$NetBSD: netbsd32_eve
#include <compat/netbsd32/netbsd32_syscall.h>
#include <compat/netbsd32/netbsd32_syscallargs.h>
#include <compat/netbsd32/netbsd32_conv.h>
+#include <compat/netbsd32/netbsd32_event.h>
static int
netbsd32_kevent_fetch_timeout(const void *src, void *dest, size_t length)
@@ -91,38 +92,44 @@ netbsd32_kevent_put_events(void *ctx, st
}
int
-netbsd32___kevent50(struct lwp *l,
- const struct netbsd32___kevent50_args *uap, register_t *retval)
+netbsd32_kevent1(register_t *retval, int fd,
+ const netbsd32_keventp_t changelist, netbsd32_size_t nchanges,
+ netbsd32_keventp_t eventlist, netbsd32_size_t nevents,
+ netbsd32_timespecp_t timeout, struct kevent_ops *kops)
+{
+ const size_t maxalloc = KQ_NEVENTS;
+ int error;
+
+ kops->keo_private =
+ kmem_alloc(maxalloc * sizeof(struct netbsd32_kevent), KM_SLEEP);
+
+ error = kevent1(retval, fd, NETBSD32PTR64(changelist), nchanges,
+ NETBSD32PTR64(eventlist), nevents, NETBSD32PTR64(timeout), kops);
+
+ kmem_free(kops->keo_private, maxalloc * sizeof(struct netbsd32_kevent));
+ return error;
+}
+
+int
+netbsd32___kevent100(struct lwp *l,
+ const struct netbsd32___kevent100_args *uap, register_t *retval)
{
/* {
syscallarg(int) fd;
- syscallarg(netbsd32_keventp_t) changelist;
+ syscallarg(const netbsd32_keventp_t) changelist;
syscallarg(netbsd32_size_t) nchanges;
syscallarg(netbsd32_keventp_t) eventlist;
syscallarg(netbsd32_size_t) nevents;
syscallarg(netbsd32_timespecp_t) timeout;
} */
- int error;
- size_t maxalloc, nchanges, nevents;
- struct kevent_ops netbsd32_kevent_ops = {
+ struct kevent_ops kops = {
.keo_fetch_timeout = netbsd32_kevent_fetch_timeout,
.keo_fetch_changes = netbsd32_kevent_fetch_changes,
.keo_put_events = netbsd32_kevent_put_events,
};
- nchanges = SCARG(uap, nchanges);
- nevents = SCARG(uap, nevents);
- maxalloc = KQ_NEVENTS;
-
- netbsd32_kevent_ops.keo_private =
- kmem_alloc(maxalloc * sizeof(struct netbsd32_kevent), KM_SLEEP);
-
- error = kevent1(retval, SCARG(uap, fd),
- NETBSD32PTR64(SCARG(uap, changelist)), nchanges,
- NETBSD32PTR64(SCARG(uap, eventlist)), nevents,
- NETBSD32PTR64(SCARG(uap, timeout)), &netbsd32_kevent_ops);
-
- kmem_free(netbsd32_kevent_ops.keo_private,
- maxalloc * sizeof(struct netbsd32_kevent));
- return error;
+ return netbsd32_kevent1(retval, SCARG(uap, fd),
+ SCARG(uap, changelist), SCARG(uap, nchanges),
+ SCARG(uap, eventlist), SCARG(uap, nevents),
+ SCARG(uap, timeout), &kops);
}
Added files:
Index: src/sys/compat/netbsd32/netbsd32_event.h
diff -u /dev/null src/sys/compat/netbsd32/netbsd32_event.h:1.1
--- /dev/null Sat Jul 29 12:38:25 2023
+++ src/sys/compat/netbsd32/netbsd32_event.h Sat Jul 29 12:38:25 2023
@@ -0,0 +1,45 @@
+/* $NetBSD: netbsd32_event.h,v 1.1 2023/07/29 12:38:25 rin Exp $ */
+
+/*
+ * Copyright (c) 2023 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 AUTHOR ``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 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 _NETBSD32_EVENT_H_
+#define _NETBSD32_EVENT_H_
+
+#include <compat/netbsd32/netbsd32.h>
+
+/* netbsd32_event.c */
+int netbsd32_kevent1(register_t *, int, const netbsd32_kevent100p_t,
+ netbsd32_size_t, netbsd32_kevent100p_t, netbsd32_size_t,
+ netbsd32_timespecp_t, struct kevent_ops *);
+
+/* netbsd32_compat_100.c */
+int compat_100_netbsd32_kevent_fetch_changes(void *, const struct kevent *,
+ struct kevent *, size_t, int);
+int compat_100_netbsd32_kevent_put_events(void *, struct kevent *,
+ struct kevent *, size_t, int);
+
+#endif /* !_NETBSD32_EVENT_H_ */