Module Name: src Committed By: christos Date: Mon Jan 28 15:46:49 UTC 2019
Modified Files: src/sys/compat/common: compat_43_mod.c compat_mod.h tty_43.c tty_60.c src/sys/compat/sys: ttycom.h src/sys/kern: compat_stub.c tty.c src/sys/sys: compat_stub.h Log Message: - provide a hook for the 43 tty ioctls - make the 60 tty ioctl hook look the same - fix the tty code to call both hooks and remove unused lock To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/compat/common/compat_43_mod.c \ src/sys/compat/common/compat_mod.h cvs rdiff -u -r1.31 -r1.32 src/sys/compat/common/tty_43.c cvs rdiff -u -r1.5 -r1.6 src/sys/compat/common/tty_60.c cvs rdiff -u -r1.3 -r1.4 src/sys/compat/sys/ttycom.h cvs rdiff -u -r1.2 -r1.3 src/sys/kern/compat_stub.c cvs rdiff -u -r1.278 -r1.279 src/sys/kern/tty.c cvs rdiff -u -r1.2 -r1.3 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_43_mod.c diff -u src/sys/compat/common/compat_43_mod.c:1.2 src/sys/compat/common/compat_43_mod.c:1.3 --- src/sys/compat/common/compat_43_mod.c:1.2 Sat Jan 26 21:08:39 2019 +++ src/sys/compat/common/compat_43_mod.c Mon Jan 28 10:46:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: compat_43_mod.c,v 1.2 2019/01/27 02:08:39 pgoyette Exp $ */ +/* $NetBSD: compat_43_mod.c,v 1.3 2019/01/28 15:46:49 christos Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: compat_43_mod.c,v 1.2 2019/01/27 02:08:39 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: compat_43_mod.c,v 1.3 2019/01/28 15:46:49 christos Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -67,7 +67,7 @@ compat_43_init(void) if (error != 0) goto out6; - error = tty_43_init(); + error = kern_tty_43_init(); if (error != 0) goto out5; @@ -96,7 +96,7 @@ compat_43_init(void) out3: uipc_syscalls_43_fini(); out4: - tty_43_fini(); + kern_tty_43_fini(); out5: kern_sig_43_fini(); out6: @@ -130,7 +130,7 @@ compat_43_fini(void) if (error != 0) goto out6; - error = tty_43_fini(); + error = kern_tty_43_fini(); if (error != 0) goto out5; @@ -159,7 +159,7 @@ compat_43_fini(void) out3: kern_sig_43_init(); out4: - tty_43_init(); + kern_tty_43_init(); out5: uipc_syscalls_43_init(); out6: Index: src/sys/compat/common/compat_mod.h diff -u src/sys/compat/common/compat_mod.h:1.2 src/sys/compat/common/compat_mod.h:1.3 --- src/sys/compat/common/compat_mod.h:1.2 Sat Jan 26 21:08:39 2019 +++ src/sys/compat/common/compat_mod.h Mon Jan 28 10:46:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: compat_mod.h,v 1.2 2019/01/27 02:08:39 pgoyette Exp $ */ +/* $NetBSD: compat_mod.h,v 1.3 2019/01/28 15:46:49 christos Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -176,8 +176,8 @@ int kern_resource_43_init(void); int kern_resource_43_fini(void); int kern_sig_43_init(void); int kern_sig_43_fini(void); -int tty_43_init(void); -int tty_43_fini(void); +int kern_tty_43_init(void); +int kern_tty_43_fini(void); int uipc_syscalls_43_init(void); int uipc_syscalls_43_fini(void); int vfs_syscalls_43_init(void); Index: src/sys/compat/common/tty_43.c diff -u src/sys/compat/common/tty_43.c:1.31 src/sys/compat/common/tty_43.c:1.32 --- src/sys/compat/common/tty_43.c:1.31 Sat Jan 26 21:08:39 2019 +++ src/sys/compat/common/tty_43.c Mon Jan 28 10:46:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: tty_43.c,v 1.31 2019/01/27 02:08:39 pgoyette Exp $ */ +/* $NetBSD: tty_43.c,v 1.32 2019/01/28 15:46:49 christos Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tty_43.c,v 1.31 2019/01/27 02:08:39 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tty_43.c,v 1.32 2019/01/28 15:46:49 christos Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -78,9 +78,12 @@ __KERNEL_RCSID(0, "$NetBSD: tty_43.c,v 1 #include <sys/file.h> #include <sys/kernel.h> #include <sys/syslog.h> +#include <sys/compat_stub.h> +#include <sys/module_hook.h> #include <sys/ioctl_compat.h> #include <compat/common/compat_mod.h> +#include <compat/sys/ttycom.h> int ttydebug = 0; @@ -114,11 +117,11 @@ static const int compatspcodes[] = { static int ttcompatgetflags(struct tty *); static void ttcompatsetflags(struct tty *, struct termios *); static void ttcompatsetlflags(struct tty *, struct termios *); -int ttcompat(struct tty *, u_long, void *, int, struct lwp *); /*ARGSUSED*/ int -ttcompat(struct tty *tp, u_long com, void *data, int flag, struct lwp *l) +compat_43_ttioctl(struct tty *tp, u_long com, void *data, int flag, + struct lwp *l) { switch (com) { @@ -513,15 +516,15 @@ ttcompatsetlflags(struct tty *tp, struct } int -tty_43_init(void) +kern_tty_43_init(void) { - + MODULE_SET_HOOK(compat_43_ttioctl_hook, "tty_43", compat_43_ttioctl); return 0; } int -tty_43_fini(void) +kern_tty_43_fini(void) { - + MODULE_UNSET_HOOK(compat_43_ttioctl_hook); return 0; } Index: src/sys/compat/common/tty_60.c diff -u src/sys/compat/common/tty_60.c:1.5 src/sys/compat/common/tty_60.c:1.6 --- src/sys/compat/common/tty_60.c:1.5 Sat Jan 26 21:08:39 2019 +++ src/sys/compat/common/tty_60.c Mon Jan 28 10:46:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: tty_60.c,v 1.5 2019/01/27 02:08:39 pgoyette Exp $ */ +/* $NetBSD: tty_60.c,v 1.6 2019/01/28 15:46:49 christos Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tty_60.c,v 1.5 2019/01/27 02:08:39 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tty_60.c,v 1.6 2019/01/28 15:46:49 christos Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -93,21 +93,22 @@ compat_60_ptmget_ioctl(dev_t dev, u_long * COMPAT_60 versions of ttioctl and ptmioctl. */ int -compat_60_ttioctl(dev_t dev, u_long cmd, void *data, int flag, +compat_60_ttioctl(struct tty *tp, u_long cmd, void *data, int flag, struct lwp *l) { switch (cmd) { case COMPAT_60_TIOCPTMGET: case COMPAT_60_TIOCPTSNAME: - return compat_60_ptmget_ioctl(dev, cmd, data, flag, l); + return compat_60_ptmget_ioctl(tp->t_dev, cmd, data, flag, l); default: return EPASSTHROUGH; } } int -compat_60_ptmioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) +compat_60_ptmioctl(dev_t dev, u_long cmd, void *data, int flag, + struct lwp *l) { switch (cmd) { Index: src/sys/compat/sys/ttycom.h diff -u src/sys/compat/sys/ttycom.h:1.3 src/sys/compat/sys/ttycom.h:1.4 --- src/sys/compat/sys/ttycom.h:1.3 Sat Jan 26 21:08:41 2019 +++ src/sys/compat/sys/ttycom.h Mon Jan 28 10:46:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ttycom.h,v 1.3 2019/01/27 02:08:41 pgoyette Exp $ */ +/* $NetBSD: ttycom.h,v 1.4 2019/01/28 15:46:49 christos Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -40,6 +40,8 @@ #include <sys/types.h> #include <sys/ioctl.h> +struct tty; + #ifdef COMPAT_60 /* @@ -57,10 +59,16 @@ struct compat_60_ptmget { #define COMPAT_60_TIOCPTSNAME _IOR('t', 72, struct compat_60_ptmget) #ifdef _KERNEL -int compat_60_ttioctl(dev_t, u_long, void *, int, struct lwp *); +int compat_60_ttioctl(struct tty *, u_long, void *, int, struct lwp *); int compat_60_ptmioctl(dev_t, u_long, void *, int, struct lwp *); #endif #endif /* COMPAT_60 */ +#ifdef COMPAT_43 +#ifdef _KERNEL +int compat_43_ttioctl(struct tty *, u_long, void *, int, struct lwp *); +#endif +#endif + #endif /* !_COMPAT_SYS_TTYCOM_H_ */ Index: src/sys/kern/compat_stub.c diff -u src/sys/kern/compat_stub.c:1.2 src/sys/kern/compat_stub.c:1.3 --- src/sys/kern/compat_stub.c:1.2 Sat Jan 26 21:08:43 2019 +++ src/sys/kern/compat_stub.c Mon Jan 28 10:46:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: compat_stub.c,v 1.2 2019/01/27 02:08:43 pgoyette Exp $ */ +/* $NetBSD: compat_stub.c,v 1.3 2019/01/28 15:46:49 christos Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -166,13 +166,18 @@ struct if_43_ifioctl_hook_t if_43_ifioct */ struct if43_20_hook_t if43_20_hook; +/* + * tty 43 ioctl compatibility + */ +struct compat_43_ttioctl_hook_t compat_43_ttioctl_hook; + /* - * upic_syscalls_40 compatability + * uipc_syscalls_40 compatability */ struct uipc_syscalls_40_hook_t uipc_syscalls_40_hook; /* - * upic_syscalls_50 compatability + * uipc_syscalls_50 compatability */ struct uipc_syscalls_50_hook_t uipc_syscalls_50_hook; Index: src/sys/kern/tty.c diff -u src/sys/kern/tty.c:1.278 src/sys/kern/tty.c:1.279 --- src/sys/kern/tty.c:1.278 Sat Jan 26 21:08:43 2019 +++ src/sys/kern/tty.c Mon Jan 28 10:46:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: tty.c,v 1.278 2019/01/27 02:08:43 pgoyette Exp $ */ +/* $NetBSD: tty.c,v 1.279 2019/01/28 15:46:49 christos Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -63,7 +63,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tty.c,v 1.278 2019/01/27 02:08:43 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tty.c,v 1.279 2019/01/28 15:46:49 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd.h" @@ -209,7 +209,6 @@ static void *tty_sigsih; struct ttylist_head ttylist = TAILQ_HEAD_INITIALIZER(ttylist); int tty_count; kmutex_t tty_lock; -krwlock_t ttcompat_lock; struct ptm_pty *ptm = NULL; @@ -1410,25 +1409,18 @@ ttioctl(struct tty *tp, u_long cmd, void default: break; } + /* We may have to load the compat_60 module for this. */ - for (;;) { - rw_enter(&ttcompat_lock, RW_READER); - MODULE_CALL_HOOK(compat_60_ttioctl_hook, - (tp->t_dev, cmd, data, flag, l), enosys(), error); - if (error != ENOSYS) { - break; - } - rw_exit(&ttcompat_lock); - (void)module_autoload("compat_60", MODULE_CLASS_EXEC); - rw_enter(&ttcompat_lock, RW_READER); - MODULE_CALL_HOOK(compat_60_ttioctl_hook, - (tp->t_dev, cmd, data, flag, l), enosys(), error); - if (error == ENOSYS) { - rw_exit(&ttcompat_lock); - return EPASSTHROUGH; - } - } - rw_exit(&ttcompat_lock); + (void)module_autoload("compat_60", MODULE_CLASS_EXEC); + MODULE_CALL_HOOK(compat_60_ttioctl_hook, + (tp, cmd, data, flag, l), enosys(), error); + if (error != EPASSTHROUGH) + return error; + + /* We may have to load the compat_43 module for this. */ + (void)module_autoload("compat_43", MODULE_CLASS_EXEC); + MODULE_CALL_HOOK(compat_43_ttioctl_hook, + (tp, cmd, data, flag, l), enosys(), error); return error; } return (0); @@ -2928,7 +2920,6 @@ tty_init(void) { mutex_init(&tty_lock, MUTEX_DEFAULT, IPL_VM); - rw_init(&ttcompat_lock); tty_sigsih = softint_establish(SOFTINT_CLOCK, ttysigintr, NULL); KASSERT(tty_sigsih != NULL); Index: src/sys/sys/compat_stub.h diff -u src/sys/sys/compat_stub.h:1.2 src/sys/sys/compat_stub.h:1.3 --- src/sys/sys/compat_stub.h:1.2 Sat Jan 26 21:08:50 2019 +++ src/sys/sys/compat_stub.h Mon Jan 28 10:46:49 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: compat_stub.h,v 1.2 2019/01/27 02:08:50 pgoyette Exp $ */ +/* $NetBSD: compat_stub.h,v 1.3 2019/01/28 15:46:49 christos Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -202,6 +202,14 @@ MODULE_HOOK(if_43_ifioctl_hook, int, MODULE_HOOK(if43_20_hook, int, (u_long)); /* + * tty 43 ioctl compatibility + */ +struct tty; + +MODULE_HOOK(compat_43_ttioctl_hook, int, + (struct tty *, u_long, void *, int, struct lwp *)); + +/* * uipc_syscalls_40 compatability */ @@ -285,7 +293,7 @@ MODULE_HOOK(rnd_ioctl_50_32_hook, int, ( * Hooks for compat_60 ttioctl and ptmioctl */ MODULE_HOOK(compat_60_ttioctl_hook, int, - (dev_t, u_long, void *, int, struct lwp *)); + (struct tty *, u_long, void *, int, struct lwp *)); MODULE_HOOK(compat_60_ptmioctl_hook, int, (dev_t, u_long, void *, int, struct lwp *));