PERFORCE change 100027 for review
John Birrell
jb at FreeBSD.org
Mon Jun 26 05:49:45 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=100027
Change 100027 by jb at jb_freebsd2 on 2006/06/26 05:48:50
Implement dof_get_property for FreeBSD. The DOF is in an ASCII hex
string with two characters per byte. This was the easiest and
most compact format for FreeBSD given that we don't have a device
configuration file like Solaris does.
Affected files ...
.. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_dof.c#7 edit
Differences ...
==== //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_dof.c#7 (text+ko) ====
@@ -120,15 +120,47 @@
return (dof);
}
+#if !defined(sun)
+static __inline uchar_t dtrace_dof_char(char c) {
+ switch (c) {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ return (c - '0');
+ case 'A':
+ case 'B':
+ case 'C':
+ case 'D':
+ case 'E':
+ case 'F':
+ return (c - 'A' + 10);
+ case 'a':
+ case 'b':
+ case 'c':
+ case 'd':
+ case 'e':
+ case 'f':
+ return (c - 'a' + 10);
+ }
+}
+#endif
+
static dof_hdr_t *
dtrace_dof_property(const char *name)
{
-#if defined(sun)
uchar_t *buf;
uint64_t loadsz;
unsigned int len, i;
dof_hdr_t *dof;
+#if defined(sun)
/*
* Unfortunately, array of values in .conf files are always (and
* only) interpreted to be integer arrays. We must read our DOF
@@ -162,11 +194,50 @@
dof = kmem_alloc(loadsz, KM_SLEEP);
bcopy(buf, dof, loadsz);
ddi_prop_free(buf);
+#else
+ char *p;
+ char *p_env;
+
+ if ((p_env = getenv(name)) == NULL)
+ return (NULL);
+ len = strlen(p_env) / 2;
+
+ buf = kmem_alloc(len, KM_SLEEP);
+
+ dof = (dof_hdr_t *) buf;
+
+ p = p_env;
+
+ for (i = 0; i < len; i++) {
+ buf[i] = (dtrace_dof_char(p[0]) << 4) |
+ dtrace_dof_char(p[1]);
+ p += 2;
+ }
+
+ freeenv(p_env);
+
+ if (len < sizeof (dof_hdr_t)) {
+ free(buf, M_DTRACE);
+ dtrace_dof_error(NULL, "truncated header");
+ return (NULL);
+ }
+
+ if (len < (loadsz = dof->dofh_loadsz)) {
+ free(buf, M_DTRACE);
+ dtrace_dof_error(NULL, "truncated DOF");
+ return (NULL);
+ }
+
+ if (loadsz >= dtrace_dof_maxsize) {
+ free(buf, M_DTRACE);
+ dtrace_dof_error(NULL, "oversized DOF");
+ return (NULL);
+ }
+
+#endif
+
return (dof);
-#else
- return (NULL);
-#endif
}
static void
More information about the p4-projects
mailing list