1 /* Remote debugging interface for ABug Rom monitor for GDB, the GNU debugger. 2 Copyright 1995, 1996 Free Software Foundation, Inc. 3 4 Written by Rob Savoye of Cygnus Support 5 6 This file is part of GDB. 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 2 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program; if not, write to the Free Software 20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 21 22 #include "defs.h" 23 #include "gdbcore.h" 24 #include "target.h" 25 #include "monitor.h" 26 #include "serial.h" 27 28 static void abug_open PARAMS ((char *args, int from_tty)); 29 30 static void 31 abug_supply_register (regname, regnamelen, val, vallen) 32 char *regname; 33 int regnamelen; 34 char *val; 35 int vallen; 36 { 37 int regno; 38 39 if (regnamelen != 2) 40 return; 41 42 switch (regname[0]) 43 { 44 case 'S': 45 if (regname[1] != 'R') 46 return; 47 regno = PS_REGNUM; 48 break; 49 case 'P': 50 if (regname[1] != 'C') 51 return; 52 regno = PC_REGNUM; 53 break; 54 case 'D': 55 if (regname[1] < '0' || regname[1] > '7') 56 return; 57 regno = regname[1] - '0' + D0_REGNUM; 58 break; 59 case 'A': 60 if (regname[1] < '0' || regname[1] > '7') 61 return; 62 regno = regname[1] - '0' + A0_REGNUM; 63 break; 64 default: 65 return; 66 } 67 68 monitor_supply_register (regno, val); 69 } 70 71 /* 72 * This array of registers needs to match the indexes used by GDB. The 73 * whole reason this exists is because the various ROM monitors use 74 * different names than GDB does, and don't support all the 75 * registers either. So, typing "info reg sp" becomes an "A7". 76 */ 77 78 static char *abug_regnames[NUM_REGS] = 79 { 80 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", 81 "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", 82 "PC", 83 }; 84 85 /* 86 * Define the monitor command strings. Since these are passed directly 87 * through to a printf style function, we need can include formatting 88 * strings. We also need a CR or LF on the end. 89 */ 90 91 static struct target_ops abug_ops; 92 93 static char *abug_inits[] = {"\r", NULL}; 94 95 static struct monitor_ops abug_cmds = 96 { 97 MO_CLR_BREAK_USES_ADDR, 98 abug_inits, /* Init strings */ 99 "g\r", /* continue command */ 100 "t\r", /* single step */ 101 NULL, /* interrupt command */ 102 "br %x\r", /* set a breakpoint */ 103 "nobr %x\r", /* clear a breakpoint */ 104 "nobr\r", /* clear all breakpoints */ 105 "bf %x:%x %x;b\r", /* fill (start count val) */ 106 { 107 "ms %x %02x\r", /* setmem.cmdb (addr, value) */ 108 "ms %x %04x\r", /* setmem.cmdw (addr, value) */ 109 "ms %x %08x\r", /* setmem.cmdl (addr, value) */ 110 NULL, /* setmem.cmdll (addr, value) */ 111 NULL, /* setreg.resp_delim */ 112 NULL, /* setreg.term */ 113 NULL, /* setreg.term_cmd */ 114 }, 115 { 116 "md %x:%x;b\r", /* getmem.cmdb (addr, len) */ 117 "md %x:%x;b\r", /* getmem.cmdw (addr, len) */ 118 "md %x:%x;b\r", /* getmem.cmdl (addr, len) */ 119 NULL, /* getmem.cmdll (addr, len) */ 120 " ", /* getmem.resp_delim */ 121 NULL, /* getmem.term */ 122 NULL, /* getmem.term_cmd */ 123 }, 124 { 125 "rm %s %x\r", /* setreg.cmd (name, value) */ 126 "=", /* setreg.resp_delim */ 127 "? ", /* setreg.term */ 128 ".\r" /* setreg.term_cmd */ 129 }, 130 { 131 "rm %s\r", /* getreg.cmd (name) */ 132 "=", /* getreg.resp_delim */ 133 "? ", /* getreg.term */ 134 ".\r" /* getreg.term_cmd */ 135 }, 136 "rd\r", /* dump_registers */ 137 "\\(\\w+\\) +=\\([0-9a-fA-F]+\\b\\)", /* register_pattern */ 138 abug_supply_register, /* supply_register */ 139 NULL, /* load_routine (defaults to SRECs) */ 140 "lo 0\r", /* download command */ 141 "\n", /* load response */ 142 "135Bug>", /* monitor command prompt */ 143 "\r", /* end-of-line terminator */ 144 NULL, /* optional command terminator */ 145 &abug_ops, /* target operations */ 146 SERIAL_1_STOPBITS, /* number of stop bits */ 147 abug_regnames, /* registers names */ 148 MONITOR_OPS_MAGIC /* magic */ 149 }; 150 151 static void 152 abug_open(args, from_tty) 153 char *args; 154 int from_tty; 155 { 156 monitor_open (args, &abug_cmds, from_tty); 157 } 158 159 void 160 _initialize_abug_rom () 161 { 162 init_monitor_ops (&abug_ops); 163 164 abug_ops.to_shortname = "abug"; 165 abug_ops.to_longname = "ABug monitor"; 166 abug_ops.to_doc = "Debug via the ABug monitor.\n\ 167 Specify the serial device it is connected to (e.g. /dev/ttya)."; 168 abug_ops.to_open = abug_open; 169 170 add_target (&abug_ops); 171 } 172