Home | History | Annotate | Line # | Download | only in include
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