1 /* $NetBSD: db_machdep.h,v 1.2 2006/08/30 11:12:04 cherry 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 (at) 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 typedef long db_expr_t; /* expression - signed */ 45 46 typedef struct trapframe db_regs_t; 47 extern db_regs_t *ddb_regp; /* pointer to current register state */ 48 #define DDB_REGS (ddb_regp) 49 50 #if 0 /* XXX: disabling this until we switch on makectx()and have a proper \ 51 curlwp(). TODO: please switch this back on ASAP */ 52 53 #define PC_REGS(regs) ((db_addr_t)(regs)->tf_special.__spare == 0) ? \ 54 ((db_addr_t)(regs)->tf_special.rp) : \ 55 ((db_addr_t)(regs)->tf_special.iip + (((regs)->tf_special.psr>>41) & 3)) 56 #endif 57 58 #if 1 59 #define PC_REGS(regs) ((db_addr_t)(regs)->tf_special.iip + (((regs)->tf_special.psr>>41) & 3)) 60 #endif 61 62 #define db_set_single_step(regs) ((regs)->tf_special.psr |= IA64_PSR_SS) 63 #define db_clear_single_step(regs) ((regs)->tf_special.psr &= ~IA64_PSR_SS) 64 65 66 67 /* defines to help with manipulating ia64 VLIW instruction bundles and slots */ 68 69 #define TMPL_BITS 5 70 #define TMPL_MASK ((1 << TMPL_BITS) - 1) 71 #define SLOT_BITS 41 72 #define SLOT_COUNT 3 73 #define SLOT_MASK ((1ULL << SLOT_BITS) - 1ULL) 74 #define SLOT_SHIFT(i) (TMPL_BITS+((i)<<3)+(i)) 75 76 #define ADDR_SLOT0(addr) ( (addr) & ~(0xFUL) ) 77 #define SLOT_ADDR(addr) ( (addr) & (0xFUL) ) 78 /* breakpoint address. 79 * Check for violations of pseudo offsets above 2. 80 * Adjust for 32 bit shift within Bundle. 81 */ 82 83 #define BKPT_ADDR(addr) ( (SLOT_ADDR(addr) < SLOT_COUNT) ? \ 84 (ADDR_SLOT0(addr) | (SLOT_ADDR(addr) << 2)) \ 85 : ADDR_SLOT0(addr) ) 86 87 #define BKPT_SIZE 8 88 89 #define BKPT_SET(inst, addr) db_bkpt_set(inst, addr) 90 db_expr_t db_bkpt_set(db_expr_t inst, db_addr_t addr); 91 92 93 #define PC_ADVANCE(regs) db_pc_advance(regs) 94 void db_pc_advance(db_regs_t *); 95 96 #define IS_BREAKPOINT_TRAP(type, code) (type == IA64_VEC_BREAK) 97 #define IS_WATCHPOINT_TRAP(type, code) 0 98 99 100 #define inst_trap_return(ins) (ins & 0) 101 #define inst_return(ins) (ins & 0) 102 #define inst_call(ins) (ins & 0) 103 #define inst_branch(ins) (ins & 0) 104 #define inst_load(ins) (ins & 0) 105 #define inst_store(ins) (ins & 0) 106 #define inst_unconditional_flow_transfer(ins) (ins & 0) 107 108 #define branch_taken(ins, pc, regs) pc 109 110 u_long db_register_value(db_regs_t *, int); 111 int ddb_trap(unsigned long, unsigned long, unsigned long, 112 unsigned long, struct trapframe *); 113 114 int ia64_trap(int, int, db_regs_t *); /* See: trap.c */ 115 116 /* 117 * We define some of our own commands. 118 */ 119 #define DB_MACHINE_COMMANDS 120 121 /* 122 * We use Elf64 symbols in DDB. 123 */ 124 #define DB_ELF_SYMBOLS 125 #define DB_ELFSIZE 64 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