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