]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/abug-rom.c
Copyright updates for 2007.
[thirdparty/binutils-gdb.git] / gdb / abug-rom.c
CommitLineData
c906108c 1/* Remote debugging interface for ABug Rom monitor for GDB, the GNU debugger.
6aba47ca 2 Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2007
b6ba6518 3 Free Software Foundation, Inc.
c906108c
SS
4
5 Written by Rob Savoye of Cygnus Support
6
c5aa993b 7 This file is part of GDB.
c906108c 8
c5aa993b
JM
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
c906108c 13
c5aa993b
JM
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
c906108c 18
c5aa993b
JM
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
197e01b6
EZ
21 Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 Boston, MA 02110-1301, USA. */
c906108c
SS
23
24#include "defs.h"
25#include "gdbcore.h"
26#include "target.h"
27#include "monitor.h"
28#include "serial.h"
4e052eda 29#include "regcache.h"
c906108c 30
32eeb91a
AS
31#include "m68k-tdep.h"
32
c906108c
SS
33/* Prototypes for local functions. */
34
a14ed312 35static void abug_open (char *args, int from_tty);
c906108c
SS
36
37static void
fba45db2 38abug_supply_register (char *regname, int regnamelen, char *val, int vallen)
c906108c
SS
39{
40 int regno;
41
42 if (regnamelen != 2)
43 return;
44
45 switch (regname[0])
46 {
47 case 'S':
48 if (regname[1] != 'R')
49 return;
50 regno = PS_REGNUM;
51 break;
52 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;
32eeb91a 60 regno = regname[1] - '0' + M68K_D0_REGNUM;
c906108c
SS
61 break;
62 case 'A':
63 if (regname[1] < '0' || regname[1] > '7')
64 return;
32eeb91a 65 regno = regname[1] - '0' + M68K_A0_REGNUM;
c906108c
SS
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 an "A7".
79 */
80
1c617db8
GS
81static const char *
82abug_regname (int index)
c906108c 83{
1c617db8
GS
84 static char *regnames[] =
85 {
86 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
87 "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7",
88 "PC",
89 };
90
91 if ((index >= (sizeof (regnames) / sizeof (regnames[0])))
92 || (index < 0) || (index >= NUM_REGS))
93 return NULL;
94 else
95 return regnames[index];
96}
c906108c
SS
97
98/*
99 * Define the monitor command strings. Since these are passed directly
100 * through to a printf style function, we need can include formatting
101 * strings. We also need a CR or LF on the end.
102 */
103
104static struct target_ops abug_ops;
105
c5aa993b
JM
106static char *abug_inits[] =
107{"\r", NULL};
c906108c 108
c5aa993b 109static struct monitor_ops abug_cmds;
c906108c 110
c5aa993b
JM
111static void
112init_abug_cmds (void)
c906108c 113{
c5aa993b
JM
114 abug_cmds.flags = MO_CLR_BREAK_USES_ADDR;
115 abug_cmds.init = abug_inits; /* Init strings */
116 abug_cmds.cont = "g\r"; /* continue command */
117 abug_cmds.step = "t\r"; /* single step */
118 abug_cmds.stop = NULL; /* interrupt command */
119 abug_cmds.set_break = "br %x\r"; /* set a breakpoint */
120 abug_cmds.clr_break = "nobr %x\r"; /* clear a breakpoint */
121 abug_cmds.clr_all_break = "nobr\r"; /* clear all breakpoints */
122 abug_cmds.fill = "bf %x:%x %x;b\r"; /* fill (start count val) */
123 abug_cmds.setmem.cmdb = "ms %x %02x\r"; /* setmem.cmdb (addr, value) */
124 abug_cmds.setmem.cmdw = "ms %x %04x\r"; /* setmem.cmdw (addr, value) */
125 abug_cmds.setmem.cmdl = "ms %x %08x\r"; /* setmem.cmdl (addr, value) */
126 abug_cmds.setmem.cmdll = NULL; /* setmem.cmdll (addr, value) */
127 abug_cmds.setmem.resp_delim = NULL; /* setreg.resp_delim */
128 abug_cmds.setmem.term = NULL; /* setreg.term */
129 abug_cmds.setmem.term_cmd = NULL; /* setreg.term_cmd */
130 abug_cmds.getmem.cmdb = "md %x:%x;b\r"; /* getmem.cmdb (addr, len) */
131 abug_cmds.getmem.cmdw = "md %x:%x;b\r"; /* getmem.cmdw (addr, len) */
132 abug_cmds.getmem.cmdl = "md %x:%x;b\r"; /* getmem.cmdl (addr, len) */
133 abug_cmds.getmem.cmdll = NULL; /* getmem.cmdll (addr, len) */
134 abug_cmds.getmem.resp_delim = " "; /* getmem.resp_delim */
135 abug_cmds.getmem.term = NULL; /* getmem.term */
136 abug_cmds.getmem.term_cmd = NULL; /* getmem.term_cmd */
137 abug_cmds.setreg.cmd = "rm %s %x\r"; /* setreg.cmd (name, value) */
138 abug_cmds.setreg.resp_delim = "="; /* setreg.resp_delim */
139 abug_cmds.setreg.term = "? "; /* setreg.term */
140 abug_cmds.setreg.term_cmd = ".\r"; /* setreg.term_cmd */
141 abug_cmds.getreg.cmd = "rm %s\r"; /* getreg.cmd (name) */
142 abug_cmds.getreg.resp_delim = "="; /* getreg.resp_delim */
143 abug_cmds.getreg.term = "? "; /* getreg.term */
144 abug_cmds.getreg.term_cmd = ".\r"; /* getreg.term_cmd */
145 abug_cmds.dump_registers = "rd\r"; /* dump_registers */
146 abug_cmds.register_pattern = "\\(\\w+\\) +=\\([0-9a-fA-F]+\\b\\)"; /* register_pattern */
23a6d369 147 abug_cmds.supply_register = abug_supply_register;
c5aa993b
JM
148 abug_cmds.load_routine = NULL; /* load_routine (defaults to SRECs) */
149 abug_cmds.load = "lo 0\r"; /* download command */
150 abug_cmds.loadresp = "\n"; /* load response */
151 abug_cmds.prompt = "135Bug>"; /* monitor command prompt */
152 abug_cmds.line_term = "\r"; /* end-of-line terminator */
153 abug_cmds.cmd_end = NULL; /* optional command terminator */
154 abug_cmds.target = &abug_ops; /* target operations */
155 abug_cmds.stopbits = SERIAL_1_STOPBITS; /* number of stop bits */
1c617db8
GS
156 abug_cmds.regnames = NULL; /* registers names */
157 abug_cmds.regname = abug_regname;
c5aa993b
JM
158 abug_cmds.magic = MONITOR_OPS_MAGIC; /* magic */
159};
c906108c
SS
160
161static void
fba45db2 162abug_open (char *args, int from_tty)
c906108c
SS
163{
164 monitor_open (args, &abug_cmds, from_tty);
165}
166
a78f21af
AC
167extern initialize_file_ftype _initialize_abug_rom; /* -Wmissing-prototypes */
168
c906108c 169void
fba45db2 170_initialize_abug_rom (void)
c906108c 171{
c5aa993b 172 init_abug_cmds ();
c906108c
SS
173 init_monitor_ops (&abug_ops);
174
175 abug_ops.to_shortname = "abug";
323e0a4a
AC
176 abug_ops.to_longname = _("ABug monitor");
177 abug_ops.to_doc = _("Debug via the ABug monitor.\n\
178Specify the serial device it is connected to (e.g. /dev/ttya).");
c906108c
SS
179 abug_ops.to_open = abug_open;
180
181 add_target (&abug_ops);
182}