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