size_t dtrace_global_maxsize = 16 * 1024;
+/*
+ * This externally visible variable (accessible through the backtick (`)
+ * syntax is provided as a source of well-known, zero-filled memory. Some
+ * translators use this in their implementation.
+ */
+const char dtrace_zero[256] = { 0, };
+
static uint64_t dtrace_vtime_references;
static int dtrace_difo_err(uint_t pc, const char *format, ...)
uintptr_t *stack;
int i;
uint64_t val;
-#ifdef __i386__
- int regmap[] = {
- REG_EAX,
- REG_EDX,
- REG_ECX
- };
-#else
int regmap[] = {
REG_RDI,
REG_RSI,
REG_R8,
REG_R9
};
-#endif
int nreg = sizeof(regmap) / sizeof(regmap[0]) - 1;
for (i = 1; i <= aframes; i++) {
fp = fp->fr_savfp;
if (fp->fr_savpc == (uintptr_t)dtrace_invop_callsite) {
-#ifdef __i386__
/* FIXME */
-#else
- /* FIXME */
-#endif
goto load;
}
*/
arg++;
-#ifndef __i386__
if (arg <= nreg) {
/*
* This should not happen. If the argument was passed in a
- * register then it should have been, ...passed in a reguster.
+ * register then it should have been, ...passed in a register.
*/
DTRACE_CPUFLAG_SET(CPU_DTRACE_ILLOP);
return 0;
}
arg -= nreg + 1;
-#endif
stack = (uintptr_t *)&fp[1];
{
struct pt_regs *rp = task_pt_regs(task);
-#ifdef __i386__
- if (reg > REG_SS) {
- DTRACE_CPUFLAG_SET(CPU_DTRACE_ILLOP);
- return 0;
- }
-
- switch (reg) {
- case REG_GS:
- case REG_FS:
- case REG_ES:
- case REG_DS:
- case REG_CS:
- return rp->cs;
- case REG_EDI:
- return rp->di;
- case REG_ESI:
- return rp->si;
- case REG_EBP:
- return rp->bp;
- case REG_ESP:
- case REG_UESP:
- return rp->sp;
- case REG_EBX:
- return rp->bx;
- case REG_EDX:
- return rp->dx;
- case REG_ECX:
- return rp->cx;
- case REG_EAX:
- return rp->ax;
- case REG_TRAPNO:
- return rp->orig_ax;
- case REG_ERR:
- return rp->di;
- case REG_EIP:
- return rp->ip;
- case REG_EFL:
- return rp->flags;
- case REG_SS:
- return rp->ss;
- default:
- DTRACE_CPUFLAG_SET(CPU_DTRACE_ILLOP);
- return 0;
- }
-#else
int regmap[] = {
REG_RBX, /* 0 -> EBX */
REG_RCX, /* 1 -> ECX */
REG_RSP, /* 15 -> UESP */
REG_SS, /* 16 -> SS */
};
- if (reg > REG_GS) {
+ if (reg > REG_TRAPNO) {
/*
* Convert register alias index into register mapping index.
*/
- reg -= REG_GS + 1;
+ reg -= REG_TRAPNO + 1;
if (reg >= sizeof(regmap) / sizeof(int)) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_ILLOP);
return task->thread.fs;
case REG_GS:
return task->thread.gs;
+ case REG_TRAPNO:
+ return task->thread.trap_nr;
default:
DTRACE_CPUFLAG_SET(CPU_DTRACE_ILLOP);
return 0;
}
-#endif
}
static void dtrace_sync_func(void)
/*
* regset.h information
*/
-#ifdef __i386__
-# define REG_SS 18 /* only stored on a privilege transition */
-# define REG_UESP 17 /* only stored on a privilege transition */
-# define REG_EFL 16
-# define REG_CS 15
-# define REG_EIP 14
-# define REG_ERR 13
-# define REG_TRAPNO 12
-# define REG_EAX 11
-# define REG_ECX 10
-# define REG_EDX 9
-# define REG_EBX 8
-# define REG_ESP 7
-# define REG_EBP 6
-# define REG_ESI 5
-# define REG_EDI 4
-# define REG_DS 3
-# define REG_ES 2
-# define REG_FS 1
-# define REG_GS 0
-#else
-# define REG_GS 24
-# define REG_FS 23
-# define REG_ES 22
-# define REG_DS 21
-# define REG_SS 20
-# define REG_RSP 19
-# define REG_RFL 18
-# define REG_CS 17
-# define REG_RIP 16
-# define REG_ERR 15
-# define REG_TRAPNO 15
-# define REG_RDI 14
-# define REG_RSI 13
-# define REG_RDX 12
-# define REG_RCX 11
-# define REG_RAX 10
-# define REG_R8 9
-# define REG_R9 8
-# define REG_R10 7
-# define REG_R11 6
-# define REG_RBX 5
-# define REG_RBP 4
-# define REG_R12 3
-# define REG_R13 2
-# define REG_R14 1
-# define REG_R15 0
-#endif
+#define REG_TRAPNO 25
+#define REG_GS 24
+#define REG_FS 23
+#define REG_ES 22
+#define REG_DS 21
+#define REG_SS 20
+#define REG_RSP 19
+#define REG_RFL 18
+#define REG_CS 17
+#define REG_RIP 16
+#define REG_ERR 15
+#define REG_RDI 14
+#define REG_RSI 13
+#define REG_RDX 12
+#define REG_RCX 11
+#define REG_RAX 10
+#define REG_R8 9
+#define REG_R9 8
+#define REG_R10 7
+#define REG_R11 6
+#define REG_RBX 5
+#define REG_RBP 4
+#define REG_R12 3
+#define REG_R13 2
+#define REG_R14 1
+#define REG_R15 0
#if defined(__i386__) || defined(__x86_64__)
# define DTRACE_INVOP_PUSHL_EBP 1