OSDN Git Service

21daeea6f00029acd720b8a5c50505056f24fc12
[pf3gnuchains/pf3gnuchains3x.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 /* 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.to_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 }