OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [sh3-rom.c] - Blame information for rev 105

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 104 markom
/* Remote target glue for the Hitachi SH-3 ROM monitor.
2
   Copyright 1995, 1996 Free Software Foundation, Inc.
3
 
4
   This file is part of GDB.
5
 
6
   This program is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License as published by
8
   the Free Software Foundation; either version 2 of the License, or
9
   (at your option) any later version.
10
 
11
   This program is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
   GNU General Public License for more details.
15
 
16
   You should have received a copy of the GNU General Public License
17
   along with this program; if not, write to the Free Software
18
   Foundation, Inc., 59 Temple Place - Suite 330,
19
   Boston, MA 02111-1307, USA.  */
20
 
21
#include "defs.h"
22
#include "gdbcore.h"
23
#include "target.h"
24
#include "monitor.h"
25
#include "serial.h"
26
#include "srec.h"
27
 
28
static serial_t parallel;
29
static int parallel_in_use;
30
 
31
static void sh3_open PARAMS ((char *args, int from_tty));
32
 
33
static void
34
sh3_supply_register (regname, regnamelen, val, vallen)
35
     char *regname;
36
     int regnamelen;
37
     char *val;
38
     int vallen;
39
{
40
  int numregs;
41
  int regno;
42
 
43
  numregs = 1;
44
  regno = -1;
45
 
46
  if (regnamelen == 2)
47
    {
48
      switch (regname[0])
49
        {
50
        case 'S':
51
          if (regname[1] == 'R')
52
            regno = SR_REGNUM;
53
          break;
54
        case 'P':
55
          if (regname[1] == 'C')
56
            regno = PC_REGNUM;
57
          else if (regname[1] == 'R')
58
            regno = PR_REGNUM;
59
          break;
60
        }
61
    }
62
  else if (regnamelen == 3)
63
    {
64
      switch (regname[0])
65
        {
66
        case 'G':
67
        case 'V':
68
          if (regname[1] == 'B' && regname[2] == 'R')
69
            {
70
              if (regname[0] == 'G')
71
                regno = VBR_REGNUM;
72
              else
73
                regno = GBR_REGNUM;
74
            }
75
          break;
76
        case 'S':
77
          if (regname[1] == 'S' && regname[2] == 'R')
78
            regno = SSR_REGNUM;
79
          else if (regname[1] == 'P' && regname[2] == 'C')
80
            regno = SPC_REGNUM;
81
          break;
82
        }
83
    }
84
  else if (regnamelen == 4)
85
    {
86
      switch (regname[0])
87
        {
88
        case 'M':
89
          if (regname[1] == 'A' && regname[2] == 'C')
90
            {
91
              if (regname[3] == 'H')
92
                regno = MACH_REGNUM;
93
              else if (regname[3] == 'L')
94
                regno = MACL_REGNUM;
95
            }
96
          break;
97
        case 'R':
98
          if (regname[1] == '0' && regname[2] == '-' && regname[3] == '7')
99
            {
100
              regno = R0_REGNUM;
101
              numregs = 8;
102
            }
103
        }
104
    }
105
  else if (regnamelen == 5)
106
    {
107
      if (regname[1] == '8' && regname[2] == '-' && regname[3] == '1'
108
          && regname[4] == '5')
109
        {
110
          regno = R0_REGNUM + 8;
111
          numregs = 8;
112
        }
113
    }
114
  else if (regnamelen == 17)
115
    {
116
    }
117
 
118
  if (regno >= 0)
119
    while (numregs-- > 0)
120
      val = monitor_supply_register (regno++, val);
121
}
122
 
123
static void
124
sh3_load (desc, file, hashmark)
125
     serial_t desc;
126
     char *file;
127
     int hashmark;
128
{
129
  if (parallel_in_use)
130
    {
131
      monitor_printf ("pl;s\r");
132
      load_srec (parallel, file, 0, 80, SREC_ALL, hashmark, NULL);
133
      monitor_expect_prompt (NULL, 0);
134
    }
135
  else
136
    {
137
      monitor_printf ("il;s:x\r");
138
      monitor_expect ("\005", NULL, 0);          /* Look for ENQ */
139
      SERIAL_WRITE (desc, "\006", 1);   /* Send ACK */
140
      monitor_expect ("LO x\r", NULL, 0);        /* Look for filename */
141
 
142
      load_srec (desc, file, 0, 80, SREC_ALL, hashmark, NULL);
143
 
144
      monitor_expect ("\005", NULL, 0);          /* Look for ENQ */
145
      SERIAL_WRITE (desc, "\006", 1);   /* Send ACK */
146
      monitor_expect_prompt (NULL, 0);
147
    }
148
}
149
 
150
/* This array of registers need to match the indexes used by GDB.
151
   This exists because the various ROM monitors use different strings
152
   than does GDB, and don't necessarily support all the registers
153
   either. So, typing "info reg sp" becomes a "r30".  */
154
 
155
static char *sh3_regnames[NUM_REGS] =
156
{
157
  "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7",
158
  "R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15",
159
  "PC", "PR", "GBR", "VBR", "MACH", "MACL", "SR",
160
  NULL, NULL,
161
  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
162
  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
163
  "SSR", "SPC",
164
  "R0_BANK0", "R1_BANK0", "R2_BANK0", "R3_BANK0",
165
  "R4_BANK0", "R5_BANK0", "R6_BANK0", "R7_BANK0",
166
  "R0_BANK1", "R1_BANK1", "R2_BANK1", "R3_BANK1",
167
  "R4_BANK1", "R5_BANK1", "R6_BANK1", "R7_BANK1"
168
};
169
 
170
static char *sh3e_regnames[NUM_REGS] =
171
{
172
  "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7",
173
  "R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15",
174
  "PC", "PR", "GBR", "VBR", "MACH", "MACL", "SR",
175
  "FPUL", "FPSCR",
176
  "FR0", "FR1", "FR2", "FR3", "FR4", "FR5", "FR6", "FR7",
177
  "FR8", "FR9", "FR10", "FR11", "FR12", "FR13", "FR14", "FR15",
178
  "SSR", "SPC",
179
  "R0_BANK0", "R1_BANK0", "R2_BANK0", "R3_BANK0",
180
  "R4_BANK0", "R5_BANK0", "R6_BANK0", "R7_BANK0",
181
  "R0_BANK1", "R1_BANK1", "R2_BANK1", "R3_BANK1",
182
  "R4_BANK1", "R5_BANK1", "R6_BANK1", "R7_BANK1"
183
};
184
 
185
/* Define the monitor command strings. Since these are passed directly
186
   through to a printf style function, we may include formatting
187
   strings. We also need a CR or LF on the end.  */
188
 
189
static struct target_ops sh3_ops, sh3e_ops;
190
 
191
static char *sh3_inits[] =
192
{"\003", NULL};                 /* Exits sub-command mode & download cmds */
193
 
194
static struct monitor_ops sh3_cmds;
195
 
196
static void
197
init_sh3_cmds (void)
198
{
199
  sh3_cmds.flags = MO_CLR_BREAK_USES_ADDR | MO_GETMEM_READ_SINGLE;      /* flags */
200
  sh3_cmds.init = sh3_inits;    /* monitor init string */
201
  sh3_cmds.cont = "g\r";        /* continue command */
202
  sh3_cmds.step = "s\r";        /* single step */
203
  sh3_cmds.stop = "\003";       /* Interrupt program */
204
  sh3_cmds.set_break = "b %x\r";        /* set a breakpoint */
205
  sh3_cmds.clr_break = "b -%x\r";       /* clear a breakpoint */
206
  sh3_cmds.clr_all_break = "b -\r";     /* clear all breakpoints */
207
  sh3_cmds.fill = "f %x @%x %x\r";      /* fill (start len val) */
208
  sh3_cmds.setmem.cmdb = "m %x %x\r";   /* setmem.cmdb (addr, value) */
209
  sh3_cmds.setmem.cmdw = "m %x %x;w\r";         /* setmem.cmdw (addr, value) */
210
  sh3_cmds.setmem.cmdl = "m %x %x;l\r";         /* setmem.cmdl (addr, value) */
211
  sh3_cmds.setmem.cmdll = NULL; /* setmem.cmdll (addr, value) */
212
  sh3_cmds.setmem.resp_delim = NULL;    /* setreg.resp_delim */
213
  sh3_cmds.setmem.term = NULL;  /* setreg.term */
214
  sh3_cmds.setmem.term_cmd = NULL;      /* setreg.term_cmd */
215
  sh3_cmds.getmem.cmdb = "m %x\r";      /* getmem.cmdb (addr, len) */
216
  sh3_cmds.getmem.cmdw = "m %x;w\r";    /* getmem.cmdw (addr, len) */
217
  sh3_cmds.getmem.cmdl = "m %x;l\r";    /* getmem.cmdl (addr, len) */
218
  sh3_cmds.getmem.cmdll = NULL; /* getmem.cmdll (addr, len) */
219
  sh3_cmds.getmem.resp_delim = "^ [0-9A-F]+ ";  /* getmem.resp_delim */
220
  sh3_cmds.getmem.term = "? ";  /* getmem.term */
221
  sh3_cmds.getmem.term_cmd = ".\r";     /* getmem.term_cmd */
222
  sh3_cmds.setreg.cmd = ".%s %x\r";     /* setreg.cmd (name, value) */
223
  sh3_cmds.setreg.resp_delim = NULL;    /* setreg.resp_delim */
224
  sh3_cmds.setreg.term = NULL;  /* setreg.term */
225
  sh3_cmds.setreg.term_cmd = NULL;      /* setreg.term_cmd */
226
  sh3_cmds.getreg.cmd = ".%s\r";        /* getreg.cmd (name) */
227
  sh3_cmds.getreg.resp_delim = "=";     /* getreg.resp_delim */
228
  sh3_cmds.getreg.term = "? ";  /* getreg.term */
229
  sh3_cmds.getreg.term_cmd = ".\r";     /* getreg.term_cmd */
230
  sh3_cmds.dump_registers = "r\r";      /* dump_registers */
231
  sh3_cmds.register_pattern = "\\(\\w+\\)=\\([0-9a-fA-F]+\\( +[0-9a-fA-F]+\\b\\)*\\)";
232
  sh3_cmds.supply_register = sh3_supply_register;       /* supply_register */
233
  sh3_cmds.load_routine = sh3_load;     /* load_routine */
234
  sh3_cmds.load = NULL;         /* download command */
235
  sh3_cmds.loadresp = NULL;     /* Load response */
236
  sh3_cmds.prompt = "\n:";      /* monitor command prompt */
237
  sh3_cmds.line_term = "\r";    /* end-of-line terminator */
238
  sh3_cmds.cmd_end = ".\r";     /* optional command terminator */
239
  sh3_cmds.target = &sh3_ops;   /* target operations */
240
  sh3_cmds.stopbits = SERIAL_1_STOPBITS;        /* number of stop bits */
241
  sh3_cmds.regnames = sh3_regnames;     /* registers names */
242
  sh3_cmds.magic = MONITOR_OPS_MAGIC;   /* magic */
243
}                               /* init_sh3_cmds */
244
 
245
/* This monitor structure is identical except for a couple slots, so
246
   we will fill it in from the base structure when needed.  */
247
 
248
static struct monitor_ops sh3e_cmds;
249
 
250
static void
251
sh3_open (args, from_tty)
252
     char *args;
253
     int from_tty;
254
{
255
  char *serial_port_name = args;
256
  char *parallel_port_name = 0;
257
 
258
  if (args)
259
    {
260
      char *cursor = serial_port_name = strsave (args);
261
 
262
      while (*cursor && *cursor != ' ')
263
        cursor++;
264
 
265
      if (*cursor)
266
        *cursor++ = 0;
267
 
268
      while (*cursor == ' ')
269
        cursor++;
270
 
271
      if (*cursor)
272
        parallel_port_name = cursor;
273
    }
274
 
275
  monitor_open (serial_port_name, &sh3_cmds, from_tty);
276
 
277
  if (parallel_port_name)
278
    {
279
      parallel = SERIAL_OPEN (parallel_port_name);
280
 
281
      if (!parallel)
282
        perror_with_name ("Unable to open parallel port.");
283
 
284
      parallel_in_use = 1;
285
    }
286
 
287
  /* If we connected successfully, we know the processor is an SH3.  */
288
  set_architecture_from_arch_mach (bfd_arch_sh, bfd_mach_sh3);
289
}
290
 
291
 
292
static void
293
sh3e_open (args, from_tty)
294
     char *args;
295
     int from_tty;
296
{
297
  char *serial_port_name = args;
298
  char *parallel_port_name = 0;
299
 
300
  if (args)
301
    {
302
      char *cursor = serial_port_name = strsave (args);
303
 
304
      while (*cursor && *cursor != ' ')
305
        cursor++;
306
 
307
      if (*cursor)
308
        *cursor++ = 0;
309
 
310
      while (*cursor == ' ')
311
        cursor++;
312
 
313
      if (*cursor)
314
        parallel_port_name = cursor;
315
    }
316
 
317
  /* Set up the SH-3E monitor commands structure.  */
318
 
319
  memcpy (&sh3e_cmds, &sh3_cmds, sizeof (struct monitor_ops));
320
 
321
  sh3e_cmds.target = &sh3e_ops;
322
  sh3e_cmds.regnames = sh3e_regnames;
323
 
324
  monitor_open (serial_port_name, &sh3e_cmds, from_tty);
325
 
326
  if (parallel_port_name)
327
    {
328
      parallel = SERIAL_OPEN (parallel_port_name);
329
 
330
      if (!parallel)
331
        perror_with_name ("Unable to open parallel port.");
332
 
333
      parallel_in_use = 1;
334
    }
335
 
336
  /* If we connected successfully, we know the processor is an SH3E.  */
337
  set_architecture_from_arch_mach (bfd_arch_sh, bfd_mach_sh3);
338
}
339
 
340
static void
341
sh3_close (quitting)
342
     int quitting;
343
{
344
  monitor_close (quitting);
345
  if (parallel_in_use)
346
    {
347
      SERIAL_CLOSE (parallel);
348
      parallel_in_use = 0;
349
    }
350
}
351
 
352
void
353
_initialize_sh3_rom ()
354
{
355
  init_sh3_cmds ();
356
  init_monitor_ops (&sh3_ops);
357
 
358
  sh3_ops.to_shortname = "sh3";
359
  sh3_ops.to_longname = "Hitachi SH-3 rom monitor";
360
 
361
  sh3_ops.to_doc =
362
#ifdef _WINDOWS
363
  /* On windows we can talk through the parallel port too. */
364
    "Debug on a Hitachi eval board running the SH-3 rom monitor.\n"
365
    "Specify the serial device it is connected to (e.g. com2).\n"
366
    "If you want to use the parallel port to download to it, specify that\n"
367
    "as the second argument. (e.g. lpt1)";
368
#else
369
    "Debug on a Hitachi eval board running the SH-3 rom monitor.\n\
370
Specify the serial device it is connected to (e.g. /dev/ttya).";
371
#endif
372
 
373
  sh3_ops.to_open = sh3_open;
374
  sh3_ops.to_close = sh3_close;
375
 
376
  add_target (&sh3_ops);
377
 
378
  /* Setup the SH3e, which has float registers.  */
379
 
380
  init_monitor_ops (&sh3e_ops);
381
 
382
  sh3e_ops.to_shortname = "sh3e";
383
  sh3e_ops.to_longname = "Hitachi SH-3E rom monitor";
384
 
385
  sh3e_ops.to_doc =
386
#ifdef _WINDOWS
387
  /* On windows we can talk through the parallel port too. */
388
    "Debug on a Hitachi eval board running the SH-3E rom monitor.\n"
389
    "Specify the serial device it is connected to (e.g. com2).\n"
390
    "If you want to use the parallel port to download to it, specify that\n"
391
    "as the second argument. (e.g. lpt1)";
392
#else
393
    "Debug on a Hitachi eval board running the SH-3E rom monitor.\n\
394
Specify the serial device it is connected to (e.g. /dev/ttya).";
395
#endif
396
 
397
  sh3e_ops.to_open = sh3e_open;
398
  sh3e_ops.to_close = sh3_close;
399
 
400
  add_target (&sh3e_ops);
401
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.