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