PERFORCE change 130445 for review
John Birrell
jb at FreeBSD.org
Fri Dec 7 16:26:29 PST 2007
http://perforce.freebsd.org/chv.cgi?CH=130445
Change 130445 by jb at jb_freebsd1 on 2007/12/08 00:25:53
Save some WIP. I really wish this file had been coded in multiple files.
There are too many lines here.
Affected files ...
.. //depot/projects/dtrace/src/sys/contrib/opensolaris/uts/common/dtrace/dtrace.c#2 edit
Differences ...
==== //depot/projects/dtrace/src/sys/contrib/opensolaris/uts/common/dtrace/dtrace.c#2 (text) ====
@@ -66,34 +66,58 @@
* on capital-f functions.
*/
#include <sys/errno.h>
+#if !defined(sun)
+#include <sys/time.h>
+#endif
#include <sys/stat.h>
#include <sys/modctl.h>
#include <sys/conf.h>
#include <sys/systm.h>
+#if defined(sun)
#include <sys/ddi.h>
#include <sys/sunddi.h>
+#endif
#include <sys/cpuvar.h>
#include <sys/kmem.h>
+#if defined(sun)
#include <sys/strsubr.h>
+#endif
#include <sys/sysmacros.h>
#include <sys/dtrace_impl.h>
#include <sys/atomic.h>
#include <sys/cmn_err.h>
+#if defined(sun)
#include <sys/mutex_impl.h>
#include <sys/rwlock_impl.h>
+#endif
#include <sys/ctf_api.h>
+#if defined(sun)
#include <sys/panic.h>
#include <sys/priv_impl.h>
+#endif
#include <sys/policy.h>
+#if defined(sun)
#include <sys/cred_impl.h>
#include <sys/procfs_isa.h>
+#endif
#include <sys/taskq.h>
+#if defined(sun)
#include <sys/mkdev.h>
#include <sys/kdi.h>
+#endif
#include <sys/zone.h>
#include <sys/socket.h>
#include <netinet/in.h>
+/* FreeBSD includes: */
+#if !defined(sun)
+#include <sys/limits.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/vmem.h>
+#include "dtrace_cddl.h"
+#endif
+
/*
* DTrace Tunable Variables
*
@@ -161,7 +185,9 @@
/*
* DTrace Internal Variables
*/
+#if defined(sun)
static dev_info_t *dtrace_devi; /* device info */
+#endif
static vmem_t *dtrace_arena; /* probe ID arena */
static vmem_t *dtrace_minor; /* minor number arena */
static taskq_t *dtrace_taskq; /* task queue */
@@ -222,6 +248,40 @@
static kmutex_t dtrace_provider_lock; /* provider state lock */
static kmutex_t dtrace_meta_lock; /* meta-provider state lock */
+#if !defined(sun)
+MALLOC_DEFINE(M_DTRACE, "dtrace", "Dynamic Trace");
+
+/* XXX FreeBSD hacks. */
+static kmutex_t cpu_lock;
+static kmutex_t mod_lock;
+
+#define cr_suid cr_svuid
+#define cr_sgid cr_svgid
+#define mod_modname pathname
+#define vuprintf vprintf
+#define ttoproc(_a) ((_a)->td_proc)
+#define crgetzoneid(_a) 0
+#define NCPU 32
+#define SNOCD 0
+#define CPU_ON_INTR(_a) 0
+#define M_KMEM M_DTRACE
+
+#define PRIV_EFFECTIVE (1 << 0)
+#define PRIV_DTRACE_KERNEL (1 << 1)
+#define PRIV_DTRACE_PROC (1 << 2)
+#define PRIV_DTRACE_USER (1 << 3)
+#define PRIV_PROC_OWNER (1 << 4)
+#define PRIV_PROC_ZONE (1 << 5)
+#define PRIV_ALL ~0
+
+
+#endif
+
+#if defined(sun)
+#define curcpu CPU->cpu_id
+#endif
+
+
/*
* DTrace Provider Variables
*
@@ -241,8 +301,8 @@
{}
static dtrace_pops_t dtrace_provider_ops = {
- (void (*)(void *, const dtrace_probedesc_t *))dtrace_nullop,
- (void (*)(void *, struct modctl *))dtrace_nullop,
+ (void (*)(void *, dtrace_probedesc_t *))dtrace_nullop,
+ (void (*)(void *, modctl_t *))dtrace_nullop,
(void (*)(void *, dtrace_id_t, void *))dtrace_nullop,
(void (*)(void *, dtrace_id_t, void *))dtrace_nullop,
(void (*)(void *, dtrace_id_t, void *))dtrace_nullop,
@@ -349,7 +409,7 @@
#define DTRACE_ALIGNCHECK(addr, size, flags) \
if (addr & (size - 1)) { \
*flags |= CPU_DTRACE_BADALIGN; \
- cpu_core[CPU->cpu_id].cpuc_dtrace_illval = addr; \
+ cpu_core[curcpu].cpuc_dtrace_illval = addr; \
return (0); \
}
#else
@@ -388,7 +448,7 @@
uint##bits##_t rval; \
int i; \
volatile uint16_t *flags = (volatile uint16_t *) \
- &cpu_core[CPU->cpu_id].cpuc_dtrace_flags; \
+ &cpu_core[curcpu].cpuc_dtrace_flags; \
\
DTRACE_ALIGNCHECK(addr, size, flags); \
\
@@ -403,7 +463,7 @@
* This address falls within a toxic region; return 0. \
*/ \
*flags |= CPU_DTRACE_BADADDR; \
- cpu_core[CPU->cpu_id].cpuc_dtrace_illval = addr; \
+ cpu_core[curcpu].cpuc_dtrace_illval = addr; \
return (0); \
} \
\
@@ -446,6 +506,7 @@
((act)->dta_kind == DTRACEACT_DIFEXPR && \
(act)->dta_difo->dtdo_rtype.dtdt_kind == DIF_TYPE_STRING)
+/* Function prototype definitions: */
static size_t dtrace_strlen(const char *, size_t);
static dtrace_probe_t *dtrace_probe_lookup_id(dtrace_id_t id);
static void dtrace_enabling_provide(dtrace_provider_t *);
@@ -462,6 +523,14 @@
dtrace_optval_t);
static int dtrace_ecb_create_enable(dtrace_probe_t *, void *);
static void dtrace_helper_provider_destroy(dtrace_helper_provider_t *);
+uint16_t dtrace_load16(uintptr_t);
+uint32_t dtrace_load32(uintptr_t);
+uint64_t dtrace_load64(uintptr_t);
+uint8_t dtrace_load8(uintptr_t);
+void dtrace_dynvar_clean(dtrace_dstate_t *);
+dtrace_dynvar_t *dtrace_dynvar(dtrace_dstate_t *, uint_t, dtrace_key_t *,
+ size_t, dtrace_dynvar_op_t, dtrace_mstate_t *, dtrace_vstate_t *);
+uintptr_t dtrace_dif_varstr(uintptr_t, dtrace_state_t *, dtrace_mstate_t *);
/*
* DTrace Probe Context Functions
@@ -672,7 +741,7 @@
dtrace_canload(uint64_t addr, size_t sz, dtrace_mstate_t *mstate,
dtrace_vstate_t *vstate)
{
- volatile uintptr_t *illval = &cpu_core[CPU->cpu_id].cpuc_dtrace_illval;
+ volatile uintptr_t *illval = &cpu_core[curcpu].cpuc_dtrace_illval;
/*
* If we hold the privilege to read from kernel memory, then
@@ -764,7 +833,7 @@
if (s1 == s2 || limit == 0)
return (0);
- flags = (volatile uint16_t *)&cpu_core[CPU->cpu_id].cpuc_dtrace_flags;
+ flags = (volatile uint16_t *)&cpu_core[curcpu].cpuc_dtrace_flags;
do {
if (s1 == NULL) {
@@ -818,13 +887,13 @@
if (kaddr - taddr < tsize) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
- cpu_core[CPU->cpu_id].cpuc_dtrace_illval = kaddr;
+ cpu_core[curcpu].cpuc_dtrace_illval = kaddr;
return (1);
}
if (taddr - kaddr < size) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
- cpu_core[CPU->cpu_id].cpuc_dtrace_illval = taddr;
+ cpu_core[curcpu].cpuc_dtrace_illval = taddr;
return (1);
}
}
@@ -908,7 +977,7 @@
{
volatile uint16_t *flags;
- flags = (volatile uint16_t *)&cpu_core[CPU->cpu_id].cpuc_dtrace_flags;
+ flags = (volatile uint16_t *)&cpu_core[curcpu].cpuc_dtrace_flags;
if (s1 == s2)
return (0);
@@ -977,6 +1046,7 @@
static int
dtrace_priv_proc_common_zone(dtrace_state_t *state)
{
+#if defined(sun)
cred_t *cr, *s_cr = state->dts_cred.dcr_cred;
/*
@@ -990,6 +1060,9 @@
return (1);
return (0);
+#else
+ return (1);
+#endif
}
/*
@@ -997,7 +1070,7 @@
* verify that the process has not setuid or changed credentials.
*/
static int
-dtrace_priv_proc_common_nocd()
+dtrace_priv_proc_common_nocd(void)
{
proc_t *proc;
@@ -1028,7 +1101,7 @@
return (1);
bad:
- cpu_core[CPU->cpu_id].cpuc_dtrace_flags |= CPU_DTRACE_UPRIV;
+ cpu_core[curcpu].cpuc_dtrace_flags |= CPU_DTRACE_UPRIV;
return (0);
}
@@ -1044,7 +1117,7 @@
dtrace_priv_proc_common_nocd())
return (1);
- cpu_core[CPU->cpu_id].cpuc_dtrace_flags |= CPU_DTRACE_UPRIV;
+ cpu_core[curcpu].cpuc_dtrace_flags |= CPU_DTRACE_UPRIV;
return (0);
}
@@ -1055,7 +1128,7 @@
if (state->dts_cred.dcr_action & DTRACE_CRA_PROC)
return (1);
- cpu_core[CPU->cpu_id].cpuc_dtrace_flags |= CPU_DTRACE_UPRIV;
+ cpu_core[curcpu].cpuc_dtrace_flags |= CPU_DTRACE_UPRIV;
return (0);
}
@@ -1066,7 +1139,7 @@
if (state->dts_cred.dcr_action & DTRACE_CRA_KERNEL)
return (1);
- cpu_core[CPU->cpu_id].cpuc_dtrace_flags |= CPU_DTRACE_KPRIV;
+ cpu_core[curcpu].cpuc_dtrace_flags |= CPU_DTRACE_KPRIV;
return (0);
}
@@ -1077,7 +1150,7 @@
if (state->dts_cred.dcr_action & DTRACE_CRA_KERNEL_DESTRUCTIVE)
return (1);
- cpu_core[CPU->cpu_id].cpuc_dtrace_flags |= CPU_DTRACE_KPRIV;
+ cpu_core[curcpu].cpuc_dtrace_flags |= CPU_DTRACE_KPRIV;
return (0);
}
@@ -1188,7 +1261,7 @@
uint64_t hashval = DTRACE_DYNHASH_VALID;
dtrace_dynhash_t *hash = dstate->dtds_hash;
dtrace_dynvar_t *free, *new_free, *next, *dvar, *start, *prev = NULL;
- processorid_t me = CPU->cpu_id, cpu = me;
+ processorid_t me = curcpu, cpu = me;
dtrace_dstate_percpu_t *dcpu = &dstate->dtds_percpu[me];
size_t bucket, ksize;
size_t chunksize = dstate->dtds_chunksize;
@@ -1279,8 +1352,8 @@
while ((lock = *lockp) & 1)
continue;
- if (dtrace_casptr((void *)lockp,
- (void *)lock, (void *)(lock + 1)) == (void *)lock)
+ if (dtrace_casptr((volatile void *)lockp,
+ (volatile void *)lock, (volatile void *)(lock + 1)) == (void *)lock)
break;
}
@@ -2245,7 +2318,7 @@
dtrace_speculation_clean_here(dtrace_state_t *state)
{
dtrace_icookie_t cookie;
- processorid_t cpu = CPU->cpu_id;
+ processorid_t cpu = curcpu;
dtrace_buffer_t *dest = &state->dts_buffer[cpu];
dtrace_specid_t i;
@@ -2442,7 +2515,7 @@
if (mstate->dtms_scratch_ptr + strsz >
mstate->dtms_scratch_base + mstate->dtms_scratch_size) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
- return (NULL);
+ return (0);
}
dtrace_strcpy((const void *)addr, (void *)mstate->dtms_scratch_ptr,
@@ -2504,6 +2577,7 @@
return (mstate->dtms_arg[ndx]);
case DIF_VAR_UREGS: {
+#ifdef DOODAD
klwp_t *lwp;
if (!dtrace_priv_proc(state))
@@ -2511,11 +2585,14 @@
if ((lwp = curthread->t_lwp) == NULL) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
- cpu_core[CPU->cpu_id].cpuc_dtrace_illval = NULL;
+ cpu_core[curcpu].cpuc_dtrace_illval = NULL;
return (0);
}
return (dtrace_getreg(lwp->lwp_regs, ndx));
+#else
+ return (0);
+#endif
}
case DIF_VAR_CURTHREAD:
@@ -2638,7 +2715,7 @@
* uint64_t will contain the caller, which is what
* we're after.
*/
- ustack[2] = NULL;
+ ustack[2] = 0;
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT);
dtrace_getupcstack(ustack, 3);
DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT);
@@ -2676,6 +2753,7 @@
if (!dtrace_priv_proc(state))
return (0);
+#if defined(sun)
/*
* Note that we are assuming that an unanchored probe is
* always due to a high-level interrupt. (And we're assuming
@@ -2693,11 +2771,15 @@
* they leave that task to whomever reaps them.)
*/
return ((uint64_t)curthread->t_procp->p_pidp->pid_id);
+#else
+ return ((uint64_t)curproc->p_pid);
+#endif
case DIF_VAR_PPID:
if (!dtrace_priv_proc(state))
return (0);
+#if defined(sun)
/*
* See comment in DIF_VAR_PID.
*/
@@ -2711,6 +2793,9 @@
* state -- they leave that task to whomever reaps them.)
*/
return ((uint64_t)curthread->t_procp->p_ppid);
+#else
+ return ((uint64_t)curproc->p_ppid);
+#endif
case DIF_VAR_TID:
/*
@@ -2742,6 +2827,7 @@
state, mstate));
case DIF_VAR_ZONENAME:
+#if defined(sun)
if (!dtrace_priv_proc(state))
return (0);
@@ -2760,6 +2846,9 @@
return (dtrace_dif_varstr(
(uintptr_t)curthread->t_procp->p_zone->zone_name,
state, mstate));
+#else
+ return (0);
+#endif
case DIF_VAR_UID:
if (!dtrace_priv_proc(state))
@@ -2843,8 +2932,8 @@
dtrace_key_t *tupregs, int nargs,
dtrace_mstate_t *mstate, dtrace_state_t *state)
{
- volatile uint16_t *flags = &cpu_core[CPU->cpu_id].cpuc_dtrace_flags;
- volatile uintptr_t *illval = &cpu_core[CPU->cpu_id].cpuc_dtrace_illval;
+ volatile uint16_t *flags = &cpu_core[curcpu].cpuc_dtrace_flags;
+ volatile uintptr_t *illval = &cpu_core[curcpu].cpuc_dtrace_illval;
dtrace_vstate_t *vstate = &state->dts_vstate;
union {
@@ -2865,7 +2954,7 @@
case DIF_SUBR_MUTEX_OWNED:
if (!dtrace_canload(tupregs[0].dttk_value, sizeof (kmutex_t),
mstate, vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -2879,7 +2968,7 @@
case DIF_SUBR_MUTEX_OWNER:
if (!dtrace_canload(tupregs[0].dttk_value, sizeof (kmutex_t),
mstate, vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -2894,7 +2983,7 @@
case DIF_SUBR_MUTEX_TYPE_ADAPTIVE:
if (!dtrace_canload(tupregs[0].dttk_value, sizeof (kmutex_t),
mstate, vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -2905,7 +2994,7 @@
case DIF_SUBR_MUTEX_TYPE_SPIN:
if (!dtrace_canload(tupregs[0].dttk_value, sizeof (kmutex_t),
mstate, vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -2918,7 +3007,7 @@
if (!dtrace_canload(tupregs[0].dttk_value, sizeof (uintptr_t),
mstate, vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -2930,7 +3019,7 @@
case DIF_SUBR_RW_WRITE_HELD:
if (!dtrace_canload(tupregs[0].dttk_value, sizeof (krwlock_t),
mstate, vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -2941,7 +3030,7 @@
case DIF_SUBR_RW_ISWRITER:
if (!dtrace_canload(tupregs[0].dttk_value, sizeof (krwlock_t),
mstate, vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -2965,7 +3054,7 @@
}
if (!dtrace_canload(src, size, mstate, vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -2993,7 +3082,7 @@
if (scratch_size < size ||
!DTRACE_INSCRATCH(mstate, scratch_size)) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -3043,7 +3132,7 @@
*/
if (!DTRACE_INSCRATCH(mstate, size)) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -3059,16 +3148,17 @@
case DIF_SUBR_MSGSIZE:
case DIF_SUBR_MSGDSIZE: {
+#ifdef DOODAD
uintptr_t baddr = tupregs[0].dttk_value, daddr;
uintptr_t wptr, rptr;
size_t count = 0;
int cont = 0;
- while (baddr != NULL && !(*flags & CPU_DTRACE_FAULT)) {
+ while (baddr != 0 && !(*flags & CPU_DTRACE_FAULT)) {
if (!dtrace_canload(baddr, sizeof (mblk_t), mstate,
vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -3112,6 +3202,7 @@
if (!(*flags & CPU_DTRACE_FAULT))
regs[rd] = count;
+#endif
break;
}
@@ -3123,7 +3214,11 @@
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT);
for (p = curthread->t_procp; p != NULL; p = p->p_parent) {
+#if defined(sun)
if (p->p_pidp->pid_id == pid) {
+#else
+ if (p->p_pid == pid) {
+#endif
rval = 1;
break;
}
@@ -3176,7 +3271,7 @@
state->dts_options[DTRACEOPT_STRSIZE]);
if (!dtrace_canload(addr, sz + 1, mstate, vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -3199,7 +3294,7 @@
uintptr_t limit = addr + state->dts_options[DTRACEOPT_STRSIZE];
char c, target = (char)tupregs[1].dttk_value;
- for (regs[rd] = NULL; addr < limit; addr++) {
+ for (regs[rd] = 0; addr < limit; addr++) {
if ((c = dtrace_load8(addr)) == target) {
regs[rd] = addr;
@@ -3212,7 +3307,7 @@
}
if (!dtrace_canload(saddr, addr - saddr, mstate, vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -3243,13 +3338,13 @@
regs[rd] = notfound;
if (!dtrace_canload((uintptr_t)addr, len + 1, mstate, vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
if (!dtrace_canload((uintptr_t)substr, sublen + 1, mstate,
vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -3383,17 +3478,17 @@
* since both could be non-scratch addresses.
*/
if (!dtrace_strcanload(tokaddr, size, mstate, vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
if (!DTRACE_INSCRATCH(mstate, size)) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
- if (addr == NULL) {
+ if (addr == 0) {
/*
* If the address specified is NULL, we use our saved
* strtok pointer from the mstate. Note that this
@@ -3412,7 +3507,7 @@
* would fail this access check.
*/
if (!dtrace_strcanload(addr, size, mstate, vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
}
@@ -3452,8 +3547,8 @@
* We return NULL in this case, and we set the saved
* address to NULL as well.
*/
- regs[rd] = NULL;
- mstate->dtms_strtok = NULL;
+ regs[rd] = 0;
+ mstate->dtms_strtok = 0;
break;
}
@@ -3489,7 +3584,7 @@
int64_t i = 0;
if (!dtrace_canload(s, len + 1, mstate, vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -3498,7 +3593,7 @@
if (!DTRACE_INSCRATCH(mstate, size)) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -3530,22 +3625,27 @@
}
case DIF_SUBR_GETMAJOR:
+#ifdef DOODAD
#ifdef _LP64
regs[rd] = (tupregs[0].dttk_value >> NBITSMINOR64) & MAXMAJ64;
#else
regs[rd] = (tupregs[0].dttk_value >> NBITSMINOR) & MAXMAJ;
#endif
+#endif
break;
case DIF_SUBR_GETMINOR:
+#ifdef DOODAD
#ifdef _LP64
regs[rd] = tupregs[0].dttk_value & MAXMIN64;
#else
regs[rd] = tupregs[0].dttk_value & MAXMIN;
#endif
+#endif
break;
case DIF_SUBR_DDI_PATHNAME: {
+#ifdef DOODAD
/*
* This one is a galactic mess. We are going to roughly
* emulate ddi_pathname(), but it's made more complicated
@@ -3568,12 +3668,12 @@
if ((mstate->dtms_access & DTRACE_ACCESS_KERNEL) == 0) {
*flags |= CPU_DTRACE_KPRIV;
*illval = daddr;
- regs[rd] = NULL;
+ regs[rd] = 0;
}
if (!DTRACE_INSCRATCH(mstate, size)) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -3707,7 +3807,7 @@
* node), we're going to use the special path
* "devices".
*/
- if (daddr == NULL)
+ if (daddr == 0)
s = "devices";
len = dtrace_strlen(s, size);
@@ -3730,10 +3830,11 @@
if (end < start)
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
- if (daddr == NULL) {
+ if (daddr == 0) {
regs[rd] = (uintptr_t)end;
mstate->dtms_scratch_ptr += size;
}
+#endif
break;
}
@@ -3747,20 +3848,20 @@
if (!dtrace_strcanload(s1, size, mstate, vstate) ||
!dtrace_strcanload(s2, size, mstate, vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
if (!DTRACE_INSCRATCH(mstate, size)) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
for (;;) {
if (i >= size) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -3773,7 +3874,7 @@
for (;;) {
if (i >= size) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -3797,7 +3898,7 @@
if (!DTRACE_INSCRATCH(mstate, size)) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -3855,13 +3956,13 @@
int start, end;
if (!dtrace_canload(src, len + 1, mstate, vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
if (!DTRACE_INSCRATCH(mstate, size)) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -3983,13 +4084,13 @@
int i = 0, j = 0;
if (!dtrace_strcanload(src, size, mstate, vstate)) {
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
if (!DTRACE_INSCRATCH(mstate, size)) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -4087,6 +4188,7 @@
case DIF_SUBR_INET_NTOA:
case DIF_SUBR_INET_NTOA6:
case DIF_SUBR_INET_NTOP: {
+#ifdef DOODAD
size_t size;
int af, argi, i;
char *base, *end;
@@ -4114,7 +4216,7 @@
size = INET_ADDRSTRLEN;
if (!DTRACE_INSCRATCH(mstate, size)) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
base = (char *)mstate->dtms_scratch_ptr;
@@ -4169,7 +4271,7 @@
size = INET6_ADDRSTRLEN;
if (!DTRACE_INSCRATCH(mstate, size)) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
base = (char *)mstate->dtms_scratch_ptr;
@@ -4279,12 +4381,13 @@
* The user didn't use AH_INET or AH_INET6.
*/
DTRACE_CPUFLAG_SET(CPU_DTRACE_ILLOP);
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
inetout: regs[rd] = (uintptr_t)end + 1;
mstate->dtms_scratch_ptr += size;
+#endif
break;
}
@@ -4309,8 +4412,8 @@
dtrace_statvar_t *svar;
dtrace_dstate_t *dstate = &vstate->dtvs_dynvars;
dtrace_difv_t *v;
- volatile uint16_t *flags = &cpu_core[CPU->cpu_id].cpuc_dtrace_flags;
- volatile uintptr_t *illval = &cpu_core[CPU->cpu_id].cpuc_dtrace_illval;
+ volatile uint16_t *flags = &cpu_core[curcpu].cpuc_dtrace_flags;
+ volatile uintptr_t *illval = &cpu_core[curcpu].cpuc_dtrace_illval;
dtrace_key_t tupregs[DIF_DTR_NREGS + 2]; /* +2 for thread and id */
uint64_t regs[DIF_DIR_NREGS];
@@ -4578,10 +4681,10 @@
uintptr_t s1 = regs[r1];
uintptr_t s2 = regs[r2];
- if (s1 != NULL &&
+ if (s1 != 0 &&
!dtrace_strcanload(s1, sz, mstate, vstate))
break;
- if (s2 != NULL &&
+ if (s2 != 0 &&
!dtrace_strcanload(s2, sz, mstate, vstate))
break;
@@ -4620,7 +4723,7 @@
* then this is to be treated as a
* reference to a NULL variable.
*/
- regs[rd] = NULL;
+ regs[rd] = 0;
} else {
regs[rd] = a + sizeof (uint64_t);
}
@@ -4644,10 +4747,10 @@
if (v->dtdv_type.dtdt_flags & DIF_TF_BYREF) {
uintptr_t a = (uintptr_t)svar->dtsv_data;
- ASSERT(a != NULL);
+ ASSERT(a != 0);
ASSERT(svar->dtsv_size != 0);
- if (regs[rd] == NULL) {
+ if (regs[rd] == 0) {
*(uint8_t *)a = UINT8_MAX;
break;
} else {
@@ -4702,7 +4805,7 @@
sz += sizeof (uint64_t);
ASSERT(svar->dtsv_size == NCPU * sz);
- a += CPU->cpu_id * sz;
+ a += curcpu * sz;
if (*(uint8_t *)a == UINT8_MAX) {
/*
@@ -4710,7 +4813,7 @@
* then this is to be treated as a
* reference to a NULL variable.
*/
- regs[rd] = NULL;
+ regs[rd] = 0;
} else {
regs[rd] = a + sizeof (uint64_t);
}
@@ -4720,7 +4823,7 @@
ASSERT(svar->dtsv_size == NCPU * sizeof (uint64_t));
tmp = (uint64_t *)(uintptr_t)svar->dtsv_data;
- regs[rd] = tmp[CPU->cpu_id];
+ regs[rd] = tmp[curcpu];
break;
case DIF_OP_STLS:
@@ -4741,9 +4844,9 @@
sz += sizeof (uint64_t);
ASSERT(svar->dtsv_size == NCPU * sz);
- a += CPU->cpu_id * sz;
+ a += curcpu * sz;
- if (regs[rd] == NULL) {
+ if (regs[rd] == 0) {
*(uint8_t *)a = UINT8_MAX;
break;
} else {
@@ -4763,7 +4866,7 @@
ASSERT(svar->dtsv_size == NCPU * sizeof (uint64_t));
tmp = (uint64_t *)(uintptr_t)svar->dtsv_data;
- tmp[CPU->cpu_id] = regs[rd];
+ tmp[curcpu] = regs[rd];
break;
case DIF_OP_LDTS: {
@@ -4824,7 +4927,7 @@
* Given that we're storing to thread-local data,
* we need to flush our predicate cache.
*/
- curthread->t_predcache = NULL;
+ curthread->t_predcache = 0;
if (dvar == NULL)
break;
@@ -4995,7 +5098,7 @@
if (size < regs[r1] ||
!DTRACE_INSCRATCH(mstate, size)) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
- regs[rd] = NULL;
+ regs[rd] = 0;
break;
}
@@ -5141,7 +5244,9 @@
c[i++] = ')';
c[i] = '\0';
+#ifdef DOODAD
debug_enter(c);
+#endif
}
static void
@@ -5192,7 +5297,9 @@
curthread->t_dtrace_sig = (uint8_t)sig;
curthread->t_sig_check = 1;
+#ifdef DOODAD
aston(curthread);
+#endif
}
static void
@@ -5204,7 +5311,9 @@
if (!curthread->t_dtrace_stop) {
curthread->t_dtrace_stop = 1;
curthread->t_sig_check = 1;
+#ifdef DOODAD
aston(curthread);
+#endif
}
}
@@ -5213,7 +5322,11 @@
{
hrtime_t now;
volatile uint16_t *flags;
+#if defined(sun)
cpu_t *cpu = CPU;
+#else
+ cpu_t *cpu = pcpu_find(curcpu);
+#endif
if (dtrace_destructive_disallow)
return;
@@ -5257,13 +5370,14 @@
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list