PERFORCE change 126230 for review
Constantine A. Murenin
cnst at FreeBSD.org
Sun Sep 9 11:00:37 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=126230
Change 126230 by cnst at dale on 2007/09/09 18:00:16
put in a hack for supporting "Sysctl internal magic",
and now hw.sensors tree magically works in sysctl(8)!
dale# sysctl hw.sensors.{lm0.volt{0,1,2,3},cpu{0,1}}
hw.sensors.lm0.volt0: 1.23 VDC (VCore)
hw.sensors.lm0.volt1: 12.30 VDC (+12V)
hw.sensors.lm0.volt2: 3.33 VDC (+3.3V)
hw.sensors.lm0.volt3: 3.31 VDC (+3.3V)
hw.sensors.cpu0.temp0: 28.00 degC
hw.sensors.cpu1.temp0: 28.00 degC
dale#
(All other utilities continue working using a cross-platform
sysctl(3) interface, compatible with OpenBSD.)
Affected files ...
.. //depot/projects/soc2007/cnst-sensors/sys.kern/kern_sensors.c#13 edit
.. //depot/projects/soc2007/cnst-sensors/sys.sys/sensors.h#4 edit
Differences ...
==== //depot/projects/soc2007/cnst-sensors/sys.kern/kern_sensors.c#13 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $P4: //depot/projects/soc2007/cnst-sensors/sys.kern/kern_sensors.c#12 $ */
+/* $P4: //depot/projects/soc2007/cnst-sensors/sys.kern/kern_sensors.c#13 $ */
/* $FreeBSD$ */
/* $OpenBSD: kern_sensors.c,v 1.19 2007/06/04 18:42:05 deraadt Exp $ */
/* $OpenBSD: kern_sysctl.c,v 1.154 2007/06/01 17:29:10 beck Exp $ */
@@ -58,6 +58,11 @@
TAILQ_HEAD(, sensor_task) tasklist = TAILQ_HEAD_INITIALIZER(tasklist);
+#ifndef NOSYSCTL8HACK
+void sensor_sysctl8magic_install(struct ksensordev *);
+void sensor_sysctl8magic_deinstall(struct ksensordev *);
+#endif
+
void
sensordev_install(struct ksensordev *sensdev)
{
@@ -77,6 +82,10 @@
}
sensordev_count++;
mtx_unlock(&Giant);
+
+#ifndef NOSYSCTL8HACK
+ sensor_sysctl8magic_install(sensdev);
+#endif
}
void
@@ -122,6 +131,10 @@
sensordev_count--;
SLIST_REMOVE(&sensordev_list, sensdev, ksensordev, list);
mtx_unlock(&Giant);
+
+#ifndef NOSYSCTL8HACK
+ sensor_sysctl8magic_deinstall(sensdev);
+#endif
}
void
@@ -270,9 +283,66 @@
int sysctl_handle_sensor(SYSCTL_HANDLER_ARGS);
int sysctl_sensors_handler(SYSCTL_HANDLER_ARGS);
+
+#ifndef NOSYSCTL8HACK
+
+SYSCTL_NODE(_hw, OID_AUTO, sensors, CTLFLAG_RD, NULL,
+ "Hardware Sensors sysctl internal magic");
+SYSCTL_NODE(_hw, HW_SENSORS, _sensors, CTLFLAG_RD, sysctl_sensors_handler,
+ "Hardware Sensors XP MIB interface");
+
+#else /* NOSYSCTL8HACK */
+
SYSCTL_NODE(_hw, HW_SENSORS, sensors, CTLFLAG_RD, sysctl_sensors_handler,
"Hardware Sensors");
+#endif /* !NOSYSCTL8HACK */
+
+
+#ifndef NOSYSCTL8HACK
+
+/*
+ * XXX:
+ * FreeBSD's sysctl(9) .oid_handler functionality is not accustomed
+ * for the CTLTYPE_NODE handler to handle the undocumented sysctl
+ * magic calls. As soon as such functionality is developed,
+ * sysctl_sensors_handler() should be converted to handle all such
+ * calls, and these sysctl_add_oid(9) calls should be removed
+ * "with a big axe". This whole sysctl_add_oid(9) business is solely
+ * to please sysctl(8).
+ */
+
+void
+sensor_sysctl8magic_install(struct ksensordev *sensdev)
+{
+ struct sysctl_oid_list *ol;
+ struct sysctl_ctx_list *cl = &sensdev->clist;
+ struct ksensor *s;
+ struct ksensors_head *sh = &sensdev->sensors_list;
+
+ sysctl_ctx_init(cl);
+ ol = SYSCTL_CHILDREN(SYSCTL_ADD_NODE(cl, &SYSCTL_NODE_CHILDREN(_hw,
+ sensors), sensdev->num, sensdev->xname, CTLFLAG_RD, NULL, ""));
+ SLIST_FOREACH(s, sh, list) {
+ char n[32];
+
+ snprintf(n, sizeof(n), "%s%d", sensor_type_s[s->type], s->numt);
+ SYSCTL_ADD_PROC(cl, ol, OID_AUTO, n, CTLTYPE_STRUCT |
+ CTLFLAG_RD, s, 0, sysctl_handle_sensor, "S,sensor", "");
+ }
+}
+
+void
+sensor_sysctl8magic_deinstall(struct ksensordev *sensdev)
+{
+ struct sysctl_ctx_list *cl = &sensdev->clist;
+
+ sysctl_ctx_free(cl);
+}
+
+#endif /* !NOSYSCTL8HACK */
+
+
int
sysctl_handle_sensordev(SYSCTL_HANDLER_ARGS)
{
==== //depot/projects/soc2007/cnst-sensors/sys.sys/sensors.h#4 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $P4: //depot/projects/soc2007/cnst-sensors/sys.sys/sensors.h#3 $ */
+/* $P4: //depot/projects/soc2007/cnst-sensors/sys.sys/sensors.h#4 $ */
/* $FreeBSD$ */
/* $OpenBSD: sensors.h,v 1.23 2007/03/22 16:55:31 deraadt Exp $ */
@@ -53,7 +53,6 @@
SENSOR_MAX_TYPES
};
-#ifndef _KERNEL
static const char * const sensor_type_s[SENSOR_MAX_TYPES + 1] = {
"temp",
"fan",
@@ -72,7 +71,6 @@
"timedelta",
"undefined"
};
-#endif /* !_KERNEL */
#define SENSOR_DRIVE_EMPTY 1
#define SENSOR_DRIVE_READY 2
@@ -123,6 +121,9 @@
#ifdef _KERNEL
#include <sys/queue.h>
+#ifndef NOSYSCTL8HACK
+ #include <sys/sysctl.h>
+#endif
/* Sensor data */
struct ksensor {
@@ -145,6 +146,12 @@
int maxnumt[SENSOR_MAX_TYPES];
int sensors_count;
struct ksensors_head sensors_list;
+#ifndef NOSYSCTL8HACK
+ struct sysctl_ctx_list clist; /* XXX: sysctl(9) .oid_handler() for
+ * CTLTYPE_NODE type doesn't support
+ * the undocumented sysctl magic.
+ */
+#endif /* !NOSYSCTL8HACK */
};
/* struct ksensordev */
More information about the p4-projects
mailing list