#ifndef _MACHINE_DB_MACHDEP_H_
#define _MACHINE_DB_MACHDEP_H_
#include <sys/param.h>
#include <uvm/uvm_extern.h>
#include <machine/trap.h>
#include <sys/mutex.h>
typedef long db_expr_t;
typedef struct trapframe db_regs_t;
extern db_regs_t ddb_regs;
#define PC_REGS(regs) ((vaddr_t)(regs)->tf_rip)
#define SET_PC_REGS(regs, value) (regs)->tf_rip = (int64_t)(value)
#define BKPT_ADDR(addr) (addr)
#define BKPT_INST 0xcc
#define BKPT_SIZE (1)
#define BKPT_SET(inst) (BKPT_INST)
#define SSF_INST 0x55
#define SSF_SIZE (1)
#define FIXUP_PC_AFTER_BREAK(regs) ((regs)->tf_rip -= BKPT_SIZE)
#define db_clear_single_step(regs) ((regs)->tf_rflags &= ~PSL_T)
#define db_set_single_step(regs) ((regs)->tf_rflags |= PSL_T)
#define IS_BREAKPOINT_TRAP(type, code) ((type) == T_BPTFLT)
#define IS_WATCHPOINT_TRAP(type, code) ((type) == T_TRCTRAP && (code) & 15)
#define I_CALL 0xe8
#define I_CALLI 0xff
#define I_RET 0xc3
#define I_IRET 0xcf
#define inst_trap_return(ins) (((ins)&0xff) == I_IRET)
#define inst_return(ins) (((ins)&0xff) == I_RET)
#define inst_call(ins) (((ins)&0xff) == I_CALL || \
(((ins)&0xff) == I_CALLI && \
((ins)&0x3800) == 0x1000))
int db_ktrap(int, int, db_regs_t *);
void db_machine_init(void);
int db_enter_ddb(void);
void db_startcpu(int);
void db_stopcpu(int);
void x86_ipi_db(struct cpu_info *);
#define DDB_STATE_NOT_RUNNING 0
#define DDB_STATE_RUNNING 1
#define DDB_STATE_EXITING 2
#define DB_MACHINE_COMMANDS
extern void db_machine_init(void);
extern void cpu_debug_dump(void);
#endif