diff options
| author | reinoud <reinoud@NetBSD.org> | 2018-08-05 18:42:48 +0000 |
|---|---|---|
| committer | reinoud <reinoud@NetBSD.org> | 2018-08-05 18:42:48 +0000 |
| commit | 57dfe2af8371c4ff5afeba540fd31d94d82b782e (patch) | |
| tree | dc3b656d47f51f1fafffb05fb34ccda1fae4d633 /sys/arch/usermode | |
| parent | 30d4cb165f32a363921c7e94f5a4101661457080 (diff) | |
Add KGDB definitions for i386
Diffstat (limited to 'sys/arch/usermode')
| -rw-r--r-- | sys/arch/usermode/include/db_machdep.h | 27 | ||||
| -rw-r--r-- | sys/arch/usermode/include/ucontext.h | 4 | ||||
| -rw-r--r-- | sys/arch/usermode/usermode/cpufunc.S | 8 | ||||
| -rw-r--r-- | sys/arch/usermode/usermode/kgdb_machdep.c | 86 |
4 files changed, 70 insertions, 55 deletions
diff --git a/sys/arch/usermode/include/db_machdep.h b/sys/arch/usermode/include/db_machdep.h index d3c2084882e..2cc645658cd 100644 --- a/sys/arch/usermode/include/db_machdep.h +++ b/sys/arch/usermode/include/db_machdep.h @@ -1,4 +1,4 @@ -/* $NetBSD: db_machdep.h,v 1.3 2018/08/01 09:50:57 reinoud Exp $ */ +/* $NetBSD: db_machdep.h,v 1.4 2018/08/05 18:42:48 reinoud Exp $ */ #ifndef _USERMODE_DB_MACHDEP_H #define _USERMODE_DB_MACHDEP_H @@ -27,6 +27,7 @@ extern db_regs_t *ddb_regp; #define ddb_regs (*ddb_regp) #endif +/* copied here in verbatim to remove dependencies */ #if defined(__i386__) #define BKPT_SIZE 1 @@ -34,8 +35,30 @@ extern db_regs_t *ddb_regp; #define BKPT_ADDR(addr) (addr) #define BKPT_SET(inst, addr) (BKPT_INST) -#error append db_machdep.h for i386 +#define db_clear_single_step(regs) _UC_MACHINE_EFLAGS(regs) &= ~PSL_T +#define db_set_single_step(regs) _UC_MACHINE_EFLAGS(regs) |= PSL_T +#define IS_BREAKPOINT_TRAP(type, code) ((type) == T_BPTFLT) +#define IS_WATCHPOINT_TRAP(type, code) ((type) == T_TRCTRAP && (code) & 15) + +#define I_CALL 0xe8 +#define I_CALLI 0xff +#define I_RET 0xc3 +#define I_IRET 0xcf + +#define inst_trap_return(ins) (((ins)&0xff) == I_IRET) +#define inst_return(ins) (((ins)&0xff) == I_RET) +#define inst_call(ins) (((ins)&0xff) == I_CALL || \ + (((ins)&0xff) == I_CALLI && \ + ((ins)&0x3800) == 0x1000)) +#define inst_load(ins) 0 +#define inst_store(ins) 0 + +typedef int kgdb_reg_t; +#define KGDB_NUMREGS 16 +#define KGDB_BUFLEN 512 + +/* copied here in verbatim to remove dependencies */ #elif defined(__x86_64__) #define DDB_EXPR_FMT "l" /* expression is long */ diff --git a/sys/arch/usermode/include/ucontext.h b/sys/arch/usermode/include/ucontext.h index b31bc5a068d..65434e628c6 100644 --- a/sys/arch/usermode/include/ucontext.h +++ b/sys/arch/usermode/include/ucontext.h @@ -1,4 +1,4 @@ -/* $NetBSD: ucontext.h,v 1.1 2018/08/01 09:52:15 reinoud Exp $ */ +/* $NetBSD: ucontext.h,v 1.2 2018/08/05 18:42:48 reinoud Exp $ */ #ifndef _USERMODE_UCONTEXT_H #define _USERMODE_UCONTEXT_H @@ -9,6 +9,8 @@ #if defined(__i386__) +#define _UC_MACHINE_EFLAGS(uc) ((uc)->uc_mcontext.__gregs[_REG_EFL]) + #elif defined(__x86_64__) #define _UC_MACHINE_RFLAGS(uc) ((uc)->uc_mcontext.__gregs[26]) diff --git a/sys/arch/usermode/usermode/cpufunc.S b/sys/arch/usermode/usermode/cpufunc.S index bc46537c5f2..554abd675b5 100644 --- a/sys/arch/usermode/usermode/cpufunc.S +++ b/sys/arch/usermode/usermode/cpufunc.S @@ -5,10 +5,14 @@ #if defined(__i386__) ENTRY(breakpoint) - .byte 0xcc // BKPT_INST + pushl %ebp + movl %esp, %ebp + int $0x03 /* paranoid, not 'int3' */ + popl %ebp ret +END(breakpoint) -#error implement setjmp/longjmp for i386 +//#error TODO implement setjmp/longjmp for i386? #elif defined(__amd64__) ENTRY(breakpoint) diff --git a/sys/arch/usermode/usermode/kgdb_machdep.c b/sys/arch/usermode/usermode/kgdb_machdep.c index 618007008be..900dd22c9ac 100644 --- a/sys/arch/usermode/usermode/kgdb_machdep.c +++ b/sys/arch/usermode/usermode/kgdb_machdep.c @@ -1,4 +1,4 @@ -/* $NetBSD: kgdb_machdep.c,v 1.3 2018/08/01 10:24:41 reinoud Exp $ */ +/* $NetBSD: kgdb_machdep.c,v 1.4 2018/08/05 18:42:48 reinoud Exp $ */ /* * Copyright (c) 1996 Matthias Pfaller. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kgdb_machdep.c,v 1.3 2018/08/01 10:24:41 reinoud Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kgdb_machdep.c,v 1.4 2018/08/05 18:42:48 reinoud Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" @@ -127,34 +127,25 @@ kgdb_getregs(db_regs_t *regs, kgdb_reg_t *gdb_regs) gdb_regs[19] = gregs[_REG_SS]; #elif defined(__i386) - gdb_regs[ 0] = regs->tf_eax; - gdb_regs[ 1] = regs->tf_ecx; - gdb_regs[ 2] = regs->tf_edx; - gdb_regs[ 3] = regs->tf_ebx; - gdb_regs[ 4] = regs->tf_esp; - gdb_regs[ 5] = regs->tf_ebp; - gdb_regs[ 6] = regs->tf_esi; - gdb_regs[ 7] = regs->tf_edi; - gdb_regs[ 8] = regs->tf_eip; - gdb_regs[ 9] = regs->tf_eflags; - gdb_regs[10] = regs->tf_cs; - gdb_regs[11] = regs->tf_ss; - gdb_regs[12] = regs->tf_ds; - gdb_regs[13] = regs->tf_es; - gdb_regs[14] = regs->tf_fs; - gdb_regs[15] = regs->tf_gs; - -/*XXX OOPS XXX? */ -#if 0 - if (KERNELMODE(regs->tf_cs)) { - /* - * Kernel mode - esp and ss not saved. - */ - gdb_regs[ 4] = (kgdb_reg_t)®s->tf_esp; /* kernel stack - pointer */ - gdb_regs[11] = x86_getss(); - } -#endif + kgdb_reg_t *gregs = regs->uc_mcontext.__gregs; + + gdb_regs[ 0] = gregs[_REG_EAX]; + gdb_regs[ 1] = gregs[_REG_ECX]; + gdb_regs[ 2] = gregs[_REG_EDX]; + gdb_regs[ 3] = gregs[_REG_EBX]; + gdb_regs[ 4] = gregs[_REG_ESP]; + gdb_regs[ 5] = gregs[_REG_EBP]; + gdb_regs[ 6] = gregs[_REG_ESI]; + gdb_regs[ 7] = gregs[_REG_EDI]; + gdb_regs[ 8] = gregs[_REG_EIP]; + gdb_regs[ 9] = gregs[_REG_EFL]; + gdb_regs[10] = gregs[_REG_CS]; + gdb_regs[11] = gregs[_REG_SS]; + gdb_regs[12] = gregs[_REG_DS]; + gdb_regs[13] = gregs[_REG_ES]; + gdb_regs[14] = gregs[_REG_FS]; + gdb_regs[15] = gregs[_REG_GS]; + #else #error port kgdb_machdep.c kgdb_getregs #endif @@ -192,26 +183,21 @@ kgdb_setregs(db_regs_t *regs, kgdb_reg_t *gdb_regs) gregs[_REG_SS ] = gdb_regs[19]; #elif defined(__i386) panic("%s", __func__); - regs->tf_eax = gdb_regs[ 0]; - regs->tf_ecx = gdb_regs[ 1]; - regs->tf_edx = gdb_regs[ 2]; - regs->tf_ebx = gdb_regs[ 3]; - regs->tf_ebp = gdb_regs[ 5]; - regs->tf_esi = gdb_regs[ 6]; - regs->tf_edi = gdb_regs[ 7]; - regs->tf_eip = gdb_regs[ 8]; - regs->tf_eflags = gdb_regs[ 9]; - regs->tf_cs = gdb_regs[10]; - regs->tf_ds = gdb_regs[12]; - regs->tf_es = gdb_regs[13]; - - if (KERNELMODE(regs->tf_cs) == 0) { - /* - * Trapped in user mode - restore esp and ss. - */ - regs->tf_esp = gdb_regs[ 4]; - regs->tf_ss = gdb_regs[11]; - } + kgdb_reg_t *gregs = regs->uc_mcontext.__gregs; + + gregs[_REG_EAX] = gdb_regs[ 0]; + gregs[_REG_ECX] = gdb_regs[ 1]; + gregs[_REG_EDX] = gdb_regs[ 2]; + gregs[_REG_EBX] = gdb_regs[ 3]; + gregs[_REG_EBP] = gdb_regs[ 5]; + gregs[_REG_ESI] = gdb_regs[ 6]; + gregs[_REG_EDI] = gdb_regs[ 7]; + gregs[_REG_EIP] = gdb_regs[ 8]; + gregs[_REG_EFL] = gdb_regs[ 9]; + gregs[_REG_CS] = gdb_regs[10]; + gregs[_REG_DS] = gdb_regs[12]; + gregs[_REG_ES] = gdb_regs[13]; + #else panic("%s", __func__); #endif |
