summaryrefslogtreecommitdiff
path: root/usr/src/uts/intel
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/intel')
-rw-r--r--usr/src/uts/intel/amd64/sys/kdi_regs.h49
-rw-r--r--usr/src/uts/intel/kdi/kdi_asm.s6
-rw-r--r--usr/src/uts/intel/kdi/kdi_idt.c3
3 files changed, 58 insertions, 0 deletions
diff --git a/usr/src/uts/intel/amd64/sys/kdi_regs.h b/usr/src/uts/intel/amd64/sys/kdi_regs.h
index 6fe698551f..80cfbd5150 100644
--- a/usr/src/uts/intel/amd64/sys/kdi_regs.h
+++ b/usr/src/uts/intel/amd64/sys/kdi_regs.h
@@ -29,6 +29,8 @@
#ifndef _AMD64_SYS_KDI_REGS_H
#define _AMD64_SYS_KDI_REGS_H
+#include <sys/stddef.h>
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -77,6 +79,53 @@ extern "C" {
#define KDIREG_SP KDIREG_RSP
#define KDIREG_FP KDIREG_RBP
+#if !defined(_ASM)
+
+/*
+ * Handy for debugging krs_gregs; keep in sync with the KDIREG_* above.
+ */
+typedef struct {
+ greg_t kr_savfp;
+ greg_t kr_savpc;
+ greg_t kr_rdi;
+ greg_t kr_rsi;
+ greg_t kr_rdx;
+ greg_t kr_rcx;
+ greg_t kr_r8;
+ greg_t kr_r9;
+ greg_t kr_rax;
+ greg_t kr_rbx;
+ greg_t kr_rbp;
+ greg_t r_r10;
+ greg_t r_r11;
+ greg_t r_r12;
+ greg_t r_r13;
+ greg_t r_r14;
+ greg_t r_r15;
+ greg_t kr_fsbase;
+ greg_t kr_gsbase;
+ greg_t kr_kgsbase;
+ greg_t kr_cr2;
+ greg_t kr_cr3;
+ greg_t kr_ds;
+ greg_t kr_es;
+ greg_t kr_fs;
+ greg_t kr_gs;
+ greg_t kr_trapno;
+ greg_t kr_err;
+ greg_t kr_rip;
+ greg_t kr_cs;
+ greg_t kr_rflags;
+ greg_t kr_rsp;
+ greg_t kr_ss;
+} kdiregs_t;
+
+#if defined(_KERNEL)
+CTASSERT(offsetof(kdiregs_t, kr_ss) == ((KDIREG_NGREG - 1) * sizeof (greg_t)));
+#endif
+
+#endif /* !_ASM */
+
#ifdef __cplusplus
}
#endif
diff --git a/usr/src/uts/intel/kdi/kdi_asm.s b/usr/src/uts/intel/kdi/kdi_asm.s
index edfbea10c7..f106d643f7 100644
--- a/usr/src/uts/intel/kdi/kdi_asm.s
+++ b/usr/src/uts/intel/kdi/kdi_asm.s
@@ -406,6 +406,7 @@
movq %rax, REG_OFF(KDIREG_CR3)(%rsp)
movq REG_OFF(KDIREG_SS)(%rsp), %rax
+ movq %rax, REG_OFF(KDIREG_SAVPC)(%rsp)
xchgq REG_OFF(KDIREG_RIP)(%rsp), %rax
movq %rax, REG_OFF(KDIREG_SS)(%rsp)
@@ -426,6 +427,11 @@
movq REG_OFF(KDIREG_RIP)(%rsp), %rcx
ADD_CRUMB(%rax, KRM_PC, %rcx, %rdx)
+ movq REG_OFF(KDIREG_RSP)(%rsp), %rcx
+ ADD_CRUMB(%rax, KRM_SP, %rcx, %rdx)
+ ADD_CRUMB(%rax, KRM_TRAPNO, $-1, %rdx)
+
+ movq $KDI_CPU_STATE_SLAVE, KRS_CPU_STATE(%rax)
pushq %rax
jmp kdi_save_common_state
diff --git a/usr/src/uts/intel/kdi/kdi_idt.c b/usr/src/uts/intel/kdi/kdi_idt.c
index 6ea4681bce..a5520c72c3 100644
--- a/usr/src/uts/intel/kdi/kdi_idt.c
+++ b/usr/src/uts/intel/kdi/kdi_idt.c
@@ -88,6 +88,9 @@
#define KDI_IDT_DTYPE_KERNEL 0
#define KDI_IDT_DTYPE_BOOT 1
+/* Solely to keep kdiregs_t in the CTF, otherwise unused. */
+kdiregs_t kdi_regs;
+
kdi_cpusave_t *kdi_cpusave;
int kdi_ncpusave;