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