From owner-p4-projects@FreeBSD.ORG Mon Jun 26 05:49:45 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 84FE216A406; Mon, 26 Jun 2006 05:49:45 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 63A1116A404 for ; Mon, 26 Jun 2006 05:49:45 +0000 (UTC) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 8430F43D83 for ; Mon, 26 Jun 2006 05:49:41 +0000 (GMT) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k5Q5nftX020739 for ; Mon, 26 Jun 2006 05:49:41 GMT (envelope-from jb@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k5Q5nfS7020736 for perforce@freebsd.org; Mon, 26 Jun 2006 05:49:41 GMT (envelope-from jb@freebsd.org) Date: Mon, 26 Jun 2006 05:49:41 GMT Message-Id: <200606260549.k5Q5nfS7020736@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jb@freebsd.org using -f From: John Birrell To: Perforce Change Reviews Cc: Subject: PERFORCE change 100027 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Jun 2006 05:49:45 -0000 http://perforce.freebsd.org/chv.cgi?CH=100027 Change 100027 by jb@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