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 */