1 /* $NetBSD: db_interface.c,v 1.22 2010/06/04 09:25:18 skrll Exp $ */ 2 3 /* $OpenBSD: db_interface.c,v 1.16 2001/03/22 23:31:45 mickey Exp $ */ 4 5 /* 6 * Copyright (c) 1999-2003 Michael Shalayeff 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21 * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT, 22 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24 * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 26 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 27 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 28 * THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include <sys/cdefs.h> 32 __KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.22 2010/06/04 09:25:18 skrll Exp $"); 33 34 #include <sys/param.h> 35 #include <sys/systm.h> 36 #include <sys/proc.h> 37 38 #include <machine/db_machdep.h> 39 #include <machine/frame.h> 40 #include <machine/cpufunc.h> 41 42 #include <ddb/db_access.h> 43 #include <ddb/db_command.h> 44 #include <ddb/db_output.h> 45 #include <ddb/db_run.h> 46 #include <ddb/db_sym.h> 47 #include <ddb/db_variables.h> 48 #include <ddb/db_extern.h> 49 #include <ddb/db_interface.h> 50 #include <ddb/ddbvar.h> 51 52 #include <dev/cons.h> 53 54 void kdbprinttrap(int, int); 55 56 extern label_t *db_recover; 57 extern int db_active; 58 extern const char *trap_type[]; 59 extern int trap_types; 60 61 db_regs_t ddb_regs; 62 const struct db_variable db_regs[] = { 63 { "flags", (long *)&ddb_regs.tf_flags, FCN_NULL }, 64 { "r1", (long *)&ddb_regs.tf_r1, FCN_NULL }, 65 { "rp", (long *)&ddb_regs.tf_rp, FCN_NULL }, 66 { "r3", (long *)&ddb_regs.tf_r3, FCN_NULL }, 67 { "r4", (long *)&ddb_regs.tf_r4, FCN_NULL }, 68 { "r5", (long *)&ddb_regs.tf_r5, FCN_NULL }, 69 { "r6", (long *)&ddb_regs.tf_r6, FCN_NULL }, 70 { "r7", (long *)&ddb_regs.tf_r7, FCN_NULL }, 71 { "r8", (long *)&ddb_regs.tf_r8, FCN_NULL }, 72 { "r9", (long *)&ddb_regs.tf_r9, FCN_NULL }, 73 { "r10", (long *)&ddb_regs.tf_r10, FCN_NULL }, 74 { "r11", (long *)&ddb_regs.tf_r11, FCN_NULL }, 75 { "r12", (long *)&ddb_regs.tf_r12, FCN_NULL }, 76 { "r13", (long *)&ddb_regs.tf_r13, FCN_NULL }, 77 { "r14", (long *)&ddb_regs.tf_r14, FCN_NULL }, 78 { "r15", (long *)&ddb_regs.tf_r15, FCN_NULL }, 79 { "r16", (long *)&ddb_regs.tf_r16, FCN_NULL }, 80 { "r17", (long *)&ddb_regs.tf_r17, FCN_NULL }, 81 { "r18", (long *)&ddb_regs.tf_r18, FCN_NULL }, 82 { "t4", (long *)&ddb_regs.tf_t4, FCN_NULL }, 83 { "t3", (long *)&ddb_regs.tf_t3, FCN_NULL }, 84 { "t2", (long *)&ddb_regs.tf_t2, FCN_NULL }, 85 { "t1", (long *)&ddb_regs.tf_t1, FCN_NULL }, 86 { "arg3", (long *)&ddb_regs.tf_arg3, FCN_NULL }, 87 { "arg2", (long *)&ddb_regs.tf_arg2, FCN_NULL }, 88 { "arg1", (long *)&ddb_regs.tf_arg1, FCN_NULL }, 89 { "arg0", (long *)&ddb_regs.tf_arg0, FCN_NULL }, 90 { "dp", (long *)&ddb_regs.tf_dp, FCN_NULL }, 91 { "ret0", (long *)&ddb_regs.tf_ret0, FCN_NULL }, 92 { "ret1", (long *)&ddb_regs.tf_ret1, FCN_NULL }, 93 { "sp", (long *)&ddb_regs.tf_sp, FCN_NULL }, 94 { "r31", (long *)&ddb_regs.tf_r31, FCN_NULL }, 95 { "sar", (long *)&ddb_regs.tf_sar, FCN_NULL }, 96 97 { "eirr", (long *)&ddb_regs.tf_eirr, FCN_NULL }, 98 { "eiem", (long *)&ddb_regs.tf_eiem, FCN_NULL }, 99 { "iir", (long *)&ddb_regs.tf_iir, FCN_NULL }, 100 { "isr", (long *)&ddb_regs.tf_isr, FCN_NULL }, 101 { "ior", (long *)&ddb_regs.tf_ior, FCN_NULL }, 102 { "ipsw", (long *)&ddb_regs.tf_ipsw, FCN_NULL }, 103 { "iisqh", (long *)&ddb_regs.tf_iisq_head, FCN_NULL }, 104 { "iioqh", (long *)&ddb_regs.tf_iioq_head, FCN_NULL }, 105 { "iisqt", (long *)&ddb_regs.tf_iisq_tail, FCN_NULL }, 106 { "iioqt", (long *)&ddb_regs.tf_iioq_tail, FCN_NULL }, 107 108 { "sr0", (long *)&ddb_regs.tf_sr0, FCN_NULL }, 109 { "sr1", (long *)&ddb_regs.tf_sr1, FCN_NULL }, 110 { "sr2", (long *)&ddb_regs.tf_sr2, FCN_NULL }, 111 { "sr3", (long *)&ddb_regs.tf_sr3, FCN_NULL }, 112 { "sr4", (long *)&ddb_regs.tf_sr4, FCN_NULL }, 113 { "sr5", (long *)&ddb_regs.tf_sr5, FCN_NULL }, 114 { "sr6", (long *)&ddb_regs.tf_sr6, FCN_NULL }, 115 { "sr7", (long *)&ddb_regs.tf_sr7, FCN_NULL }, 116 117 { "pidr1", (long *)&ddb_regs.tf_pidr1, FCN_NULL }, 118 { "pidr2", (long *)&ddb_regs.tf_pidr2, FCN_NULL }, 119 #ifdef pbably_not_worth_it 120 { "pidr3", (long *)&ddb_regs.tf_pidr3, FCN_NULL }, 121 { "pidr4", (long *)&ddb_regs.tf_pidr4, FCN_NULL }, 122 #endif 123 124 { "vtop", (long *)&ddb_regs.tf_vtop, FCN_NULL }, 125 { "cr28", (long *)&ddb_regs.tf_cr28, FCN_NULL }, 126 { "cr30", (long *)&ddb_regs.tf_cr30, FCN_NULL }, 127 }; 128 const struct db_variable * const db_eregs = db_regs + sizeof(db_regs)/sizeof(db_regs[0]); 129 int db_active = 0; 130 131 void 132 cpu_Debugger(void) 133 { 134 __asm volatile ("break %0, %1" 135 :: "i" (HPPA_BREAK_KERNEL), "i" (HPPA_BREAK_KGDB)); 136 } 137 138 /* 139 * Print trap reason. 140 */ 141 void 142 kdbprinttrap(int type, int code) 143 { 144 db_printf("kernel: "); 145 if (type >= trap_types || type < 0) 146 db_printf("type %d", type); 147 else 148 db_printf("%s", trap_type[type]); 149 db_printf(" trap, code=%x\n", code); 150 } 151 152 /* 153 * kdb_trap - field a BPT trap 154 */ 155 int 156 kdb_trap(int type, int code, db_regs_t *regs) 157 { 158 int s; 159 160 switch (type) { 161 case T_RECOVERY: 162 case T_IBREAK: 163 case T_DBREAK: 164 case -1: 165 break; 166 default: 167 if (!db_onpanic && db_recover == 0) 168 return 0; 169 170 kdbprinttrap(type, code); 171 if (db_recover != 0) { 172 db_error("Caught exception in DDB; continuing...\n"); 173 /* NOT REACHED */ 174 } 175 } 176 177 /* XXX Should switch to kdb`s own stack here. */ 178 179 ddb_regs = *regs; 180 181 s = splhigh(); 182 db_active++; 183 cnpollc(true); 184 db_trap(type, code); 185 cnpollc(false); 186 db_active--; 187 splx(s); 188 189 *regs = ddb_regs; 190 return 1; 191 } 192 193 /* 194 * Validate an address for use as a breakpoint. 195 * Any address is allowed for now. 196 */ 197 int 198 db_valid_breakpoint(db_addr_t addr) 199 { 200 return 1; 201 } 202