volatile uint16_t *flags = &this_cpu_core->cpuc_dtrace_flags;
volatile uintptr_t *illval = &this_cpu_core->cpuc_dtrace_illval;
dtrace_vstate_t *vstate = &state->dts_vstate;
-
- union {
- struct mutex mi;
- uint64_t mx;
- } m;
+ struct mutex mtx;
union {
rwlock_t ri;
break;
case DIF_SUBR_MUTEX_OWNED:
+ regs[rd] = 0;
if (!dtrace_canload(tupregs[0].dttk_value,
- sizeof(struct mutex), mstate, vstate)) {
- regs[rd] = 0;
+ sizeof(struct mutex), mstate, vstate))
+ break;
+
+ dtrace_bcopy((const void *)(uintptr_t)tupregs[0].dttk_value,
+ &mtx, sizeof(struct mutex));
+ if (*flags & CPU_DTRACE_FAULT)
break;
- }
- m.mx = dtrace_load64(tupregs[0].dttk_value);
- regs[rd] = mutex_owned(&m.mi);
+ regs[rd] = mutex_owned(&mtx);
break;
case DIF_SUBR_MUTEX_OWNER:
+ regs[rd] = 0;
if (!dtrace_canload(tupregs[0].dttk_value,
- sizeof(struct mutex), mstate, vstate)) {
- regs[rd] = 0;
+ sizeof(struct mutex), mstate, vstate))
+ break;
+
+ dtrace_bcopy((const void *)(uintptr_t)tupregs[0].dttk_value,
+ &mtx, sizeof(struct mutex));
+ if (*flags & CPU_DTRACE_FAULT)
break;
- }
- m.mx = dtrace_load64(tupregs[0].dttk_value);
#ifdef CONFIG_SMP
- regs[rd] = (uintptr_t)m.mi.owner;
+ regs[rd] = (uintptr_t)mtx.owner;
#else
regs[rd] = 0;
#endif
break;
}
- m.mx = dtrace_load64(tupregs[0].dttk_value);
/*
* On Linux, all mutexes are adaptive.
*/
break;
}
- m.mx = dtrace_load64(tupregs[0].dttk_value);
/*
* On Linux, all mutexes are adaptive.
*/
r2 = DIF_INSTR_R2(instr);
rd = DIF_INSTR_RD(instr);
- dt_dbg_dif(" Executing opcode %d (%d, %d, %d)\n",
+ dt_dbg_dif(" Executing opcode %02x (%02x, %02x, %02x)\n",
DIF_INSTR_OP(instr), r1, r2, rd);
switch (DIF_INSTR_OP(instr)) {