2002-09-18 Andrew Cagney <ac131313@redhat.com>
[deliverable/binutils-gdb.git] / gdb / cpu32bug-rom.c
CommitLineData
c906108c 1/* Remote debugging interface for CPU32Bug Rom monitor for GDB, the GNU debugger.
b6ba6518
KB
2 Copyright 1995, 1996, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
c906108c
SS
4
5 Written by Stu Grossman 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
21 Foundation, Inc., 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, 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
a14ed312 31static void cpu32bug_open (char *args, int from_tty);
c906108c
SS
32
33static void
fba45db2 34cpu32bug_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 an "A7".
75 */
76
1c617db8
GS
77static const char *
78cpu32bug_regname (int index)
c906108c 79{
1c617db8
GS
80 static char *regnames[] =
81 {
82 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
83 "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7",
84 "SR", "PC"
85 };
86
87 if ((index >= (sizeof (regnames) / sizeof (regnames[0])))
88 || (index < 0) || (index >= NUM_REGS))
89 return NULL;
90 else
91 return regnames[index];
92}
c906108c
SS
93
94/*
95 * Define the monitor command strings. Since these are passed directly
96 * through to a printf style function, we need can include formatting
97 * strings. We also need a CR or LF on the end.
98 */
99
100static struct target_ops cpu32bug_ops;
101
c5aa993b
JM
102static char *cpu32bug_inits[] =
103{"\r", NULL};
c906108c 104
c5aa993b 105static struct monitor_ops cpu32bug_cmds;
c906108c 106
c5aa993b
JM
107static void
108init_cpu32bug_cmds (void)
c906108c 109{
c5aa993b
JM
110 cpu32bug_cmds.flags = MO_CLR_BREAK_USES_ADDR;
111 cpu32bug_cmds.init = cpu32bug_inits; /* Init strings */
112 cpu32bug_cmds.cont = "g\r"; /* continue command */
113 cpu32bug_cmds.step = "t\r"; /* single step */
114 cpu32bug_cmds.stop = NULL; /* interrupt command */
115 cpu32bug_cmds.set_break = "br %x\r"; /* set a breakpoint */
116 cpu32bug_cmds.clr_break = "nobr %x\r"; /* clear a breakpoint */
117 cpu32bug_cmds.clr_all_break = "nobr\r"; /* clear all breakpoints */
118 cpu32bug_cmds.fill = "bf %x:%x %x;b\r"; /* fill (start count val) */
119 cpu32bug_cmds.setmem.cmdb = "ms %x %02x\r"; /* setmem.cmdb (addr, value) */
120 cpu32bug_cmds.setmem.cmdw = "ms %x %04x\r"; /* setmem.cmdw (addr, value) */
121 cpu32bug_cmds.setmem.cmdl = "ms %x %08x\r"; /* setmem.cmdl (addr, value) */
122 cpu32bug_cmds.setmem.cmdll = NULL; /* setmem.cmdll (addr, value) */
123 cpu32bug_cmds.setmem.resp_delim = NULL; /* setreg.resp_delim */
124 cpu32bug_cmds.setmem.term = NULL; /* setreg.term */
125 cpu32bug_cmds.setmem.term_cmd = NULL; /* setreg.term_cmd */
126 cpu32bug_cmds.getmem.cmdb = "md %x:%x;b\r"; /* getmem.cmdb (addr, len) */
127 cpu32bug_cmds.getmem.cmdw = "md %x:%x;b\r"; /* getmem.cmdw (addr, len) */
128 cpu32bug_cmds.getmem.cmdl = "md %x:%x;b\r"; /* getmem.cmdl (addr, len) */
129 cpu32bug_cmds.getmem.cmdll = NULL; /* getmem.cmdll (addr, len) */
130 cpu32bug_cmds.getmem.resp_delim = " "; /* getmem.resp_delim */
131 cpu32bug_cmds.getmem.term = NULL; /* getmem.term */
132 cpu32bug_cmds.getmem.term_cmd = NULL; /* getmem.term_cmd */
133 cpu32bug_cmds.setreg.cmd = "rs %s %x\r"; /* setreg.cmd (name, value) */
134 cpu32bug_cmds.setreg.resp_delim = NULL; /* setreg.resp_delim */
135 cpu32bug_cmds.setreg.term = NULL; /* setreg.term */
136 cpu32bug_cmds.setreg.term_cmd = NULL; /* setreg.term_cmd */
137 cpu32bug_cmds.getreg.cmd = "rs %s\r"; /* getreg.cmd (name) */
138 cpu32bug_cmds.getreg.resp_delim = "="; /* getreg.resp_delim */
139 cpu32bug_cmds.getreg.term = NULL; /* getreg.term */
140 cpu32bug_cmds.getreg.term_cmd = NULL; /* getreg.term_cmd */
141 cpu32bug_cmds.dump_registers = "rd\r"; /* dump_registers */
142 cpu32bug_cmds.register_pattern = "\\(\\w+\\) +=\\([0-9a-fA-F]+\\b\\)"; /* register_pattern */
143 cpu32bug_cmds.supply_register = cpu32bug_supply_register; /* supply_register */
144 cpu32bug_cmds.load_routine = NULL; /* load_routine (defaults to SRECs) */
145 cpu32bug_cmds.load = "lo\r"; /* download command */
146 cpu32bug_cmds.loadresp = "\n"; /* load response */
147 cpu32bug_cmds.prompt = "CPU32Bug>"; /* monitor command prompt */
148 cpu32bug_cmds.line_term = "\r"; /* end-of-line terminator */
149 cpu32bug_cmds.cmd_end = NULL; /* optional command terminator */
150 cpu32bug_cmds.target = &cpu32bug_ops; /* target operations */
151 cpu32bug_cmds.stopbits = SERIAL_1_STOPBITS; /* number of stop bits */
1c617db8
GS
152 cpu32bug_cmds.regnames = NULL; /* registers names */
153 cpu32bug_cmds.regname = cpu32bug_regname;
c5aa993b
JM
154 cpu32bug_cmds.magic = MONITOR_OPS_MAGIC; /* magic */
155}; /* init_cpu32bug_cmds */
c906108c
SS
156
157static void
fba45db2 158cpu32bug_open (char *args, int from_tty)
c906108c
SS
159{
160 monitor_open (args, &cpu32bug_cmds, from_tty);
161}
162
163void
fba45db2 164_initialize_cpu32bug_rom (void)
c906108c 165{
c5aa993b 166 init_cpu32bug_cmds ();
c906108c
SS
167 init_monitor_ops (&cpu32bug_ops);
168
169 cpu32bug_ops.to_shortname = "cpu32bug";
170 cpu32bug_ops.to_longname = "CPU32Bug monitor";
171 cpu32bug_ops.to_doc = "Debug via the CPU32Bug monitor.\n\
172Specify the serial device it is connected to (e.g. /dev/ttya).";
173 cpu32bug_ops.to_open = cpu32bug_open;
174
175 add_target (&cpu32bug_ops);
176}
This page took 0.198873 seconds and 4 git commands to generate.