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