2001-01-26 Fernando Nasser <fnasser@redhat.com>
[deliverable/binutils-gdb.git] / gdb / v850ice.c
CommitLineData
6027a0b8 1/* ICE interface for the NEC V850 for GDB, the GNU debugger.
d9fcf2fb 2 Copyright 1996, 2000 Free Software Foundation, Inc.
6027a0b8 3
c5aa993b 4 This file is part of GDB.
6027a0b8 5
c5aa993b
JM
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.
6027a0b8 10
c5aa993b
JM
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.
6027a0b8 15
c5aa993b
JM
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. */
6027a0b8
JM
20
21#include "defs.h"
22#include "gdb_string.h"
23#include "frame.h"
24#include "symtab.h"
25#include "inferior.h"
26#include "breakpoint.h"
27#include "symfile.h"
28#include "target.h"
29#include "objfiles.h"
30#include "gdbcore.h"
31#include "value.h"
32#include "command.h"
33
3fc11d3e 34#include <tcl.h>
6027a0b8 35#include <windows.h>
c5aa993b
JM
36#include <winuser.h> /* for WM_USER */
37
38extern unsigned long int strtoul (const char *nptr, char **endptr,
39 int base);
6027a0b8 40
6027a0b8
JM
41/* Local data definitions */
42struct MessageIO
c5aa993b
JM
43 {
44 int size; /* length of input or output in bytes */
45 char *buf; /* buffer having the input/output information */
46 };
6027a0b8
JM
47
48/* Prototypes for functions located in other files */
a14ed312 49extern void break_command (char *, int);
6027a0b8 50
a14ed312 51extern void stepi_command (char *, int);
6027a0b8 52
a14ed312 53extern void nexti_command (char *, int);
6027a0b8 54
a14ed312 55extern void continue_command (char *, int);
6027a0b8 56
507f3c78 57extern int (*ui_loop_hook) (int);
6027a0b8
JM
58
59/* Prototypes for local functions */
a14ed312 60static int init_hidden_window (void);
6027a0b8 61
a14ed312 62static LRESULT CALLBACK v850ice_wndproc (HWND, UINT, WPARAM, LPARAM);
6027a0b8 63
a14ed312 64static void v850ice_files_info (struct target_ops *ignore);
6027a0b8 65
a14ed312
KB
66static int v850ice_xfer_memory (CORE_ADDR memaddr, char *myaddr,
67 int len, int should_write,
68 struct target_ops *target);
6027a0b8 69
a14ed312 70static void v850ice_prepare_to_store (void);
6027a0b8 71
a14ed312 72static void v850ice_fetch_registers (int regno);
6027a0b8 73
a14ed312 74static void v850ice_resume (int pid, int step, enum target_signal siggnal);
6027a0b8 75
a14ed312 76static void v850ice_open (char *name, int from_tty);
6027a0b8 77
a14ed312 78static void v850ice_close (int quitting);
6027a0b8 79
a14ed312 80static void v850ice_stop (void);
6027a0b8 81
a14ed312 82static void v850ice_store_registers (int regno);
6027a0b8 83
a14ed312 84static void v850ice_mourn (void);
6027a0b8 85
a14ed312 86static int v850ice_wait (int pid, struct target_waitstatus *status);
6027a0b8 87
a14ed312 88static void v850ice_kill (void);
6027a0b8 89
a14ed312 90static void v850ice_detach (char *args, int from_tty);
6027a0b8 91
a14ed312 92static int v850ice_insert_breakpoint (CORE_ADDR, char *);
6027a0b8 93
a14ed312 94static int v850ice_remove_breakpoint (CORE_ADDR, char *);
6027a0b8 95
a14ed312 96static void v850ice_command (char *, int);
6027a0b8 97
a14ed312 98static int ice_disassemble (unsigned long, int, char *);
6027a0b8 99
a14ed312 100static int ice_lookup_addr (unsigned long *, char *, char *);
6027a0b8 101
a14ed312 102static int ice_lookup_symbol (unsigned long, char *);
6027a0b8 103
a14ed312 104static void ice_SimulateDisassemble (char *, int);
6027a0b8 105
a14ed312 106static void ice_SimulateAddrLookup (char *, int);
6027a0b8 107
a14ed312 108static void ice_Simulate_SymLookup (char *, int);
6027a0b8 109
d9fcf2fb 110static void ice_fputs (const char *, struct ui_file *);
6027a0b8 111
a14ed312 112static int ice_file (char *);
6027a0b8 113
a14ed312 114static int ice_cont (char *);
6027a0b8 115
a14ed312 116static int ice_stepi (char *);
6027a0b8 117
a14ed312 118static int ice_nexti (char *);
6027a0b8 119
a14ed312 120static void togdb_force_update (void);
6027a0b8 121
a14ed312 122static void view_source (CORE_ADDR);
3fc11d3e 123
ac1d1083 124static void do_gdb (char *, char *, void (*func) (char *, int), int);
6027a0b8
JM
125
126
127/* Globals */
c5aa993b 128static HWND hidden_hwnd; /* HWND for messages */
6027a0b8 129
ac1d1083 130long (__stdcall * ExeAppReq) (char *, long, char *, struct MessageIO *);
6027a0b8 131
ac1d1083 132long (__stdcall * RegisterClient) (HWND);
6027a0b8 133
ac1d1083 134long (__stdcall * UnregisterClient) (void);
6027a0b8 135
3fc11d3e 136extern Tcl_Interp *gdbtk_interp;
6027a0b8
JM
137
138/* Globals local to this file only */
c5aa993b 139static int ice_open = 0; /* Is ICE open? */
6027a0b8 140
c5aa993b 141static char *v850_CB_Result; /* special char array for saving 'callback' results */
6027a0b8 142
c5aa993b 143static int SimulateCallback; /* simulate a callback event */
6027a0b8 144
c5aa993b
JM
145#define MAX_BLOCK_SIZE 64*1024 /* Cannot transfer memory in blocks bigger
146 than this */
6027a0b8 147/* MDI/ICE Message IDs */
c5aa993b
JM
148#define GSINGLESTEP 0x200 /* single-step target */
149#define GRESUME 0x201 /* resume target */
150#define GREADREG 0x202 /* read a register */
151#define GWRITEREG 0x203 /* write a register */
152#define GWRITEBLOCK 0x204 /* write a block of memory */
153#define GREADBLOCK 0x205 /* read a block of memory */
154#define GSETBREAK 0x206 /* set a breakpoint */
155#define GREMOVEBREAK 0x207 /* remove a breakpoint */
156#define GHALT 0x208 /* ??? */
157#define GCHECKSTATUS 0x209 /* check status of ICE */
158#define GMDIREPLY 0x210 /* Reply for previous query - NOT USED */
159#define GDOWNLOAD 0x211 /* something for MDI */
160#define GCOMMAND 0x212 /* execute command in ice */
161#define GLOADFILENAME 0x213 /* retrieve load filename */
162#define GWRITEMEM 0x214 /* write word, half-word, or byte */
6027a0b8
JM
163
164/* GCHECKSTATUS return codes: */
165#define ICE_Idle 0x00
c5aa993b
JM
166#define ICE_Breakpoint 0x01 /* hit a breakpoint */
167#define ICE_Stepped 0x02 /* have stepped */
168#define ICE_Exception 0x03 /* have exception */
169#define ICE_Halted 0x04 /* hit a user halt */
170#define ICE_Exited 0x05 /* called exit */
171#define ICE_Terminated 0x06 /* user terminated */
6027a0b8
JM
172#define ICE_Running 0x07
173#define ICE_Unknown 0x99
174
175/* Windows messages */
176#define WM_STATE_CHANGE WM_USER+101
177#define WM_SYM_TO_ADDR WM_USER+102
178#define WM_ADDR_TO_SYM WM_USER+103
179#define WM_DISASSEMBLY WM_USER+104
180#define WM_SOURCE WM_USER+105
181
182/* STATE_CHANGE codes */
c5aa993b
JM
183#define STATE_CHANGE_REGS 1 /* Register(s) changed */
184#define STATE_CHANGE_LOAD 2 /* HW reset */
185#define STATE_CHANGE_RESET 3 /* Load new file */
186#define STATE_CHANGE_CONT 4 /* Run target */
187#define STATE_CHANGE_STOP 5 /* Stop target */
188#define STATE_CHANGE_STEPI 6 /* Stepi target */
189#define STATE_CHANGE_NEXTI 7 /* Nexti target */
6027a0b8
JM
190
191static struct target_ops v850ice_ops; /* Forward decl */
192
193/* This function creates a hidden window */
194static int
fba45db2 195init_hidden_window (void)
6027a0b8
JM
196{
197 WNDCLASS class;
198
199 if (hidden_hwnd != NULL)
200 return 1;
201
202 class.style = 0;
203 class.cbClsExtra = 0;
204 class.cbWndExtra = 0;
205 class.hInstance = GetModuleHandle (0);
206 class.hbrBackground = NULL;
207 class.lpszMenuName = NULL;
208 class.lpszClassName = "gdb_v850ice";
209 class.lpfnWndProc = v850ice_wndproc;
210 class.hIcon = NULL;
211 class.hCursor = NULL;
212
c5aa993b 213 if (!RegisterClass (&class))
6027a0b8
JM
214 return 0;
215
216 hidden_hwnd = CreateWindow ("gdb_v850ice", "gdb_v850ice", WS_TILED,
c5aa993b
JM
217 0, 0, 0, 0, NULL, NULL, class.hInstance,
218 NULL);
6027a0b8
JM
219 if (hidden_hwnd == NULL)
220 {
221 char buf[200];
222 DWORD err;
223
224 err = GetLastError ();
225 FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
c5aa993b 226 0, buf, 200, NULL);
6027a0b8
JM
227 printf_unfiltered ("Could not create window: %s", buf);
228 return 0;
229 }
230
231 return 1;
232}
233
234/*
235 This function is installed as the message handler for the hidden window
236 which QBox will use to communicate with gdb. It recognize and acts
237 on the following messages:
238
239 WM_SYM_TO_ADDR \
240 WM_ADDR_TO_SYM | Not implemented at NEC's request
241 WM_DISASSEMBLY /
242 WM_STATE_CHANGE - tells us that a state change has occured in the ICE
c5aa993b 243 */
6027a0b8 244static LRESULT CALLBACK
fba45db2 245v850ice_wndproc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
6027a0b8
JM
246{
247 LRESULT result = FALSE;
248
249 switch (message)
250 {
251 case WM_SYM_TO_ADDR:
252 MessageBox (0, "Symbol resolution\nNot implemented", "GDB", MB_OK);
253 break;
254 case WM_ADDR_TO_SYM:
255 MessageBox (0, "Address resolution\nNot implemented", "GDB", MB_OK);
256 break;
257 case WM_SOURCE:
3fc11d3e 258 view_source ((CORE_ADDR) lParam);
6027a0b8
JM
259 break;
260 case WM_STATE_CHANGE:
261 switch (wParam)
c5aa993b
JM
262 {
263 case STATE_CHANGE_LOAD:
264 {
265 struct MessageIO iob;
266 char buf[128];
267
268 iob.buf = buf;
269 iob.size = 128;
270
271 /* Load in a new file... Need filename */
272 ExeAppReq ("GDB", GLOADFILENAME, NULL, &iob);
273 if (!catch_errors ((catch_errors_ftype *) ice_file, iob.buf, "", RETURN_MASK_ALL))
274 printf_unfiltered ("load errored\n");
275 }
276 break;
277 case STATE_CHANGE_RESET:
278 registers_changed ();
279 flush_cached_frames ();
280 togdb_force_update ();
281 result = TRUE;
282 break;
283 case STATE_CHANGE_REGS:
284 registers_changed ();
285 togdb_force_update ();
286 result = TRUE;
287 break;
288 case STATE_CHANGE_CONT:
289 if (!catch_errors ((catch_errors_ftype *) ice_cont, NULL, "", RETURN_MASK_ALL))
290 printf_unfiltered ("continue errored\n");
291 result = TRUE;
292 break;
293 case STATE_CHANGE_STEPI:
294 if (!catch_errors ((catch_errors_ftype *) ice_stepi, (PTR) (int) lParam, "",
295 RETURN_MASK_ALL))
296 printf_unfiltered ("stepi errored\n");
297 result = TRUE;
298 break;
299 case STATE_CHANGE_NEXTI:
300 if (!catch_errors ((catch_errors_ftype *) ice_nexti, (PTR) (int) lParam, "",
301 RETURN_MASK_ALL))
302 printf_unfiltered ("nexti errored\n");
303 result = TRUE;
304 break;
305 }
6027a0b8
JM
306 }
307
308 if (result == FALSE)
309 return DefWindowProc (hwnd, message, wParam, lParam);
310
311 return FALSE;
312}
313
314/* Code for opening a connection to the ICE. */
315
316static void
fba45db2 317v850ice_open (char *name, int from_tty)
6027a0b8
JM
318{
319 HINSTANCE handle;
320
321 if (name)
322 error ("Too many arguments.");
323
324 target_preopen (from_tty);
325
326 unpush_target (&v850ice_ops);
327
328 if (from_tty)
329 puts_filtered ("V850ice debugging\n");
330
331 push_target (&v850ice_ops); /* Switch to using v850ice target now */
332
333 target_terminal_init ();
334
335 /* Initialize everything necessary to facilitate communication
336 between QBox, gdb, and the DLLs which control the ICE */
337 if (ExeAppReq == NULL)
338 {
339 handle = LoadLibrary ("necmsg.dll");
340 if (handle == NULL)
c5aa993b 341 error ("Cannot load necmsg.dll");
6027a0b8 342
ac1d1083 343 ExeAppReq = (long (*) (char *, long, char *, struct MessageIO *))
c5aa993b 344 GetProcAddress (handle, "ExeAppReq");
ac1d1083 345 RegisterClient = (long (*) (HWND))
c5aa993b 346 GetProcAddress (handle, "RegisterClient");
ac1d1083 347 UnregisterClient = (long (*) (void))
c5aa993b 348 GetProcAddress (handle, "UnregisterClient");
6027a0b8
JM
349
350 if (ExeAppReq == NULL || RegisterClient == NULL || UnregisterClient == NULL)
c5aa993b 351 error ("Could not find requisite functions in necmsg.dll.");
6027a0b8
JM
352
353 if (!init_hidden_window ())
c5aa993b 354 error ("could not initialize message handling");
6027a0b8
JM
355 }
356
357 /* Tell the DLL we are here */
358 RegisterClient (hidden_hwnd);
359
360 ice_open = 1;
361
362 /* Without this, some commands which require an active target (such as kill)
363 won't work. This variable serves (at least) double duty as both the pid
364 of the target process (if it has such), and as a flag indicating that a
365 target is active. These functions should be split out into seperate
366 variables, especially since GDB will someday have a notion of debugging
367 several processes. */
368 inferior_pid = 42000;
369
370 start_remote ();
371 return;
372}
373
374/* Clean up connection to a remote debugger. */
375
376/* ARGSUSED */
377static void
fba45db2 378v850ice_close (int quitting)
6027a0b8
JM
379{
380 if (ice_open)
381 {
382 UnregisterClient ();
383 ice_open = 0;
384 inferior_pid = 0;
385 }
386}
387
388/* Stop the process on the ice. */
389static void
fba45db2 390v850ice_stop (void)
6027a0b8
JM
391{
392 /* This is silly, but it works... */
393 v850ice_command ("stop", 0);
394}
395
396static void
fba45db2 397v850ice_detach (char *args, int from_tty)
6027a0b8
JM
398{
399 if (args)
400 error ("Argument given to \"detach\" when remotely debugging.");
401
402 pop_target ();
403 if (from_tty)
404 puts_filtered ("Ending v850ice debugging.\n");
405}
406
407/* Tell the remote machine to resume. */
408
409static void
fba45db2 410v850ice_resume (int pid, int step, enum target_signal siggnal)
6027a0b8 411{
c5aa993b
JM
412 long retval;
413 char buf[256];
414 struct MessageIO iob;
6027a0b8
JM
415
416 iob.size = 0;
c5aa993b 417 iob.buf = buf;
6027a0b8
JM
418
419 if (step)
420 retval = ExeAppReq ("GDB", GSINGLESTEP, "step", &iob);
421 else
422 retval = ExeAppReq ("GDB", GRESUME, "run", &iob);
423
424 if (retval)
425 error ("ExeAppReq (step = %d) returned %d", step, retval);
426}
427
428/* Wait until the remote machine stops, then return,
429 storing status in STATUS just as `wait' would.
430 Returns "pid" (though it's not clear what, if anything, that
431 means in the case of this target). */
432
433static int
fba45db2 434v850ice_wait (int pid, struct target_waitstatus *status)
6027a0b8
JM
435{
436 long v850_status;
437 char buf[256];
c5aa993b 438 struct MessageIO iob;
6027a0b8
JM
439 int done = 0;
440 int count = 0;
441
442 iob.size = 0;
c5aa993b
JM
443 iob.buf = buf;
444
6027a0b8
JM
445 do
446 {
447 if (count++ % 100000)
c5aa993b
JM
448 {
449 ui_loop_hook (0);
6027a0b8 450 count = 0;
c5aa993b 451 }
6027a0b8
JM
452
453 v850_status = ExeAppReq ("GDB", GCHECKSTATUS, NULL, &iob);
454
455 switch (v850_status)
c5aa993b
JM
456 {
457 case ICE_Idle:
458 case ICE_Breakpoint:
459 case ICE_Stepped:
460 case ICE_Halted:
461 status->kind = TARGET_WAITKIND_STOPPED;
462 status->value.sig = TARGET_SIGNAL_TRAP;
463 done = 1;
464 break;
465 case ICE_Exception:
466 status->kind = TARGET_WAITKIND_SIGNALLED;
467 status->value.sig = TARGET_SIGNAL_SEGV;
468 done = 1;
469 break;
470 case ICE_Exited:
471 status->kind = TARGET_WAITKIND_EXITED;
472 status->value.integer = 0;
473 done = 1;
474 break;
475 case ICE_Terminated:
476 status->kind = TARGET_WAITKIND_SIGNALLED;
477 status->value.sig = TARGET_SIGNAL_KILL;
478 done = 1;
479 break;
480 default:
481 break;
482 }
6027a0b8
JM
483 }
484 while (!done);
c5aa993b 485
6027a0b8
JM
486 return inferior_pid;
487}
488
489static int
fba45db2 490convert_register (int regno, char *buf)
6027a0b8
JM
491{
492 if (regno <= 31)
493 sprintf (buf, "r%d", regno);
494 else if (REGISTER_NAME (regno)[0] == 's'
495 && REGISTER_NAME (regno)[1] == 'r')
496 return 0;
497 else
498 sprintf (buf, "%s", REGISTER_NAME (regno));
499
500 return 1;
501}
502
503/* Read the remote registers into the block REGS. */
504/* Note that the ICE returns register contents as ascii hex strings. We have
505 to convert that to an unsigned long, and then call store_unsigned_integer to
506 convert it to target byte-order if necessary. */
507
508static void
fba45db2 509v850ice_fetch_registers (int regno)
6027a0b8
JM
510{
511 long retval;
512 char cmd[100];
513 char val[100];
514 struct MessageIO iob;
515 unsigned long regval;
516 char *p;
517
518 if (regno == -1)
519 {
520 for (regno = 0; regno < NUM_REGS; regno++)
c5aa993b 521 v850ice_fetch_registers (regno);
6027a0b8
JM
522 return;
523 }
524
525 strcpy (cmd, "reg ");
526 if (!convert_register (regno, &cmd[4]))
527 return;
528
529 iob.size = sizeof val;
530 iob.buf = val;
531 retval = ExeAppReq ("GDB", GREADREG, cmd, &iob);
532 if (retval)
533 error ("1: ExeAppReq returned %d: cmd = %s", retval, cmd);
534
535 regval = strtoul (val, NULL, 16);
536 if (regval == 0 && p == val)
537 error ("v850ice_fetch_registers (%d): bad value from ICE: %s.",
c5aa993b 538 regno, val);
6027a0b8
JM
539
540 store_unsigned_integer (val, REGISTER_RAW_SIZE (regno), regval);
541 supply_register (regno, val);
542}
543
544/* Store register REGNO, or all registers if REGNO == -1, from the contents
545 of REGISTERS. */
546
547static void
fba45db2 548v850ice_store_registers (int regno)
6027a0b8
JM
549{
550 long retval;
551 char cmd[100];
552 unsigned long regval;
553 char buf[256];
554 struct MessageIO iob;
555 iob.size = 0;
556 iob.buf = buf;
557
558 if (regno == -1)
559 {
560 for (regno = 0; regno < NUM_REGS; regno++)
561 v850ice_store_registers (regno);
562 return;
563 }
564
565 regval = extract_unsigned_integer (&registers[REGISTER_BYTE (regno)],
c5aa993b 566 REGISTER_RAW_SIZE (regno));
6027a0b8
JM
567 strcpy (cmd, "reg ");
568 if (!convert_register (regno, &cmd[4]))
569 return;
570 sprintf (cmd + strlen (cmd), "=0x%x", regval);
571
572 retval = ExeAppReq ("GDB", GWRITEREG, cmd, &iob);
573 if (retval)
574 error ("2: ExeAppReq returned %d: cmd = %s", retval, cmd);
575}
576
577/* Prepare to store registers. Nothing to do here, since the ICE can write one
578 register at a time. */
579
c5aa993b 580static void
fba45db2 581v850ice_prepare_to_store (void)
6027a0b8
JM
582{
583}
584
585/* Read or write LEN bytes from inferior memory at MEMADDR, transferring
586 to or from debugger address MYADDR. Write to inferior if SHOULD_WRITE is
5af20574
KB
587 nonzero. TARGET is unused. Returns length of data written or read;
588 0 for error.
6027a0b8
JM
589
590 We can only read/write MAX_BLOCK_SIZE bytes at a time, though, or the DLL
5af20574 591 dies. */
6027a0b8
JM
592/* ARGSUSED */
593static int
5af20574
KB
594v850ice_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
595 int should_write, struct target_ops *target)
6027a0b8
JM
596{
597 long retval;
598 char cmd[100];
599 struct MessageIO iob;
600 int sent;
601
602 if (should_write)
603 {
604 if (len == 4 || len == 2 || len == 1)
c5aa993b
JM
605 {
606 long value = 0;
607 char buf[256];
608 char c;
609
610 iob.size = 0;
611 iob.buf = buf;
612
613 sent = 0;
614 switch (len)
615 {
616 case 4:
617 c = 'w';
618 value |= (long) ((myaddr[3] << 24) & 0xff000000);
619 value |= (long) ((myaddr[2] << 16) & 0x00ff0000);
620 value |= (long) ((myaddr[1] << 8) & 0x0000ff00);
621 value |= (long) (myaddr[0] & 0x000000ff);
622 break;
623 case 2:
624 c = 'h';
625 value |= (long) ((myaddr[1] << 8) & 0xff00);
626 value |= (long) (myaddr[0] & 0x00ff);
6027a0b8 627 break;
c5aa993b
JM
628 case 1:
629 c = 'b';
630 value |= (long) (myaddr[0] & 0xff);
631 break;
632 }
633
634 sprintf (cmd, "memory %c c 0x%x=0x%x", c, (int) memaddr, value);
635 retval = ExeAppReq ("GDB", GWRITEMEM, cmd, &iob);
636 if (retval == 0)
637 sent = len;
638 }
639 else
640 {
641 sent = 0;
642 do
643 {
644 iob.size = len > MAX_BLOCK_SIZE ? MAX_BLOCK_SIZE : len;
645 iob.buf = myaddr;
646 sprintf (cmd, "memory b c 0x%x=0x00 l=%d", (int) memaddr, iob.size);
647 retval = ExeAppReq ("GDB", GWRITEBLOCK, cmd, &iob);
648 if (retval != 0)
649 break;
650 len -= iob.size;
651 memaddr += iob.size;
652 myaddr += iob.size;
653 sent += iob.size;
654 }
655 while (len > 0);
656 }
6027a0b8
JM
657 }
658 else
659 {
660 unsigned char *tmp;
661 unsigned char *t;
662 int i;
c5aa993b 663
6027a0b8
JM
664 tmp = alloca (len + 100);
665 t = tmp;
666 memset (tmp + len, 0xff, 100);
667
668 sent = 0;
669 do
c5aa993b
JM
670 {
671 iob.size = len > MAX_BLOCK_SIZE ? MAX_BLOCK_SIZE : len;
672 iob.buf = tmp;
673 sprintf (cmd, "memory b 0x%x l=%d", (int) memaddr, iob.size);
674 retval = ExeAppReq ("GDB", GREADBLOCK, cmd, &iob);
675 if (retval != 0)
676 break;
677 len -= iob.size;
678 memaddr += iob.size;
679 sent += iob.size;
680 tmp += iob.size;
681 }
6027a0b8
JM
682 while (len > 0);
683
684 if (retval == 0)
c5aa993b
JM
685 {
686 for (i = 0; i < 100; i++)
687 {
688 if (t[sent + i] != 0xff)
689 {
690 warning ("GREADBLOCK trashed bytes after transfer area.");
691 break;
692 }
693 }
694 memcpy (myaddr, t, sent);
695 }
6027a0b8 696 }
c5aa993b 697
6027a0b8
JM
698 if (retval != 0)
699 error ("3: ExeAppReq returned %d: cmd = %s", retval, cmd);
c5aa993b 700
6027a0b8
JM
701 return sent;
702}
703
704static void
fba45db2 705v850ice_files_info (struct target_ops *ignore)
6027a0b8
JM
706{
707 puts_filtered ("Debugging a target via the NEC V850 ICE.\n");
708}
709
710static int
fba45db2 711v850ice_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
6027a0b8
JM
712{
713 long retval;
714 char cmd[100];
715 char buf[256];
716 struct MessageIO iob;
717
718 iob.size = 0;
c5aa993b 719 iob.buf = buf;
6027a0b8
JM
720 sprintf (cmd, "%d, ", addr);
721
722 retval = ExeAppReq ("GDB", GSETBREAK, cmd, &iob);
723 if (retval)
724 error ("ExeAppReq (GSETBREAK) returned %d: cmd = %s", retval, cmd);
725
726 return 0;
727}
728
729static int
fba45db2 730v850ice_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
6027a0b8
JM
731{
732 long retval;
733 char cmd[100];
734 char buf[256];
735 struct MessageIO iob;
736
737 iob.size = 0;
c5aa993b 738 iob.buf = buf;
6027a0b8
JM
739
740 sprintf (cmd, "%d, ", addr);
741
742 retval = ExeAppReq ("GDB", GREMOVEBREAK, cmd, &iob);
743 if (retval)
744 error ("ExeAppReq (GREMOVEBREAK) returned %d: cmd = %s", retval, cmd);
745
746 return 0;
747}
748
749static void
fba45db2 750v850ice_kill (void)
6027a0b8
JM
751{
752 target_mourn_inferior ();
753 inferior_pid = 0;
754}
755
756static void
fba45db2 757v850ice_mourn (void)
6027a0b8
JM
758{
759}
760
761static void
fba45db2 762v850ice_load (char *filename, int from_tty)
6027a0b8
JM
763{
764 struct MessageIO iob;
765 char buf[256];
766
767 iob.size = 0;
c5aa993b
JM
768 iob.buf = buf;
769 generic_load (filename, from_tty);
6027a0b8
JM
770 ExeAppReq ("GDB", GDOWNLOAD, filename, &iob);
771}
772
773static int
fba45db2 774ice_file (char *arg)
6027a0b8
JM
775{
776 char *s;
c5aa993b 777
6027a0b8
JM
778 target_detach (NULL, 0);
779 pop_target ();
780
781 printf_unfiltered ("\n");
782
783 s = arg;
784 while (*s != '\0')
785 {
786 if (*s == '\\')
c5aa993b 787 *s = '/';
6027a0b8
JM
788 s++;
789 }
790
791 /* Safegaurd against confusing the breakpoint routines... */
c5aa993b 792 delete_command (NULL, 0);
6027a0b8
JM
793
794 /* Must supress from_tty, otherwise we could start asking if the
795 user really wants to load a new symbol table, etc... */
796 printf_unfiltered ("Reading symbols from %s...", arg);
1adeb98a
FN
797 exec_open (arg, 0);
798 symbol_file_add_main (arg, 0);
6027a0b8
JM
799 printf_unfiltered ("done\n");
800
1adeb98a 801 /* exec_open will kill our target, so reinstall the ICE as
6027a0b8
JM
802 the target. */
803 v850ice_open (NULL, 0);
804
805 togdb_force_update ();
806 return 1;
807}
808
809static int
fba45db2 810ice_cont (char *c)
6027a0b8
JM
811{
812 printf_filtered ("continue (ice)\n");
813 ReplyMessage ((LRESULT) 1);
814
3fc11d3e
JM
815 if (gdbtk_interp == NULL)
816 {
6027a0b8 817 continue_command (NULL, 1);
3fc11d3e
JM
818 }
819 else
820 Tcl_Eval (gdbtk_interp, "gdb_immediate continue");
6027a0b8
JM
821
822 return 1;
823}
824
825static void
5af20574 826do_gdb (char *cmd, char *str, void (*func) (char *, int), int count)
6027a0b8
JM
827{
828 ReplyMessage ((LRESULT) 1);
829
830 while (count--)
831 {
832 printf_unfiltered (str);
833
3fc11d3e
JM
834 if (gdbtk_interp == NULL)
835 {
6027a0b8 836 func (NULL, 0);
3fc11d3e
JM
837 }
838 else
839 Tcl_Eval (gdbtk_interp, cmd);
6027a0b8
JM
840 }
841}
842
843
844static int
fba45db2 845ice_stepi (char *c)
6027a0b8
JM
846{
847 int count = (int) c;
848
849 do_gdb ("gdb_immediate stepi", "stepi (ice)\n", stepi_command, count);
850 return 1;
851}
852
853static int
fba45db2 854ice_nexti (char *c)
6027a0b8
JM
855{
856 int count = (int) c;
857
858 do_gdb ("gdb_immediate nexti", "nexti (ice)\n", nexti_command, count);
859 return 1;
860}
861
862static void
fba45db2 863v850ice_command (char *arg, int from_tty)
6027a0b8
JM
864{
865 struct MessageIO iob;
866 char buf[256];
867
868 iob.buf = buf;
869 iob.size = 0;
870 ExeAppReq ("GDB", GCOMMAND, arg, &iob);
871}
872
873static void
874togdb_force_update (void)
875{
3fc11d3e
JM
876 if (gdbtk_interp != NULL)
877 Tcl_Eval (gdbtk_interp, "gdbtk_update");
6027a0b8
JM
878}
879
3fc11d3e 880static void
fba45db2 881view_source (CORE_ADDR addr)
3fc11d3e
JM
882{
883 char c[256];
884
885 if (gdbtk_interp != NULL)
886 {
887 sprintf (c, "catch {set src [lindex [ManagedWin::find SrcWin] 0]\n$src location BROWSE [gdb_loc *0x%x]}", addr);
888 Tcl_Eval (gdbtk_interp, c);
889 }
890}
6027a0b8
JM
891
892/* Define the target subroutine names */
893
c5aa993b
JM
894static void
895init_850ice_ops (void)
6027a0b8 896{
c5aa993b
JM
897 v850ice_ops.to_shortname = "ice";
898 v850ice_ops.to_longname = "NEC V850 ICE interface";
899 v850ice_ops.to_doc = "Debug a system controlled by a NEC 850 ICE.";
900 v850ice_ops.to_open = v850ice_open;
901 v850ice_ops.to_close = v850ice_close;
902 v850ice_ops.to_attach = NULL;
903 v850ice_ops.to_post_attach = NULL;
904 v850ice_ops.to_require_attach = NULL;
905 v850ice_ops.to_detach = v850ice_detach;
906 v850ice_ops.to_require_detach = NULL;
907 v850ice_ops.to_resume = v850ice_resume;
908 v850ice_ops.to_wait = v850ice_wait;
909 v850ice_ops.to_post_wait = NULL;
910 v850ice_ops.to_fetch_registers = v850ice_fetch_registers;
911 v850ice_ops.to_store_registers = v850ice_store_registers;
912 v850ice_ops.to_prepare_to_store = v850ice_prepare_to_store;
913 v850ice_ops.to_xfer_memory = v850ice_xfer_memory;
914 v850ice_ops.to_files_info = v850ice_files_info;
915 v850ice_ops.to_insert_breakpoint = v850ice_insert_breakpoint;
916 v850ice_ops.to_remove_breakpoint = v850ice_remove_breakpoint;
917 v850ice_ops.to_terminal_init = NULL;
918 v850ice_ops.to_terminal_inferior = NULL;
919 v850ice_ops.to_terminal_ours_for_output = NULL;
920 v850ice_ops.to_terminal_ours = NULL;
921 v850ice_ops.to_terminal_info = NULL;
922 v850ice_ops.to_kill = v850ice_kill;
923 v850ice_ops.to_load = v850ice_load;
924 v850ice_ops.to_lookup_symbol = NULL;
925 v850ice_ops.to_create_inferior = NULL;
926 v850ice_ops.to_mourn_inferior = v850ice_mourn;
927 v850ice_ops.to_can_run = 0;
928 v850ice_ops.to_notice_signals = 0;
929 v850ice_ops.to_thread_alive = NULL;
930 v850ice_ops.to_stop = v850ice_stop;
6027a0b8 931 v850ice_ops.to_pid_to_exec_file = NULL;
c5aa993b
JM
932 v850ice_ops.to_core_file_to_sym_file = NULL;
933 v850ice_ops.to_stratum = process_stratum;
934 v850ice_ops.DONT_USE = NULL;
935 v850ice_ops.to_has_all_memory = 1;
936 v850ice_ops.to_has_memory = 1;
937 v850ice_ops.to_has_stack = 1;
938 v850ice_ops.to_has_registers = 1;
939 v850ice_ops.to_has_execution = 1;
940 v850ice_ops.to_sections = NULL;
941 v850ice_ops.to_sections_end = NULL;
942 v850ice_ops.to_magic = OPS_MAGIC;
6027a0b8
JM
943}
944
945void
fba45db2 946_initialize_v850ice (void)
6027a0b8
JM
947{
948 init_850ice_ops ();
949 add_target (&v850ice_ops);
950
951 add_com ("ice", class_obscure, v850ice_command,
c5aa993b 952 "Send command to ICE");
6027a0b8 953}
This page took 0.144872 seconds and 4 git commands to generate.