Module Name: src Committed By: pgoyette Date: Mon Dec 7 03:25:58 UTC 2015
Modified Files: src/distrib/sets/lists/modules: mi src/sys/compat/common: kern_time_50.c src/sys/dev: clockctl.c src/sys/modules: Makefile Added Files: src/sys/modules/clockctl: Makefile clockctl.ioconf Log Message: Modularize the clockctl pseudo-device and link to the build. To generate a diff of this commit: cvs rdiff -u -r1.80 -r1.81 src/distrib/sets/lists/modules/mi cvs rdiff -u -r1.29 -r1.30 src/sys/compat/common/kern_time_50.c cvs rdiff -u -r1.32 -r1.33 src/sys/dev/clockctl.c cvs rdiff -u -r1.162 -r1.163 src/sys/modules/Makefile cvs rdiff -u -r0 -r1.1 src/sys/modules/clockctl/Makefile \ src/sys/modules/clockctl/clockctl.ioconf Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/sets/lists/modules/mi diff -u src/distrib/sets/lists/modules/mi:1.80 src/distrib/sets/lists/modules/mi:1.81 --- src/distrib/sets/lists/modules/mi:1.80 Thu Dec 3 02:57:47 2015 +++ src/distrib/sets/lists/modules/mi Mon Dec 7 03:25:57 2015 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.80 2015/12/03 02:57:47 pgoyette Exp $ +# $NetBSD: mi,v 1.81 2015/12/07 03:25:57 pgoyette Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. # @@ -34,6 +34,8 @@ ./@MODULEDIR@/cgd/cgd.kmod base-kernel-modules kmod ./@MODULEDIR@/chfs base-kernel-modules kmod ./@MODULEDIR@/chfs/chfs.kmod base-kernel-modules kmod +./@MODULEDIR@/clockctl base-kernel-modules kmod +./@MODULEDIR@/clockctl/clockctl.kmod base-kernel-modules kmod ./@MODULEDIR@/coda base-kernel-modules kmod ./@MODULEDIR@/coda/coda.kmod base-kernel-modules kmod ./@MODULEDIR@/coda5 base-kernel-modules kmod Index: src/sys/compat/common/kern_time_50.c diff -u src/sys/compat/common/kern_time_50.c:1.29 src/sys/compat/common/kern_time_50.c:1.30 --- src/sys/compat/common/kern_time_50.c:1.29 Fri Jul 24 13:02:52 2015 +++ src/sys/compat/common/kern_time_50.c Mon Dec 7 03:25:57 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_time_50.c,v 1.29 2015/07/24 13:02:52 maxv Exp $ */ +/* $NetBSD: kern_time_50.c,v 1.30 2015/12/07 03:25:57 pgoyette Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -29,7 +29,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_time_50.c,v 1.29 2015/07/24 13:02:52 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_time_50.c,v 1.30 2015/12/07 03:25:57 pgoyette Exp $"); #ifdef _KERNEL_OPT #include "opt_aio.h" @@ -542,71 +542,6 @@ compat_50_sys___ntp_gettime30(struct lwp return ENOSYS; #endif } -int -compat50_clockctlioctl(dev_t dev, u_long cmd, void *data, int flags, - struct lwp *l) -{ - int error = 0; - const struct cdevsw *cd = cdevsw_lookup(dev); - - if (cd == NULL || cd->d_ioctl == NULL) - return ENXIO; - - switch (cmd) { - case CLOCKCTL_OSETTIMEOFDAY: { - struct timeval50 tv50; - struct timeval tv; - struct clockctl50_settimeofday *args = data; - - error = copyin(args->tv, &tv50, sizeof(tv50)); - if (error) - return (error); - timeval50_to_timeval(&tv50, &tv); - error = settimeofday1(&tv, false, args->tzp, l, false); - break; - } - case CLOCKCTL_OADJTIME: { - struct timeval atv, oldatv; - struct timeval50 atv50; - struct clockctl50_adjtime *args = data; - - if (args->delta) { - error = copyin(args->delta, &atv50, sizeof(atv50)); - if (error) - return (error); - timeval50_to_timeval(&atv50, &atv); - } - adjtime1(args->delta ? &atv : NULL, - args->olddelta ? &oldatv : NULL, l->l_proc); - if (args->olddelta) { - timeval_to_timeval50(&oldatv, &atv50); - error = copyout(&atv50, args->olddelta, sizeof(atv50)); - } - break; - } - case CLOCKCTL_OCLOCK_SETTIME: { - struct timespec50 tp50; - struct timespec tp; - struct clockctl50_clock_settime *args = data; - - error = copyin(args->tp, &tp50, sizeof(tp50)); - if (error) - return (error); - timespec50_to_timespec(&tp50, &tp); - error = clock_settime1(l->l_proc, args->clock_id, &tp, true); - break; - } - case CLOCKCTL_ONTP_ADJTIME: - /* The ioctl number changed but the data did not change. */ - error = (cd->d_ioctl)(dev, CLOCKCTL_NTP_ADJTIME, - data, flags, l); - break; - default: - error = EINVAL; - } - - return (error); -} void compat_sysctl_time(struct sysctllog **clog) Index: src/sys/dev/clockctl.c diff -u src/sys/dev/clockctl.c:1.32 src/sys/dev/clockctl.c:1.33 --- src/sys/dev/clockctl.c:1.32 Fri Jul 25 08:10:35 2014 +++ src/sys/dev/clockctl.c Mon Dec 7 03:25:57 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: clockctl.c,v 1.32 2014/07/25 08:10:35 dholland Exp $ */ +/* $NetBSD: clockctl.c,v 1.33 2015/12/07 03:25:57 pgoyette Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -31,10 +31,12 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: clockctl.c,v 1.32 2014/07/25 08:10:35 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: clockctl.c,v 1.33 2015/12/07 03:25:57 pgoyette Exp $"); +#ifdef _KERNEL_OPT #include "opt_ntp.h" #include "opt_compat_netbsd.h" +#endif #include <sys/param.h> #include <sys/systm.h> @@ -48,17 +50,28 @@ __KERNEL_RCSID(0, "$NetBSD: clockctl.c,v #include <sys/timex.h> #endif /* NTP */ #include <sys/kauth.h> +#include <sys/module.h> +#include <sys/mutex.h> +#include <sys/once.h> #include <sys/clockctl.h> #ifdef COMPAT_50 #include <compat/sys/clockctl.h> +#include <compat/sys/time_types.h> #endif +kmutex_t clockctl_mtx; +int clockctl_refcnt; + +ONCE_DECL(clockctl_once); + +#include "ioconf.h" + dev_type_ioctl(clockctlioctl); const struct cdevsw clockctl_cdevsw = { - .d_open = nullopen, - .d_close = nullclose, + .d_open = clockctlopen, + .d_close = clockctlclose, .d_read = noread, .d_write = nowrite, .d_ioctl = clockctlioctl, @@ -102,8 +115,102 @@ void clockctlattach(int num) { +/* + * Don't initialize the listener here - it will get handled as part + * of module initialization. + */ +#if 0 clockctl_listener = kauth_listen_scope(KAUTH_SCOPE_SYSTEM, clockctl_listener_cb, NULL); +#endif +} + +/* + * Maintain a refcount for each open/close, so we know when it is + * safe to call devsw_detach() + */ +int +clockctlopen(dev_t dev, int flag, int mode, struct lwp *l) +{ + + mutex_enter(&clockctl_mtx); + clockctl_refcnt++; + mutex_exit(&clockctl_mtx); + + return 0; +} + +int +clockctlclose(dev_t dev, int flag, int mode, struct lwp *l) +{ + + mutex_enter(&clockctl_mtx); + clockctl_refcnt--; + mutex_exit(&clockctl_mtx); + + return 0; +} + +int +clockctl_init(void) +{ + + mutex_init(&clockctl_mtx, MUTEX_DEFAULT, IPL_NONE); + clockctl_refcnt = 0; + return 0; +} + +MODULE(MODULE_CLASS_DRIVER, clockctl, NULL); + +int +clockctl_modcmd(modcmd_t cmd, void *data) +{ + int error; +#ifdef _MODULE + int bmajor, cmajor; +#endif + + error = 0; + + switch (cmd) { + case MODULE_CMD_INIT: + RUN_ONCE(&clockctl_once, clockctl_init); + + clockctl_listener = kauth_listen_scope(KAUTH_SCOPE_SYSTEM, + clockctl_listener_cb, NULL); + +#ifdef _MODULE + bmajor = cmajor = -1; + error = devsw_attach("clockctl", NULL, &bmajor, + &clockctl_cdevsw, &cmajor); + if (error != 0) + kauth_unlisten_scope(clockctl_listener); +#endif + + break; + + case MODULE_CMD_FINI: + mutex_enter(&clockctl_mtx); + if (clockctl_refcnt != 0) { + mutex_exit(&clockctl_mtx); + return EBUSY; + } +#ifdef _MODULE + error = devsw_detach(NULL, &clockctl_cdevsw); +#endif + mutex_exit(&clockctl_mtx); + + if (error == 0) + kauth_unlisten_scope(clockctl_listener); + + break; + + default: + error = ENOTTY; + break; + } + + return error; } int @@ -177,4 +284,70 @@ clockctlioctl( return (error); } +#ifdef COMPAT_50 +int +compat50_clockctlioctl(dev_t dev, u_long cmd, void *data, int flags, + struct lwp *l) +{ + int error = 0; + const struct cdevsw *cd = cdevsw_lookup(dev); + + if (cd == NULL || cd->d_ioctl == NULL) + return ENXIO; + + switch (cmd) { + case CLOCKCTL_OSETTIMEOFDAY: { + struct timeval50 tv50; + struct timeval tv; + struct clockctl50_settimeofday *args = data; + error = copyin(args->tv, &tv50, sizeof(tv50)); + if (error) + return (error); + timeval50_to_timeval(&tv50, &tv); + error = settimeofday1(&tv, false, args->tzp, l, false); + break; + } + case CLOCKCTL_OADJTIME: { + struct timeval atv, oldatv; + struct timeval50 atv50; + struct clockctl50_adjtime *args = data; + + if (args->delta) { + error = copyin(args->delta, &atv50, sizeof(atv50)); + if (error) + return (error); + timeval50_to_timeval(&atv50, &atv); + } + adjtime1(args->delta ? &atv : NULL, + args->olddelta ? &oldatv : NULL, l->l_proc); + if (args->olddelta) { + timeval_to_timeval50(&oldatv, &atv50); + error = copyout(&atv50, args->olddelta, sizeof(atv50)); + } + break; + } + case CLOCKCTL_OCLOCK_SETTIME: { + struct timespec50 tp50; + struct timespec tp; + struct clockctl50_clock_settime *args = data; + + error = copyin(args->tp, &tp50, sizeof(tp50)); + if (error) + return (error); + timespec50_to_timespec(&tp50, &tp); + error = clock_settime1(l->l_proc, args->clock_id, &tp, true); + break; + } + case CLOCKCTL_ONTP_ADJTIME: + /* The ioctl number changed but the data did not change. */ + error = (cd->d_ioctl)(dev, CLOCKCTL_NTP_ADJTIME, + data, flags, l); + break; + default: + error = EINVAL; + } + + return (error); +} +#endif Index: src/sys/modules/Makefile diff -u src/sys/modules/Makefile:1.162 src/sys/modules/Makefile:1.163 --- src/sys/modules/Makefile:1.162 Thu Dec 3 10:38:21 2015 +++ src/sys/modules/Makefile Mon Dec 7 03:25:57 2015 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.162 2015/12/03 10:38:21 pgoyette Exp $ +# $NetBSD: Makefile,v 1.163 2015/12/07 03:25:57 pgoyette Exp $ .include <bsd.own.mk> @@ -16,6 +16,7 @@ SUBDIR+= ccd SUBDIR+= cd9660 SUBDIR+= cgd SUBDIR+= chfs +SUBDIR+= clockctl SUBDIR+= crypto SUBDIR+= coda SUBDIR+= coda5 Added files: Index: src/sys/modules/clockctl/Makefile diff -u /dev/null src/sys/modules/clockctl/Makefile:1.1 --- /dev/null Mon Dec 7 03:25:58 2015 +++ src/sys/modules/clockctl/Makefile Mon Dec 7 03:25:57 2015 @@ -0,0 +1,13 @@ +# $NetBSD: Makefile,v 1.1 2015/12/07 03:25:57 pgoyette Exp $ + +.include "../Makefile.inc" + +.PATH: ${S}/dev + +KMOD= clockctl +IOCONF= clockctl.ioconf +SRCS= clockctl.c + +CPPFLAGS+= -DNTP -DCOMPAT_50 + +.include <bsd.kmodule.mk> Index: src/sys/modules/clockctl/clockctl.ioconf diff -u /dev/null src/sys/modules/clockctl/clockctl.ioconf:1.1 --- /dev/null Mon Dec 7 03:25:58 2015 +++ src/sys/modules/clockctl/clockctl.ioconf Mon Dec 7 03:25:57 2015 @@ -0,0 +1,7 @@ +# $NetBSD: clockctl.ioconf,v 1.1 2015/12/07 03:25:57 pgoyette Exp $ + +ioconf clockctl + +include "conf/files" + +pseudo-device clockctl