1 /* $NetBSD: db_machdep.h,v 1.2 2017/11/06 03:47:48 christos Exp $ */ 2 3 /*- 4 * Copyright (c) 2014 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Matt Thomas of 3am Software Foundry. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 #ifndef _RISCV_DB_MACHDEP_H_ 32 #define _RISCV_DB_MACHDEP_H_ 33 34 #include <riscv/locore.h> /* T_BREAK */ 35 36 #define DB_ELF_SYMBOLS 37 38 typedef vaddr_t db_addr_t; /* address - unsigned */ 39 #define DDB_EXPR_FMT "l" /* expression is long */ 40 typedef long db_expr_t; /* expression - signed */ 41 42 typedef struct trapframe db_regs_t; 43 44 extern const uint32_t __cpu_Debugger_insn[1]; 45 #define DDB_REGS (curcpu()->ci_ddb_regs) 46 47 #define PC_REGS(tf) ((tf)->tf_pc) 48 49 #define PC_ADVANCE(tf) do { \ 50 if (db_get_value((tf)->tf_pc, sizeof(uint32_t), false) == BKPT_INST) \ 51 (tf)->tf_pc += BKPT_SIZE; \ 52 } while(0) 53 54 /* Similar to PC_ADVANCE(), except only advance on cpu_Debugger()'s bpt */ 55 #define PC_BREAK_ADVANCE(tf) do { \ 56 if ((tf)->tf_pc == (register_t) __cpu_Debugger_insn) \ 57 (tf)->tf_pc += BKPT_SIZE; \ 58 } while(0) 59 60 #define BKPT_ADDR(addr) (addr) /* breakpoint address */ 61 #define BKPT_INST 0x00100073 62 #define BKPT_SIZE (sizeof(uint32_t)) /* size of breakpoint inst */ 63 #define BKPT_SET(inst, addr) (BKPT_INST) 64 65 #define IS_BREAKPOINT_TRAP(type, code) ((type) == CAUSE_BREAKPOINT) 66 #define IS_WATCHPOINT_TRAP(type, code) (0) 67 68 /* 69 * Interface to disassembly 70 */ 71 db_addr_t db_disasm_insn(uint32_t insn, db_addr_t loc, bool altfmt); 72 73 74 /* 75 * Entrypoints to DDB for kernel, keyboard drivers, init hook 76 */ 77 void kdb_kbd_trap(db_regs_t *); 78 int kdb_trap(int type, struct trapframe *); 79 80 static inline void 81 db_set_ddb_regs(int type, struct trapframe *tf) 82 { 83 *curcpu()->ci_ddb_regs = *tf; 84 } 85 86 87 /* 88 * Constants for KGDB. 89 */ 90 typedef register_t kgdb_reg_t; 91 #define KGDB_NUMREGS 90 92 #define KGDB_BUFLEN 1024 93 94 /* 95 * RISCV cpus have no hardware single-step. 96 */ 97 #define SOFTWARE_SSTEP 98 99 #define inst_trap_return(ins) ((ins)&0) 100 101 bool inst_branch(uint32_t inst); 102 bool inst_call(uint32_t inst); 103 bool inst_return(uint32_t inst); 104 bool inst_load(uint32_t inst); 105 bool inst_store(uint32_t inst); 106 bool inst_unconditional_flow_transfer(uint32_t inst); 107 db_addr_t branch_taken(uint32_t inst, db_addr_t pc, db_regs_t *regs); 108 db_addr_t next_instr_address(db_addr_t pc, bool bd); 109 110 bool ddb_running_on_this_cpu_p(void); 111 bool ddb_running_on_any_cpu_p(void); 112 void db_resume_others(void); 113 114 #if 0 115 /* 116 * We have machine-dependent commands. 117 */ 118 #define DB_MACHINE_COMMANDS 119 #endif 120 121 #endif /* _RISCV_DB_MACHDEP_H_ */ 122