GDB (xrefs)
/tmp/gdb-7.10/gdb/dink32-rom.c
Go to the documentation of this file.
1 /* Remote debugging interface for DINK32 (PowerPC) ROM monitor for
2  GDB, the GNU debugger.
3  Copyright (C) 1997-2015 Free Software Foundation, Inc.
4 
5  This file is part of GDB.
6 
7  This program is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 3 of the License, or
10  (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 
20 #include "defs.h"
21 #include "gdbcore.h"
22 #include "target.h"
23 #include "monitor.h"
24 #include "serial.h"
25 #include "symfile.h" /* For generic_load() */
26 #include "inferior.h"
27 #include "regcache.h"
28 
29 static void
31  int regnamelen, char *val, int vallen)
32 {
33  int regno = 0;
34 
35  if (regnamelen < 2 || regnamelen > 4)
36  return;
37 
38  switch (regname[0])
39  {
40  case 'R':
41  if (regname[1] < '0' || regname[1] > '9')
42  return;
43  if (regnamelen == 2)
44  regno = regname[1] - '0';
45  else if (regnamelen == 3 && regname[2] >= '0' && regname[2] <= '9')
46  regno = (regname[1] - '0') * 10 + (regname[2] - '0');
47  else
48  return;
49  break;
50  case 'F':
51  if (regname[1] != 'R' || regname[2] < '0' || regname[2] > '9')
52  return;
53  if (regnamelen == 3)
54  regno = 32 + regname[2] - '0';
55  else if (regnamelen == 4 && regname[3] >= '0' && regname[3] <= '9')
56  regno = 32 + (regname[2] - '0') * 10 + (regname[3] - '0');
57  else
58  return;
59  break;
60  case 'I':
61  if (regnamelen != 2 || regname[1] != 'P')
62  return;
63  regno = 64;
64  break;
65  case 'M':
66  if (regnamelen != 3 || regname[1] != 'S' || regname[2] != 'R')
67  return;
68  regno = 65;
69  break;
70  case 'C':
71  if (regnamelen != 2 || regname[1] != 'R')
72  return;
73  regno = 66;
74  break;
75  case 'S':
76  if (regnamelen != 4 || regname[1] != 'P' || regname[2] != 'R')
77  return;
78  else if (regname[3] == '8')
79  regno = 67;
80  else if (regname[3] == '9')
81  regno = 68;
82  else if (regname[3] == '1')
83  regno = 69;
84  else if (regname[3] == '0')
85  regno = 70;
86  else
87  return;
88  break;
89  default:
90  return;
91  }
92 
93  monitor_supply_register (regcache, regno, val);
94 }
95 
96 /* This array of registers needs to match the indexes used by GDB.
97  The whole reason this exists is because the various ROM monitors
98  use different names than GDB does, and don't support all the
99  registers either. */
100 
101 static char *dink32_regnames[] =
102 {
103  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
104  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
105  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
106  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
107 
108  "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
109  "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
110  "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
111  "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
112 
113  "srr0", "msr", "cr", "lr", "ctr", "xer", "xer"
114 };
115 
116 static struct target_ops dink32_ops;
117 
118 static char *dink32_inits[] =
119 {"\r", NULL};
120 
121 static struct monitor_ops dink32_cmds;
122 
123 static void
124 dink32_open (const char *args, int from_tty)
125 {
126  monitor_open (args, &dink32_cmds, from_tty);
127 }
128 
129 extern initialize_file_ftype _initialize_dink32_rom; /* -Wmissing-prototypes */
130 
131 void
133 {
140  dink32_cmds.cont = "go +\r";
141  dink32_cmds.step = "tr +\r";
142  dink32_cmds.set_break = "bp 0x%x\r";
143  dink32_cmds.clr_break = "bp %d\r";
144 #if 0 /* Would need to follow strict alignment rules.. */
145  dink32_cmds.fill = "mf %x %x %x\r";
146 #endif
147  dink32_cmds.setmem.cmdb = "mm -b %x\r";
148  dink32_cmds.setmem.cmdw = "mm -w %x\r";
149  dink32_cmds.setmem.cmdl = "mm %x\r";
150  dink32_cmds.setmem.term = " ? ";
151  dink32_cmds.getmem.cmdb = "md %x\r";
153  dink32_cmds.setreg.cmd = "rm %s\r";
154  dink32_cmds.setreg.term = " ? ";
155  dink32_cmds.getreg.cmd = "rd %s\r";
157  dink32_cmds.dump_registers = "rd r\r";
158  dink32_cmds.register_pattern = "\\(\\w+\\) +=\\([0-9a-fA-F]+\\b\\)";
160  /* S-record download, via "keyboard port". */
161  dink32_cmds.load = "dl -k\r";
162  dink32_cmds.loadresp = "Set Input Port : set to Keyboard Port\r";
163  dink32_cmds.prompt = "DINK32_603 >>";
164  dink32_cmds.line_term = "\r";
169 
171 
172  dink32_ops.to_shortname = "dink32";
173  dink32_ops.to_longname = "DINK32 monitor";
174  dink32_ops.to_doc = "Debug using the DINK32 monitor.\n\
175 Specify the serial device it is connected to (e.g. /dev/ttya).";
177 
179 }
void add_target(struct target_ops *t)
Definition: target.c:395
char * cmdl
Definition: monitor.h:60
static struct monitor_ops dink32_cmds
Definition: dink32-rom.c:121
char ** regnames
Definition: monitor.h:118
char * cmd
Definition: monitor.h:70
int stopbits
Definition: monitor.h:117
const char * to_longname
Definition: target.h:433
char * clr_break
Definition: monitor.h:88
char * prompt
Definition: monitor.h:113
struct memrw_cmd setmem
Definition: monitor.h:91
#define MO_SREC_ACK_ROTATE
Definition: monitor.h:216
char * loadresp
Definition: monitor.h:112
initialize_file_ftype _initialize_dink32_rom
char * resp_delim
Definition: monitor.h:62
#define MO_FILL_USES_ADDR
Definition: monitor.h:142
char * cmdw
Definition: monitor.h:59
#define MO_SETREG_INTERACTIVE
Definition: monitor.h:195
static struct target_ops dink32_ops
Definition: dink32-rom.c:116
static void dink32_open(const char *args, int from_tty)
Definition: dink32-rom.c:124
char * cmdb
Definition: monitor.h:58
static char * dink32_inits[]
Definition: dink32-rom.c:118
static char * dink32_regnames[]
Definition: dink32-rom.c:101
void(* supply_register)(struct regcache *regcache, char *name, int namelen, char *val, int vallen)
Definition: monitor.h:103
struct regrw_cmd getreg
Definition: monitor.h:94
char * load
Definition: monitor.h:111
static void dink32_supply_register(struct regcache *regcache, char *regname, int regnamelen, char *val, int vallen)
Definition: dink32-rom.c:30
void initialize_file_ftype(void)
Definition: defs.h:281
#define MO_HEX_PREFIX
Definition: monitor.h:175
char * term
Definition: monitor.h:63
#define MO_HANDLE_NL
Definition: monitor.h:159
struct regrw_cmd setreg
Definition: monitor.h:93
int flags
Definition: monitor.h:80
char ** init
Definition: monitor.h:81
#define MO_CLR_BREAK_1_BASED
Definition: monitor.h:208
#define MONITOR_OPS_MAGIC
Definition: monitor.h:130
char * step
Definition: monitor.h:83
const char * to_doc
Definition: target.h:434
void monitor_open(const char *args, struct monitor_ops *mon_ops, int from_tty)
Definition: monitor.c:700
char * term
Definition: monitor.h:73
struct memrw_cmd getmem
Definition: monitor.h:92
char * register_pattern
Definition: monitor.h:101
#define SERIAL_1_STOPBITS
Definition: serial.h:183
#define MO_GETMEM_16_BOUNDARY
Definition: monitor.h:204
void init_monitor_ops(struct target_ops *ops)
Definition: monitor.c:2381
char * dump_registers
Definition: monitor.h:100
#define MO_SETMEM_INTERACTIVE
Definition: monitor.h:199
#define MO_32_REGS_PAIRED
Definition: monitor.h:191
int magic
Definition: monitor.h:124
void(* to_open)(const char *, int)
Definition: target.h:443
char * monitor_supply_register(struct regcache *regcache, int regno, char *valstr)
Definition: monitor.c:874
struct target_ops * target
Definition: monitor.h:116
const char * to_shortname
Definition: target.h:432
char * fill
Definition: monitor.h:90
#define MO_SREC_ACK
Definition: monitor.h:171
char * resp_delim
Definition: monitor.h:71
char * set_break
Definition: monitor.h:85
#define MO_GETMEM_NEEDS_RANGE
Definition: monitor.h:151
const char *(* regname)(int index)
Definition: monitor.h:120
char * line_term
Definition: monitor.h:114
char * cont
Definition: monitor.h:82