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
11typedef long int db_expr_t;
12typedef vaddr_t db_addr_t;
13typedef ucontext_t db_regs_t;
14
15extern void breakpoint(void);
16extern void kgdb_kernel_trap(int signo,
17	vaddr_t pc, vaddr_t va, ucontext_t *ucp);
18extern int db_validate_address(vaddr_t addr);
19
20/* same as amd64 */
21#ifndef MULTIPROCESSOR
22extern db_regs_t ddb_regs;	/* register state */
23#define	DDB_REGS	(&ddb_regs)
24#else
25extern 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
57typedef	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
88typedef	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