diff options
Diffstat (limited to 'usr/src/uts/intel')
-rw-r--r-- | usr/src/uts/intel/amd64/sys/kdi_regs.h | 49 | ||||
-rw-r--r-- | usr/src/uts/intel/kdi/kdi_asm.s | 6 | ||||
-rw-r--r-- | usr/src/uts/intel/kdi/kdi_idt.c | 3 |
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; |