Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src Modularize the clockctl pseudo-device and link to the build.
details: https://anonhg.NetBSD.org/src/rev/6e41106e119b
branches: trunk
changeset: 342115:6e41106e119b
user: pgoyette <pgoyette%NetBSD.org@localhost>
date: Mon Dec 07 03:25:57 2015 +0000
description:
Modularize the clockctl pseudo-device and link to the build.
diffstat:
distrib/sets/lists/modules/mi | 4 +-
sys/compat/common/kern_time_50.c | 69 +------------
sys/dev/clockctl.c | 181 ++++++++++++++++++++++++++++++++++-
sys/modules/Makefile | 3 +-
sys/modules/clockctl/Makefile | 13 ++
sys/modules/clockctl/clockctl.ioconf | 7 +
6 files changed, 204 insertions(+), 73 deletions(-)
diffs (truncated from 381 to 300 lines):
diff -r 6e802d6f7ec4 -r 6e41106e119b distrib/sets/lists/modules/mi
--- a/distrib/sets/lists/modules/mi Mon Dec 07 03:11:48 2015 +0000
+++ b/distrib/sets/lists/modules/mi Mon Dec 07 03:25:57 2015 +0000
@@ -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
diff -r 6e802d6f7ec4 -r 6e41106e119b sys/compat/common/kern_time_50.c
--- a/sys/compat/common/kern_time_50.c Mon Dec 07 03:11:48 2015 +0000
+++ b/sys/compat/common/kern_time_50.c Mon Dec 07 03:25:57 2015 +0000
@@ -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 @@
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)
diff -r 6e802d6f7ec4 -r 6e41106e119b sys/dev/clockctl.c
--- a/sys/dev/clockctl.c Mon Dec 07 03:11:48 2015 +0000
+++ b/sys/dev/clockctl.c Mon Dec 07 03:25:57 2015 +0000
@@ -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 @@
#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 @@
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 @@
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));
Home |
Main Index |
Thread Index |
Old Index