summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_conf.c
diff options
context:
space:
mode:
authormsmith <msmith@FreeBSD.org>2002-01-09 04:58:49 +0000
committermsmith <msmith@FreeBSD.org>2002-01-09 04:58:49 +0000
commitc2656ac96b01ac240f679622b1c4064d136439b5 (patch)
tree7511272f9de296a16a091a2f3b9ff46e52de9b7d /sys/kern/kern_conf.c
parentc5438df911e5179a4be306274f29768e82e5a7d6 (diff)
downloadFreeBSD-src-c2656ac96b01ac240f679622b1c4064d136439b5.zip
FreeBSD-src-c2656ac96b01ac240f679622b1c4064d136439b5.tar.gz
Add a new sysinit SI_SUB_DEVFS. Devfs hooks into the kernel at SI_ORDER_FIRST,
and devices can be created anytime after that. Print a warning if an atttempt is made to create a device too early.
Diffstat (limited to 'sys/kern/kern_conf.c')
-rw-r--r--sys/kern/kern_conf.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c
index 552e67e..a9264a2 100644
--- a/sys/kern/kern_conf.c
+++ b/sys/kern/kern_conf.c
@@ -71,6 +71,8 @@ devfs_create_t *devfs_create_hook;
devfs_destroy_t *devfs_destroy_hook;
int devfs_present;
+static int ready_for_devs;
+
static int free_devt;
SYSCTL_INT(_debug, OID_AUTO, free_devt, CTLFLAG_RW, &free_devt, 0, "");
@@ -288,6 +290,12 @@ make_dev(struct cdevsw *devsw, int minor, uid_t uid, gid_t gid, int perms, const
KASSERT(umajor(makeudev(devsw->d_maj, minor)) == devsw->d_maj,
("Invalid minor (%d) in make_dev", minor));
+ if (!ready_for_devs) {
+ printf("WARNING: Driver mistake: make_dev(%s) called before SI_SUB_DRIVERS\n",
+ fmt);
+ /* XXX panic here once drivers are cleaned up */
+ }
+
dev = makedev(devsw->d_maj, minor);
if (dev->si_flags & SI_NAMED) {
printf( "WARNING: Driver mistake: repeat make_dev(\"%s\")\n",
@@ -454,4 +462,14 @@ sysctl_devname(SYSCTL_HANDLER_ARGS)
SYSCTL_PROC(_kern, OID_AUTO, devname, CTLTYPE_OPAQUE|CTLFLAG_RW|CTLFLAG_ANYBODY,
NULL, 0, sysctl_devname, "", "devname(3) handler");
-
+
+/*
+ * Set ready_for_devs; prior to this point, device creation is not allowed.
+ */
+static void
+dev_set_ready(void *junk)
+{
+ ready_for_devs = 1;
+}
+
+SYSINIT(dev_ready, SI_SUB_DEVFS, SI_ORDER_FIRST, dev_set_ready, NULL);
OpenPOWER on IntegriCloud