Module Name:    src
Committed By:   pgoyette
Date:           Fri Oct 12 22:30:54 UTC 2018

Modified Files:
        src/sys/compat/common [pgoyette-compat]: compat_50_mod.c compat_mod.h
            rndpseudo_50.c
        src/sys/compat/netbsd32 [pgoyette-compat]: netbsd32_compat_50.c
        src/sys/kern [pgoyette-compat]: compat_stub.c kern_rndq.c
        src/sys/sys [pgoyette-compat]: compat_stub.h

Log Message:
Use a MP-safe hook for the rnd_ioctl compat_50 calls.


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.16 -r1.1.2.17 src/sys/compat/common/compat_50_mod.c
cvs rdiff -u -r1.1.42.22 -r1.1.42.23 src/sys/compat/common/compat_mod.h
cvs rdiff -u -r1.2.38.1 -r1.2.38.2 src/sys/compat/common/rndpseudo_50.c
cvs rdiff -u -r1.32.16.12 -r1.32.16.13 \
    src/sys/compat/netbsd32/netbsd32_compat_50.c
cvs rdiff -u -r1.1.2.26 -r1.1.2.27 src/sys/kern/compat_stub.c
cvs rdiff -u -r1.89.16.3 -r1.89.16.4 src/sys/kern/kern_rndq.c
cvs rdiff -u -r1.1.2.38 -r1.1.2.39 src/sys/sys/compat_stub.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/common/compat_50_mod.c
diff -u src/sys/compat/common/compat_50_mod.c:1.1.2.16 src/sys/compat/common/compat_50_mod.c:1.1.2.17
--- src/sys/compat/common/compat_50_mod.c:1.1.2.16	Sun Sep 23 04:31:17 2018
+++ src/sys/compat/common/compat_50_mod.c	Fri Oct 12 22:30:54 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: compat_50_mod.c,v 1.1.2.16 2018/09/23 04:31:17 pgoyette Exp $	*/
+/*	$NetBSD: compat_50_mod.c,v 1.1.2.17 2018/10/12 22:30:54 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: compat_50_mod.c,v 1.1.2.16 2018/09/23 04:31:17 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: compat_50_mod.c,v 1.1.2.17 2018/10/12 22:30:54 pgoyette Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -85,6 +85,7 @@ compat_50_init(void)
 	puffs_50_init();
 	wsevent_50_init();
 	vnd_50_init();
+	rndpseudo_50_init();
 
 	return error;
 
@@ -105,6 +106,7 @@ compat_50_fini(void)
 {
 	int error = 0;
 
+	rndpseudo_50_fini();
 	vnd_50_fini();
 	wsevent_50_fini();
 	puffs_50_fini();
@@ -146,6 +148,7 @@ compat_50_fini(void)
 	puffs_50_init();
 	wsevent_50_init();
 	vnd_50_init();
+	rndpseudo_50_init();
 
 	return error;
 }

Index: src/sys/compat/common/compat_mod.h
diff -u src/sys/compat/common/compat_mod.h:1.1.42.22 src/sys/compat/common/compat_mod.h:1.1.42.23
--- src/sys/compat/common/compat_mod.h:1.1.42.22	Wed Sep 19 04:12:43 2018
+++ src/sys/compat/common/compat_mod.h	Fri Oct 12 22:30:54 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: compat_mod.h,v 1.1.42.22 2018/09/19 04:12:43 pgoyette Exp $	*/
+/*	$NetBSD: compat_mod.h,v 1.1.42.23 2018/10/12 22:30:54 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -72,6 +72,8 @@ void uipc_syscalls_50_init(void);
 void uipc_syscalls_50_fini(void);
 void vnd_50_init(void);
 void vnd_50_fini(void);
+void rndpseudo_50_init(void);
+void rndpseudo_50_fini(void);
 #endif
 
 #ifdef COMPAT_40

Index: src/sys/compat/common/rndpseudo_50.c
diff -u src/sys/compat/common/rndpseudo_50.c:1.2.38.1 src/sys/compat/common/rndpseudo_50.c:1.2.38.2
--- src/sys/compat/common/rndpseudo_50.c:1.2.38.1	Wed Mar 21 02:01:34 2018
+++ src/sys/compat/common/rndpseudo_50.c	Fri Oct 12 22:30:54 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: rndpseudo_50.c,v 1.2.38.1 2018/03/21 02:01:34 pgoyette Exp $	*/
+/*	$nETbsD: rndpseudo_50.c,v 1.2.38.1 2018/03/21 02:01:34 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1997-2011 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rndpseudo_50.c,v 1.2.38.1 2018/03/21 02:01:34 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rndpseudo_50.c,v 1.2.38.2 2018/10/12 22:30:54 pgoyette Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -40,7 +40,11 @@ __KERNEL_RCSID(0, "$NetBSD: rndpseudo_50
 #include <sys/file.h>
 
 #include <sys/rnd.h>
+#include <sys/module_hook.h>
+#include <sys/compat_stub.h>
+
 #include <compat/sys/rnd.h>
+#include <compat/common/compat_mod.h>
 
 /*
  * Convert from rndsource_t to rndsource50_t, for the results from
@@ -116,3 +120,20 @@ compat_50_rnd_ioctl(struct file *fp, u_l
 
 	return ret;
 }
+
+MODULE_SET_HOOK(rnd_ioctl_50_hook, "rnd_50", compat_50_rnd_ioctl);
+MODULE_UNSET_HOOK(rnd_ioctl_50_hook);
+
+void
+rndpseudo_50_init(void)
+{
+
+	rnd_ioctl_50_hook_set();
+}
+
+void
+rndpseudo_50_fini(void)
+{
+
+	rnd_ioctl_50_hook_unset();
+}

Index: src/sys/compat/netbsd32/netbsd32_compat_50.c
diff -u src/sys/compat/netbsd32/netbsd32_compat_50.c:1.32.16.12 src/sys/compat/netbsd32/netbsd32_compat_50.c:1.32.16.13
--- src/sys/compat/netbsd32/netbsd32_compat_50.c:1.32.16.12	Wed Oct  3 11:59:21 2018
+++ src/sys/compat/netbsd32/netbsd32_compat_50.c	Fri Oct 12 22:30:54 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32_compat_50.c,v 1.32.16.12 2018/10/03 11:59:21 pgoyette Exp $	*/
+/*	$NetBSD: netbsd32_compat_50.c,v 1.32.16.13 2018/10/12 22:30:54 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_50.c,v 1.32.16.12 2018/10/03 11:59:21 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_50.c,v 1.32.16.13 2018/10/12 22:30:54 pgoyette Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -69,6 +69,7 @@ __KERNEL_RCSID(0, "$NetBSD: netbsd32_com
 #include <sys/vfs_syscalls.h>
 #include <sys/rnd.h>
 #include <sys/compat_stub.h>
+#include <sys/module_hook.h>
 
 #include <compat/netbsd32/netbsd32.h>
 #include <compat/netbsd32/netbsd32_syscall.h>
@@ -1030,6 +1031,9 @@ static struct syscall_package compat_net
 	{ 0, 0, NULL }
 }; 
 
+MODULE_SET_HOOK(rnd_ioctl_50_32_hook, "rnd32_50", compat32_50_rnd_ioctl);
+MODULE_UNSET_HOOK(rnd_ioctl_50_32_hook);
+
 MODULE(MODULE_CLASS_EXEC, compat_netbsd32_50, "compat_netbsd32_60,compat_50");
 
 static int
@@ -1039,19 +1043,17 @@ compat_netbsd32_50_modcmd(modcmd_t cmd, 
 
 	switch (cmd) {
 	case MODULE_CMD_INIT:
-		vec_compat32_50_rnd_ioctl = compat32_50_rnd_ioctl;
                 ret = syscall_establish(&emul_netbsd32,
 		    compat_netbsd32_50_syscalls);
-		if (ret)
-			vec_compat32_50_rnd_ioctl = (void *)enosys;
+		if (ret == 0)
+			rnd_ioctl_50_32_hook_set();
 		return ret;
 
 	case MODULE_CMD_FINI:
-		vec_compat32_50_rnd_ioctl = (void *)enosys;
                 ret = syscall_disestablish(&emul_netbsd32,
 		    compat_netbsd32_50_syscalls);
-		if (ret)
-			vec_compat32_50_rnd_ioctl = compat32_50_rnd_ioctl;
+		if (ret == 0)
+			rnd_ioctl_50_32_hook_unset();
 		return ret;
 
 	default:

Index: src/sys/kern/compat_stub.c
diff -u src/sys/kern/compat_stub.c:1.1.2.26 src/sys/kern/compat_stub.c:1.1.2.27
--- src/sys/kern/compat_stub.c:1.1.2.26	Tue Oct  2 01:43:53 2018
+++ src/sys/kern/compat_stub.c	Fri Oct 12 22:30:54 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: compat_stub.c,v 1.1.2.26 2018/10/02 01:43:53 pgoyette Exp $	*/
+/* $NetBSD: compat_stub.c,v 1.1.2.27 2018/10/12 22:30:54 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -176,3 +176,9 @@ struct kern_proc_32_hook_t kern_proc_32_
  * under sunos emulation
  */
 struct get_emul_sunos_hook_t get_emul_sunos_hook;
+
+/*
+ * Hook for rnd_ioctl_50 callbacks
+ */
+struct rnd_ioctl_50_hook_t rnd_ioctl_50_hook;
+struct rnd_ioctl_50_32_hook_t rnd_ioctl_50_32_hook;

Index: src/sys/kern/kern_rndq.c
diff -u src/sys/kern/kern_rndq.c:1.89.16.3 src/sys/kern/kern_rndq.c:1.89.16.4
--- src/sys/kern/kern_rndq.c:1.89.16.3	Sun Sep 23 07:44:13 2018
+++ src/sys/kern/kern_rndq.c	Fri Oct 12 22:30:54 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_rndq.c,v 1.89.16.3 2018/09/23 07:44:13 pgoyette Exp $	*/
+/*	$NetBSD: kern_rndq.c,v 1.89.16.4 2018/10/12 22:30:54 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1997-2013 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_rndq.c,v 1.89.16.3 2018/09/23 07:44:13 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_rndq.c,v 1.89.16.4 2018/10/12 22:30:54 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -53,6 +53,8 @@ __KERNEL_RCSID(0, "$NetBSD: kern_rndq.c,
 #include <sys/rngtest.h>
 #include <sys/file.h>
 #include <sys/systm.h>
+#include <sys/module_hook.h>
+#include <sys/compat_stub.h>
 
 #include <dev/rnd_private.h>
 
@@ -173,11 +175,6 @@ static uint8_t		rnd_testbits[sizeof(rnd_
 
 static rndsave_t	*boot_rsp;
 
-int (*vec_compat_50_rnd_ioctl)(struct file *, u_long, void *) =
-    (void *)enosys;
-int (*vec_compat32_50_rnd_ioctl)(struct file *, u_long, void *) =
-    (void *)enosys;
-
 static inline void
 rnd_printf(const char *fmt, ...)
 {
@@ -1449,6 +1446,14 @@ krs_setflags(krndsource_t *kr, uint32_t 
 	}
 }
 
+MODULE_CALL_HOOK_DECL(rnd_ioctl_50_hook, f, (struct file *, u_long, void *));
+MODULE_CALL_HOOK_DECL(rnd_ioctl_50_32_hook, f, (struct file *, u_long, void *));
+
+MODULE_CALL_HOOK(rnd_ioctl_50_hook, f,
+    (struct file *fp, u_long cmd, void *addr), (fp, cmd, addr), enosys());
+MODULE_CALL_HOOK(rnd_ioctl_50_32_hook, f,
+    (struct file *fp, u_long cmd, void *addr), (fp, cmd, addr), enosys());
+
 int
 rnd_system_ioctl(struct file *fp, u_long cmd, void *addr)
 {
@@ -1495,10 +1500,10 @@ rnd_system_ioctl(struct file *fp, u_long
 		break;
 
 	default:
-		ret = (*vec_compat_50_rnd_ioctl)(fp, cmd, addr);
+		ret = rnd_ioctl_50_hook_f_call(fp, cmd, addr);
 #if defined(_LP64)
 		if (ret == ENOSYS)
-			ret = (*vec_compat32_50_rnd_ioctl)(fp, cmd, addr);
+			ret = rnd_ioctl_50_32_hook_f_call(fp, cmd, addr);
 #endif
 		if (ret == ENOSYS)
 			ret = ENOTTY;

Index: src/sys/sys/compat_stub.h
diff -u src/sys/sys/compat_stub.h:1.1.2.38 src/sys/sys/compat_stub.h:1.1.2.39
--- src/sys/sys/compat_stub.h:1.1.2.38	Tue Oct  2 01:43:53 2018
+++ src/sys/sys/compat_stub.h	Fri Oct 12 22:30:54 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: compat_stub.h,v 1.1.2.38 2018/10/02 01:43:53 pgoyette Exp $	*/
+/* $NetBSD: compat_stub.h,v 1.1.2.39 2018/10/12 22:30:54 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -225,4 +225,10 @@ MODULE_HOOK2(kern_proc_32_hook, (struct 
 struct emul;
 MODULE_HOOK(get_emul_sunos_hook, (const struct emul **));
 
+/*
+ * Hooks for rnd_ioctl_50
+ */
+MODULE_HOOK(rnd_ioctl_50_hook, (struct file *, u_long, void *));
+MODULE_HOOK(rnd_ioctl_50_32_hook, (struct file *, u_long, void *));
+
 #endif	/* _SYS_COMPAT_STUB_H */

Reply via email to