]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/remote-est.c
Protoization.
[thirdparty/binutils-gdb.git] / gdb / remote-est.c
CommitLineData
c906108c
SS
1/* Remote debugging interface for EST-300 ICE, for GDB
2 Copyright 1995 Free Software Foundation, Inc.
3 Contributed by Cygnus Support.
4
5 Written by Steve Chamberlain for Cygnus Support.
6 Re-written by Stu Grossman of Cygnus Support
7
c5aa993b 8 This file is part of GDB.
c906108c 9
c5aa993b
JM
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
c906108c 14
c5aa993b
JM
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
c906108c 19
c5aa993b
JM
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA. */
c906108c
SS
24
25#include "defs.h"
26#include "gdbcore.h"
27#include "target.h"
28#include "monitor.h"
29#include "serial.h"
30
a14ed312 31static void est_open (char *args, int from_tty);
c906108c
SS
32
33static void
fba45db2 34est_supply_register (char *regname, int regnamelen, char *val, int vallen)
c906108c
SS
35{
36 int regno;
37
38 if (regnamelen != 2)
39 return;
40
41 switch (regname[0])
42 {
43 case 'S':
44 if (regname[1] != 'R')
45 return;
46 regno = PS_REGNUM;
47 break;
48 case 'P':
49 if (regname[1] != 'C')
50 return;
51 regno = PC_REGNUM;
52 break;
53 case 'D':
54 if (regname[1] < '0' || regname[1] > '7')
55 return;
56 regno = regname[1] - '0' + D0_REGNUM;
57 break;
58 case 'A':
59 if (regname[1] < '0' || regname[1] > '7')
60 return;
61 regno = regname[1] - '0' + A0_REGNUM;
62 break;
63 default:
64 return;
65 }
66
67 monitor_supply_register (regno, val);
68}
69
70/*
71 * This array of registers needs to match the indexes used by GDB. The
72 * whole reason this exists is because the various ROM monitors use
73 * different names than GDB does, and don't support all the
74 * registers either. So, typing "info reg sp" becomes a "r30".
75 */
76
77static char *est_regnames[NUM_REGS] =
78{
79 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
80 "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7",
81 "SR", "PC",
82};
83
84/*
85 * Define the monitor command strings. Since these are passed directly
86 * through to a printf style function, we need can include formatting
87 * strings. We also need a CR or LF on the end.
88 */
89
90static struct target_ops est_ops;
91
c5aa993b
JM
92static char *est_inits[] =
93{"he\r", /* Resets the prompt, and clears repeated cmds */
94 NULL};
c906108c 95
c5aa993b 96static struct monitor_ops est_cmds;
c906108c 97
c5aa993b
JM
98static void
99init_est_cmds (void)
c906108c 100{
c5aa993b
JM
101 est_cmds.flags = MO_CLR_BREAK_USES_ADDR | MO_FILL_USES_ADDR | MO_NEED_REGDUMP_AFTER_CONT |
102 MO_SREC_ACK | MO_SREC_ACK_PLUS;
103 est_cmds.init = est_inits; /* Init strings */
104 est_cmds.cont = "go\r"; /* continue command */
105 est_cmds.step = "sidr\r"; /* single step */
106 est_cmds.stop = "\003"; /* ^C interrupts the program */
107 est_cmds.set_break = "sb %x\r"; /* set a breakpoint */
108 est_cmds.clr_break = "rb %x\r"; /* clear a breakpoint */
109 est_cmds.clr_all_break = "rb\r"; /* clear all breakpoints */
110 est_cmds.fill = "bfb %x %x %x\r"; /* fill (start end val) */
111 est_cmds.setmem.cmdb = "smb %x %x\r"; /* setmem.cmdb (addr, value) */
112 est_cmds.setmem.cmdw = "smw %x %x\r"; /* setmem.cmdw (addr, value) */
113 est_cmds.setmem.cmdl = "sml %x %x\r"; /* setmem.cmdl (addr, value) */
114 est_cmds.setmem.cmdll = NULL; /* setmem.cmdll (addr, value) */
115 est_cmds.setmem.resp_delim = NULL; /* setreg.resp_delim */
116 est_cmds.setmem.term = NULL; /* setreg.term */
117 est_cmds.setmem.term_cmd = NULL; /* setreg.term_cmd */
118 est_cmds.getmem.cmdb = "dmb %x %x\r"; /* getmem.cmdb (addr, len) */
119 est_cmds.getmem.cmdw = "dmw %x %x\r"; /* getmem.cmdw (addr, len) */
120 est_cmds.getmem.cmdl = "dml %x %x\r"; /* getmem.cmdl (addr, len) */
121 est_cmds.getmem.cmdll = NULL; /* getmem.cmdll (addr, len) */
122 est_cmds.getmem.resp_delim = ": "; /* getmem.resp_delim */
123 est_cmds.getmem.term = NULL; /* getmem.term */
124 est_cmds.getmem.term_cmd = NULL; /* getmem.term_cmd */
125 est_cmds.setreg.cmd = "sr %s %x\r"; /* setreg.cmd (name, value) */
126 est_cmds.setreg.resp_delim = NULL; /* setreg.resp_delim */
127 est_cmds.setreg.term = NULL; /* setreg.term */
128 est_cmds.setreg.term_cmd = NULL; /* setreg.term_cmd */
129 est_cmds.getreg.cmd = "dr %s\r"; /* getreg.cmd (name) */
130 est_cmds.getreg.resp_delim = " = "; /* getreg.resp_delim */
131 est_cmds.getreg.term = NULL; /* getreg.term */
132 est_cmds.getreg.term_cmd = NULL; /* getreg.term_cmd */
133 est_cmds.dump_registers = "dr\r"; /* dump_registers */
134 est_cmds.register_pattern = "\\(\\w+\\) = \\([0-9a-fA-F]+\\)"; /* register_pattern */
135 est_cmds.supply_register = est_supply_register; /* supply_register */
136 est_cmds.load_routine = NULL; /* load_routine (defaults to SRECs) */
137 est_cmds.load = "dl\r"; /* download command */
138 est_cmds.loadresp = "+"; /* load response */
139 est_cmds.prompt = ">BKM>"; /* monitor command prompt */
140 est_cmds.line_term = "\r"; /* end-of-line terminator */
141 est_cmds.cmd_end = NULL; /* optional command terminator */
142 est_cmds.target = &est_ops; /* target operations */
143 est_cmds.stopbits = SERIAL_1_STOPBITS; /* number of stop bits */
144 est_cmds.regnames = est_regnames; /* registers names */
145 est_cmds.magic = MONITOR_OPS_MAGIC; /* magic */
146} /* init_est_cmds */
c906108c
SS
147
148static void
fba45db2 149est_open (char *args, int from_tty)
c906108c
SS
150{
151 monitor_open (args, &est_cmds, from_tty);
152}
153
154void
fba45db2 155_initialize_est (void)
c906108c 156{
c5aa993b 157 init_est_cmds ();
c906108c
SS
158 init_monitor_ops (&est_ops);
159
160 est_ops.to_shortname = "est";
161 est_ops.to_longname = "EST background debug monitor";
162 est_ops.to_doc = "Debug via the EST BDM.\n\
163Specify the serial device it is connected to (e.g. /dev/ttya).";
164 est_ops.to_open = est_open;
165
166 add_target (&est_ops);
167}