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