1 /* $NetBSD: db_machdep.h,v 1.5 2023/10/06 11:45:37 skrll Exp $ */ 2 3 /* 4 * Copyright (c) 1995 Carnegie-Mellon University. 5 * All rights reserved. 6 * 7 * Author: Chris G. Demetriou 8 * 9 * Permission to use, copy, modify and distribute this software and 10 * its documentation is hereby granted, provided that both the copyright 11 * notice and this permission notice appear in all copies of the 12 * software, derivative works or modified versions, and any portions 13 * thereof, and that both notices appear in supporting documentation. 14 * 15 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 16 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 17 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 18 * 19 * Carnegie Mellon requests users of this software to return to 20 * 21 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 22 * School of Computer Science 23 * Carnegie Mellon University 24 * Pittsburgh PA 15213-3890 25 * 26 * any improvements or extensions that they make and grant Carnegie the 27 * rights to redistribute these changes. 28 */ 29 30 #ifndef _IA64_DB_MACHDEP_H_ 31 #define _IA64_DB_MACHDEP_H_ 32 33 /* 34 * Machine-dependent defines for new kernel debugger. 35 */ 36 37 #include <sys/lock.h> 38 #include <sys/param.h> 39 #include <uvm/uvm_extern.h> 40 #include <machine/frame.h> 41 #include <machine/ia64_cpu.h> 42 43 typedef vaddr_t db_addr_t; /* address - unsigned */ 44 #define DDB_EXPR_FMT "l" /* expression is long */ 45 typedef long db_expr_t; /* expression - signed */ 46 47 typedef struct trapframe db_regs_t; 48 extern db_regs_t *ddb_regp; /* pointer to current register state */ 49 #define DDB_REGS (ddb_regp) 50 51 #if 0 /* XXX: disabling this until we switch on makectx()and have a proper \ 52 curlwp(). TODO: please switch this back on ASAP */ 53 54 #define PC_REGS(regs) ((db_addr_t)(regs)->tf_special.__spare == 0) ? \ 55 ((db_addr_t)(regs)->tf_special.rp) : \ 56 ((db_addr_t)(regs)->tf_special.iip + (((regs)->tf_special.psr>>41) & 3)) 57 #endif 58 59 #if 1 60 #define PC_REGS(regs) ((db_addr_t)(regs)->tf_special.iip + (((regs)->tf_special.psr>>41) & 3)) 61 #endif 62 63 #define db_set_single_step(regs) ((regs)->tf_special.psr |= IA64_PSR_SS) 64 #define db_clear_single_step(regs) ((regs)->tf_special.psr &= ~IA64_PSR_SS) 65 66 67 68 /* defines to help with manipulating ia64 VLIW instruction bundles and slots */ 69 70 #define TMPL_BITS 5 71 #define TMPL_MASK ((1 << TMPL_BITS) - 1) 72 #define SLOT_BITS 41 73 #define SLOT_COUNT 3 74 #define SLOT_MASK ((1ULL << SLOT_BITS) - 1ULL) 75 #define SLOT_SHIFT(i) (TMPL_BITS+((i)<<3)+(i)) 76 77 #define ADDR_SLOT0(addr) ( (addr) & ~(0xFUL) ) 78 #define SLOT_ADDR(addr) ( (addr) & (0xFUL) ) 79 /* breakpoint address. 80 * Check for violations of pseudo offsets above 2. 81 * Adjust for 32 bit shift within Bundle. 82 */ 83 84 #define BKPT_ADDR(addr) ( (SLOT_ADDR(addr) < SLOT_COUNT) ? \ 85 (ADDR_SLOT0(addr) | (SLOT_ADDR(addr) << 2)) \ 86 : ADDR_SLOT0(addr) ) 87 88 #define BKPT_SIZE 8 89 90 #define BKPT_SET(inst, addr) db_bkpt_set(inst, addr) 91 db_expr_t db_bkpt_set(db_expr_t inst, db_addr_t addr); 92 93 94 #define PC_ADVANCE(regs) db_pc_advance(regs) 95 void db_pc_advance(db_regs_t *); 96 97 #define IS_BREAKPOINT_TRAP(type, code) (type == IA64_VEC_BREAK) 98 #define IS_WATCHPOINT_TRAP(type, code) 0 99 100 101 #define inst_trap_return(ins) (ins & 0) 102 #define inst_return(ins) (ins & 0) 103 #define inst_call(ins) (ins & 0) 104 #define inst_branch(ins) (ins & 0) 105 #define inst_load(ins) (ins & 0) 106 #define inst_store(ins) (ins & 0) 107 #define inst_unconditional_flow_transfer(ins) (ins & 0) 108 109 #define branch_taken(ins, pc, regs) pc 110 111 u_long db_register_value(db_regs_t *, int); 112 int ddb_trap(unsigned long, unsigned long, unsigned long, 113 unsigned long, struct trapframe *); 114 115 int ia64_trap(int, int, db_regs_t *); /* See: trap.c */ 116 117 /* 118 * We define some of our own commands. 119 */ 120 #define DB_MACHINE_COMMANDS 121 122 /* 123 * We use Elf64 symbols in DDB. 124 */ 125 #define DB_ELF_SYMBOLS 126 127 /* 128 * Stuff for KGDB. 129 */ 130 typedef long kgdb_reg_t; 131 #define KGDB_NUMREGS 66 /* from tm-alpha.h, NUM_REGS */ 132 #define KGDB_REG_V0 0 133 #define KGDB_REG_T0 1 134 #define KGDB_REG_T1 2 135 #define KGDB_REG_T2 3 136 #define KGDB_REG_T3 4 137 #define KGDB_REG_T4 5 138 #define KGDB_REG_T5 6 139 #define KGDB_REG_T6 7 140 #define KGDB_REG_T7 8 141 #define KGDB_REG_S0 9 142 #define KGDB_REG_S1 10 143 #define KGDB_REG_S2 11 144 #define KGDB_REG_S3 12 145 #define KGDB_REG_S4 13 146 #define KGDB_REG_S5 14 147 #define KGDB_REG_S6 15 /* FP */ 148 #define KGDB_REG_A0 16 149 #define KGDB_REG_A1 17 150 #define KGDB_REG_A2 18 151 #define KGDB_REG_A3 19 152 #define KGDB_REG_A4 20 153 #define KGDB_REG_A5 21 154 #define KGDB_REG_T8 22 155 #define KGDB_REG_T9 23 156 #define KGDB_REG_T10 24 157 #define KGDB_REG_T11 25 158 #define KGDB_REG_RA 26 159 #define KGDB_REG_T12 27 160 #define KGDB_REG_AT 28 161 #define KGDB_REG_GP 29 162 #define KGDB_REG_SP 30 163 #define KGDB_REG_ZERO 31 164 #define KGDB_REG_F0 32 165 #define KGDB_REG_F1 33 166 #define KGDB_REG_F2 34 167 #define KGDB_REG_F3 35 168 #define KGDB_REG_F4 36 169 #define KGDB_REG_F5 37 170 #define KGDB_REG_F6 38 171 #define KGDB_REG_F7 39 172 #define KGDB_REG_F8 40 173 #define KGDB_REG_F9 41 174 #define KGDB_REG_F10 42 175 #define KGDB_REG_F11 43 176 #define KGDB_REG_F12 44 177 #define KGDB_REG_F13 45 178 #define KGDB_REG_F14 46 179 #define KGDB_REG_F15 47 180 #define KGDB_REG_F16 48 181 #define KGDB_REG_F17 49 182 #define KGDB_REG_F18 50 183 #define KGDB_REG_F19 51 184 #define KGDB_REG_F20 52 185 #define KGDB_REG_F21 53 186 #define KGDB_REG_F22 54 187 #define KGDB_REG_F23 55 188 #define KGDB_REG_F24 56 189 #define KGDB_REG_F25 57 190 #define KGDB_REG_F26 58 191 #define KGDB_REG_F27 59 192 #define KGDB_REG_F28 60 193 #define KGDB_REG_F29 61 194 #define KGDB_REG_F30 62 195 #define KGDB_REG_F31 63 196 #define KGDB_REG_PC 64 197 #define KGDB_REG_VFP 65 198 199 /* Too much? Must be large enough for register transfer. */ 200 #define KGDB_BUFLEN 1024 201 202 #endif /* _IA64_DB_MACHDEP_H_ */ 203