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