]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/remote-est.c
Copyright updates for 2007.
[thirdparty/binutils-gdb.git] / gdb / remote-est.c
CommitLineData
c906108c 1/* Remote debugging interface for EST-300 ICE, for GDB
6aba47ca 2 Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2007
b6ba6518 3 Free Software Foundation, Inc.
c906108c
SS
4 Contributed by Cygnus Support.
5
6 Written by Steve Chamberlain for Cygnus Support.
7 Re-written by Stu Grossman of Cygnus Support
8
c5aa993b 9 This file is part of GDB.
c906108c 10
c5aa993b
JM
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2 of the License, or
14 (at your option) any later version.
c906108c 15
c5aa993b
JM
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
c906108c 20
c5aa993b
JM
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
197e01b6
EZ
23 Foundation, Inc., 51 Franklin Street, Fifth Floor,
24 Boston, MA 02110-1301, USA. */
c906108c
SS
25
26#include "defs.h"
27#include "gdbcore.h"
28#include "target.h"
29#include "monitor.h"
30#include "serial.h"
4e052eda 31#include "regcache.h"
c906108c 32
32eeb91a
AS
33#include "m68k-tdep.h"
34
a14ed312 35static void est_open (char *args, int from_tty);
c906108c
SS
36
37static void
fba45db2 38est_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 a "r30".
79 */
80
e5014cda 81static const char *
1c617db8 82est_regname (int index)
c906108c 83{
1c617db8
GS
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}
c906108c
SS
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
c5aa993b
JM
108static char *est_inits[] =
109{"he\r", /* Resets the prompt, and clears repeated cmds */
110 NULL};
c906108c 111
c5aa993b 112static struct monitor_ops est_cmds;
c906108c 113
c5aa993b
JM
114static void
115init_est_cmds (void)
c906108c 116{
c5aa993b
JM
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 */
23a6d369 151 est_cmds.supply_register = est_supply_register;
c5aa993b
JM
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 */
1c617db8
GS
160 est_cmds.regnames = NULL;
161 est_cmds.regname = est_regname; /*register names*/
c5aa993b
JM
162 est_cmds.magic = MONITOR_OPS_MAGIC; /* magic */
163} /* init_est_cmds */
c906108c
SS
164
165static void
fba45db2 166est_open (char *args, int from_tty)
c906108c
SS
167{
168 monitor_open (args, &est_cmds, from_tty);
169}
170
a78f21af
AC
171extern initialize_file_ftype _initialize_est; /* -Wmissing-prototypes */
172
c906108c 173void
fba45db2 174_initialize_est (void)
c906108c 175{
c5aa993b 176 init_est_cmds ();
c906108c
SS
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}