db_machdep.h revision 1.3 1 1.3 reinoud /* $NetBSD: db_machdep.h,v 1.3 2018/08/01 09:50:57 reinoud Exp $ */
2 1.1 jmcneill
3 1.3 reinoud #ifndef _USERMODE_DB_MACHDEP_H
4 1.3 reinoud #define _USERMODE_DB_MACHDEP_H
5 1.1 jmcneill
6 1.3 reinoud #include <sys/ucontext.h>
7 1.3 reinoud #include <machine/trap.h>
8 1.3 reinoud #include <machine/psl.h>
9 1.3 reinoud #include <machine/ucontext.h>
10 1.1 jmcneill
11 1.3 reinoud typedef long int db_expr_t;
12 1.3 reinoud typedef vaddr_t db_addr_t;
13 1.3 reinoud typedef ucontext_t db_regs_t;
14 1.3 reinoud
15 1.3 reinoud extern void breakpoint(void);
16 1.3 reinoud extern void kgdb_kernel_trap(int signo,
17 1.3 reinoud vaddr_t pc, vaddr_t va, ucontext_t *ucp);
18 1.3 reinoud extern int db_validate_address(vaddr_t addr);
19 1.3 reinoud
20 1.3 reinoud /* same as amd64 */
21 1.3 reinoud #ifndef MULTIPROCESSOR
22 1.3 reinoud extern db_regs_t ddb_regs; /* register state */
23 1.3 reinoud #define DDB_REGS (&ddb_regs)
24 1.3 reinoud #else
25 1.3 reinoud extern db_regs_t *ddb_regp;
26 1.3 reinoud #define DDB_REGS (ddb_regp)
27 1.3 reinoud #define ddb_regs (*ddb_regp)
28 1.3 reinoud #endif
29 1.3 reinoud
30 1.3 reinoud #if defined(__i386__)
31 1.3 reinoud
32 1.3 reinoud #define BKPT_SIZE 1
33 1.3 reinoud #define BKPT_INST 0xcc /* breakpoint instruction */
34 1.3 reinoud #define BKPT_ADDR(addr) (addr)
35 1.3 reinoud #define BKPT_SET(inst, addr) (BKPT_INST)
36 1.3 reinoud
37 1.3 reinoud #error append db_machdep.h for i386
38 1.3 reinoud
39 1.3 reinoud #elif defined(__x86_64__)
40 1.3 reinoud
41 1.3 reinoud #define DDB_EXPR_FMT "l" /* expression is long */
42 1.3 reinoud #define BKPT_SIZE 1
43 1.3 reinoud #define BKPT_INST 0xcc /* breakpoint instruction */
44 1.3 reinoud #define BKPT_ADDR(addr) (addr)
45 1.3 reinoud #define BKPT_SET(inst, addr) (BKPT_INST)
46 1.3 reinoud
47 1.3 reinoud #define db_clear_single_step(regs) _UC_MACHINE_RFLAGS(regs) &= ~PSL_T
48 1.3 reinoud #define db_set_single_step(regs) _UC_MACHINE_RFLAGS(regs) |= PSL_T
49 1.3 reinoud #define IS_BREAKPOINT_TRAP(type, code) ((type) == T_BPTFLT)
50 1.3 reinoud #define IS_WATCHPOINT_TRAP(type, code) (0)
51 1.3 reinoud
52 1.3 reinoud #define I_CALL 0xe8
53 1.3 reinoud #define I_CALLI 0xff
54 1.3 reinoud #define I_RET 0xc3
55 1.3 reinoud #define I_IRET 0xcf
56 1.3 reinoud
57 1.3 reinoud #define inst_trap_return(ins) (((ins)&0xff) == I_IRET)
58 1.3 reinoud #define inst_return(ins) (((ins)&0xff) == I_RET)
59 1.3 reinoud #define inst_call(ins) (((ins)&0xff) == I_CALL || \
60 1.3 reinoud (((ins)&0xff) == I_CALLI && \
61 1.3 reinoud ((ins)&0x3800) == 0x1000))
62 1.3 reinoud #define inst_load(ins) (__USE(ins), 0)
63 1.3 reinoud #define inst_store(ins) (__USE(ins), 0)
64 1.3 reinoud
65 1.3 reinoud typedef long kgdb_reg_t;
66 1.3 reinoud #define KGDB_NUMREGS 20
67 1.3 reinoud #define KGDB_BUFLEN 1024
68 1.3 reinoud
69 1.3 reinoud #elif defined(__arm__)
70 1.3 reinoud #error port kgdb for arm
71 1.3 reinoud #else
72 1.3 reinoud #error port me
73 1.3 reinoud #endif
74 1.3 reinoud
75 1.3 reinoud /* commonly #define'd in db_machdep.h */
76 1.3 reinoud #define PC_REGS(regs) (_UC_MACHINE_PC(regs))
77 1.3 reinoud #define PC_ADVANCE(r) (_UC_MACHINE_PC(r) += BKPT_SIZE)
78 1.3 reinoud #define FIXUP_PC_AFTER_BREAK(r) (_UC_MACHINE_PC(r) -= BKPT_SIZE)
79 1.3 reinoud
80 1.3 reinoud #endif
81