1226031Sstas/* Remote debugging interface for EST-300 ICE, for GDB 2226031Sstas Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001 3226031Sstas Free Software Foundation, Inc. 4226031Sstas Contributed by Cygnus Support. 5226031Sstas 6226031Sstas Written by Steve Chamberlain for Cygnus Support. 7226031Sstas Re-written by Stu Grossman of Cygnus Support 8226031Sstas 9226031Sstas This file is part of GDB. 10226031Sstas 11226031Sstas This program is free software; you can redistribute it and/or modify 12226031Sstas it under the terms of the GNU General Public License as published by 13226031Sstas the Free Software Foundation; either version 2 of the License, or 14226031Sstas (at your option) any later version. 15226031Sstas 16226031Sstas This program is distributed in the hope that it will be useful, 17226031Sstas but WITHOUT ANY WARRANTY; without even the implied warranty of 18226031Sstas MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19226031Sstas GNU General Public License for more details. 20226031Sstas 21226031Sstas You should have received a copy of the GNU General Public License 22226031Sstas along with this program; if not, write to the Free Software 23226031Sstas Foundation, Inc., 59 Temple Place - Suite 330, 24226031Sstas Boston, MA 02111-1307, USA. */ 25226031Sstas 26226031Sstas#include "defs.h" 27226031Sstas#include "gdbcore.h" 28226031Sstas#include "target.h" 29226031Sstas#include "monitor.h" 30226031Sstas#include "serial.h" 31226031Sstas#include "regcache.h" 32226031Sstas 33226031Sstas#include "m68k-tdep.h" 34226031Sstas 35226031Sstasstatic void est_open (char *args, int from_tty); 36226031Sstas 37226031Sstasstatic void 38226031Sstasest_supply_register (char *regname, int regnamelen, char *val, int vallen) 39226031Sstas{ 40226031Sstas int regno; 41226031Sstas 42226031Sstas if (regnamelen != 2) 43226031Sstas return; 44226031Sstas 45226031Sstas switch (regname[0]) 46226031Sstas { 47226031Sstas case 'S': 48226031Sstas if (regname[1] != 'R') 49226031Sstas return; 50226031Sstas regno = PS_REGNUM; 51226031Sstas break; 52226031Sstas case 'P': 53 if (regname[1] != 'C') 54 return; 55 regno = PC_REGNUM; 56 break; 57 case 'D': 58 if (regname[1] < '0' || regname[1] > '7') 59 return; 60 regno = regname[1] - '0' + M68K_D0_REGNUM; 61 break; 62 case 'A': 63 if (regname[1] < '0' || regname[1] > '7') 64 return; 65 regno = regname[1] - '0' + M68K_A0_REGNUM; 66 break; 67 default: 68 return; 69 } 70 71 monitor_supply_register (regno, val); 72} 73 74/* 75 * This array of registers needs to match the indexes used by GDB. The 76 * whole reason this exists is because the various ROM monitors use 77 * different names than GDB does, and don't support all the 78 * registers either. So, typing "info reg sp" becomes a "r30". 79 */ 80 81static const char * 82est_regname (int index) 83{ 84 85 static char *regnames[] = 86 { 87 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", 88 "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", 89 "SR", "PC", 90 }; 91 92 93 if ((index >= (sizeof (regnames) / sizeof (regnames[0]))) 94 || (index < 0) || (index >= NUM_REGS)) 95 return NULL; 96 else 97 return regnames[index]; 98} 99 100/* 101 * Define the monitor command strings. Since these are passed directly 102 * through to a printf style function, we need can include formatting 103 * strings. We also need a CR or LF on the end. 104 */ 105 106static struct target_ops est_ops; 107 108static char *est_inits[] = 109{"he\r", /* Resets the prompt, and clears repeated cmds */ 110 NULL}; 111 112static struct monitor_ops est_cmds; 113 114static void 115init_est_cmds (void) 116{ 117 est_cmds.flags = MO_CLR_BREAK_USES_ADDR | MO_FILL_USES_ADDR | MO_NEED_REGDUMP_AFTER_CONT | 118 MO_SREC_ACK | MO_SREC_ACK_PLUS; 119 est_cmds.init = est_inits; /* Init strings */ 120 est_cmds.cont = "go\r"; /* continue command */ 121 est_cmds.step = "sidr\r"; /* single step */ 122 est_cmds.stop = "\003"; /* ^C interrupts the program */ 123 est_cmds.set_break = "sb %x\r"; /* set a breakpoint */ 124 est_cmds.clr_break = "rb %x\r"; /* clear a breakpoint */ 125 est_cmds.clr_all_break = "rb\r"; /* clear all breakpoints */ 126 est_cmds.fill = "bfb %x %x %x\r"; /* fill (start end val) */ 127 est_cmds.setmem.cmdb = "smb %x %x\r"; /* setmem.cmdb (addr, value) */ 128 est_cmds.setmem.cmdw = "smw %x %x\r"; /* setmem.cmdw (addr, value) */ 129 est_cmds.setmem.cmdl = "sml %x %x\r"; /* setmem.cmdl (addr, value) */ 130 est_cmds.setmem.cmdll = NULL; /* setmem.cmdll (addr, value) */ 131 est_cmds.setmem.resp_delim = NULL; /* setreg.resp_delim */ 132 est_cmds.setmem.term = NULL; /* setreg.term */ 133 est_cmds.setmem.term_cmd = NULL; /* setreg.term_cmd */ 134 est_cmds.getmem.cmdb = "dmb %x %x\r"; /* getmem.cmdb (addr, len) */ 135 est_cmds.getmem.cmdw = "dmw %x %x\r"; /* getmem.cmdw (addr, len) */ 136 est_cmds.getmem.cmdl = "dml %x %x\r"; /* getmem.cmdl (addr, len) */ 137 est_cmds.getmem.cmdll = NULL; /* getmem.cmdll (addr, len) */ 138 est_cmds.getmem.resp_delim = ": "; /* getmem.resp_delim */ 139 est_cmds.getmem.term = NULL; /* getmem.term */ 140 est_cmds.getmem.term_cmd = NULL; /* getmem.term_cmd */ 141 est_cmds.setreg.cmd = "sr %s %x\r"; /* setreg.cmd (name, value) */ 142 est_cmds.setreg.resp_delim = NULL; /* setreg.resp_delim */ 143 est_cmds.setreg.term = NULL; /* setreg.term */ 144 est_cmds.setreg.term_cmd = NULL; /* setreg.term_cmd */ 145 est_cmds.getreg.cmd = "dr %s\r"; /* getreg.cmd (name) */ 146 est_cmds.getreg.resp_delim = " = "; /* getreg.resp_delim */ 147 est_cmds.getreg.term = NULL; /* getreg.term */ 148 est_cmds.getreg.term_cmd = NULL; /* getreg.term_cmd */ 149 est_cmds.dump_registers = "dr\r"; /* dump_registers */ 150 est_cmds.register_pattern = "\\(\\w+\\) = \\([0-9a-fA-F]+\\)"; /* register_pattern */ 151 est_cmds.supply_register = est_supply_register; /* supply_register */ 152 est_cmds.load_routine = NULL; /* load_routine (defaults to SRECs) */ 153 est_cmds.load = "dl\r"; /* download command */ 154 est_cmds.loadresp = "+"; /* load response */ 155 est_cmds.prompt = ">BKM>"; /* monitor command prompt */ 156 est_cmds.line_term = "\r"; /* end-of-line terminator */ 157 est_cmds.cmd_end = NULL; /* optional command terminator */ 158 est_cmds.target = &est_ops; /* target operations */ 159 est_cmds.stopbits = SERIAL_1_STOPBITS; /* number of stop bits */ 160 est_cmds.regnames = NULL; 161 est_cmds.regname = est_regname; /*register names*/ 162 est_cmds.magic = MONITOR_OPS_MAGIC; /* magic */ 163} /* init_est_cmds */ 164 165static void 166est_open (char *args, int from_tty) 167{ 168 monitor_open (args, &est_cmds, from_tty); 169} 170 171extern initialize_file_ftype _initialize_est; /* -Wmissing-prototypes */ 172 173void 174_initialize_est (void) 175{ 176 init_est_cmds (); 177 init_monitor_ops (&est_ops); 178 179 est_ops.to_shortname = "est"; 180 est_ops.to_longname = "EST background debug monitor"; 181 est_ops.to_doc = "Debug via the EST BDM.\n\ 182Specify the serial device it is connected to (e.g. /dev/ttya)."; 183 est_ops.to_open = est_open; 184 185 add_target (&est_ops); 186} 187