/* $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 #include #include #include #include typedef long int db_expr_t; typedef vaddr_t db_addr_t; typedef ucontext_t db_regs_t; extern void breakpoint(void); extern void kgdb_kernel_trap(int signo, vaddr_t pc, vaddr_t va, ucontext_t *ucp); extern int db_validate_address(vaddr_t addr); /* same as amd64 */ #ifndef MULTIPROCESSOR extern db_regs_t ddb_regs; /* register state */ #define DDB_REGS (&ddb_regs) #else extern db_regs_t *ddb_regp; #define DDB_REGS (ddb_regp) #define ddb_regs (*ddb_regp) #endif /* copied here in verbatim to remove dependencies */ #if defined(__i386__) #define BKPT_SIZE 1 #define BKPT_INST 0xcc /* breakpoint instruction */ #define BKPT_ADDR(addr) (addr) #define BKPT_SET(inst, addr) (BKPT_INST) #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 */ #define BKPT_SIZE 1 #define BKPT_INST 0xcc /* breakpoint instruction */ #define BKPT_ADDR(addr) (addr) #define BKPT_SET(inst, addr) (BKPT_INST) #define db_clear_single_step(regs) _UC_MACHINE_RFLAGS(regs) &= ~PSL_T #define db_set_single_step(regs) _UC_MACHINE_RFLAGS(regs) |= PSL_T #define IS_BREAKPOINT_TRAP(type, code) ((type) == T_BPTFLT) #define IS_WATCHPOINT_TRAP(type, code) (0) #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) (__USE(ins), 0) #define inst_store(ins) (__USE(ins), 0) typedef long kgdb_reg_t; #define KGDB_NUMREGS 20 #define KGDB_BUFLEN 1024 #elif defined(__arm__) #error port kgdb for arm #else #error port me #endif /* commonly #define'd in db_machdep.h */ #define PC_REGS(regs) (_UC_MACHINE_PC(regs)) #define PC_ADVANCE(r) (_UC_MACHINE_PC(r) += BKPT_SIZE) #define FIXUP_PC_AFTER_BREAK(r) (_UC_MACHINE_PC(r) -= BKPT_SIZE) #endif