#ifndef _ARM_DB_MACHDEP_H_
#define _ARM_DB_MACHDEP_H_
#if defined(__arm__)
#include <sys/types.h>
#include <uvm/uvm_extern.h>
#include <arm/armreg.h>
#include <arm/cdefs.h>
#include <machine/frame.h>
#include <machine/trap.h>
typedef vaddr_t db_addr_t;
#define DDB_EXPR_FMT "l"
typedef long db_expr_t;
typedef trapframe_t db_regs_t;
#ifndef MULTIPROCESSOR
extern db_regs_t ddb_regs;
#define DDB_REGS (&ddb_regs)
#else
extern db_regs_t *ddb_regp;
#define DDB_REGS (ddb_regp)
#define ddb_regs (*ddb_regp)
#endif
#define PC_REGS(regs) ((regs)->tf_pc)
#define PC_ADVANCE(r) ((r)->tf_r15 += BKPT_SIZE)
#define BKPT_ADDR(addr) (addr)
#if defined(DDB)
#define BKPT_INST (KERNEL_BREAKPOINT)
#else
#define BKPT_INST (GDB5_BREAKPOINT)
#endif
#define BKPT_SIZE (INSN_SIZE)
#ifdef __ARM_ARCH_BE8
#define BKPT_SET(inst, addr) (bswap32(BKPT_INST))
#else
#define BKPT_SET(inst, addr) (BKPT_INST)
#endif
#define T_FAULT (0)
#define T_BREAKPOINT (1)
#define IS_BREAKPOINT_TRAP(type, code) ((type) == T_BREAKPOINT)
#define IS_WATCHPOINT_TRAP(type, code) (0)
#define inst_trap_return(ins) (0)
#define inst_return(ins) (((ins) & 0x0e108000) == 0x08108000 || \
((ins) & 0x0ff0fff0) == 0x01a0f000)
#define inst_call(ins) (((ins) & 0x0f000000) == 0x0b000000)
#define inst_branch(ins) (((ins) & 0x0f000000) == 0x0a000000 || \
((ins) & 0x0fdffff0) == 0x079ff100 || \
((ins) & 0x0ff0f000) == 0x0590f000)
#define inst_load(ins) (0)
#define inst_store(ins) (0)
#define inst_unconditional_flow_transfer(ins) \
(__SHIFTOUT((ins), INSN_COND_MASK) == INSN_COND_AL \
&& (inst_branch(ins) || inst_call(ins) || inst_return(ins)))
#define getreg_val (0)
#define next_instr_address(pc, bd) ((bd) ? (pc) : ((pc) + INSN_SIZE))
#define DB_MACHINE_COMMANDS
#define SOFTWARE_SSTEP
u_int branch_taken(u_int insn, u_int pc, db_regs_t *db_regs);
int kdb_trap(int, db_regs_t *);
void db_machine_init(void);
int db_validate_address(vaddr_t addr);
#define DB_ELF_SYMBOLS
typedef register_t kgdb_reg_t;
#define KGDB_NUMREGS (16 + 8*3 + 2)
#define KGDB_REGNUM_R0 0
#define KGDB_REGNUM_SPSR 16 + 8*3 + 1
#define KGDB_BUFLEN 1024
extern volatile struct cpu_info *db_onproc;
extern volatile struct cpu_info *db_newcpu;
#elif defined(__aarch64__)
#include <aarch64/db_machdep.h>
#endif
#endif