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.
5 This file is part of GDB.
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.
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.
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. */
23 #include "gdb_string.h"
27 #include "breakpoint.h"
38 #include <winuser.h> /* for WM_USER */
40 extern unsigned long int strtoul (const char *nptr, char **endptr,
43 /* Local data definitions */
46 int size; /* length of input or output in bytes */
47 char *buf; /* buffer having the input/output information */
50 /* Prototypes for functions located in other files */
51 extern void break_command (char *, int);
53 extern void stepi_command (char *, int);
55 extern void nexti_command (char *, int);
57 extern void continue_command (char *, int);
59 extern int (*ui_loop_hook) (int);
61 /* Prototypes for local functions */
62 static int init_hidden_window (void);
64 static LRESULT CALLBACK v850ice_wndproc (HWND, UINT, WPARAM, LPARAM);
66 static void v850ice_files_info (struct target_ops *ignore);
68 static int v850ice_xfer_memory (CORE_ADDR memaddr, char *myaddr,
69 int len, int should_write,
70 struct target_ops *target);
72 static void v850ice_prepare_to_store (void);
74 static void v850ice_fetch_registers (int regno);
76 static void v850ice_resume (ptid_t ptid, int step,
77 enum target_signal siggnal);
79 static void v850ice_open (char *name, int from_tty);
81 static void v850ice_close (int quitting);
83 static void v850ice_stop (void);
85 static void v850ice_store_registers (int regno);
87 static void v850ice_mourn (void);
89 static ptid_t v850ice_wait (ptid_t ptid,
90 struct target_waitstatus *status);
92 static void v850ice_kill (void);
94 static void v850ice_detach (char *args, int from_tty);
96 static int v850ice_insert_breakpoint (CORE_ADDR, char *);
98 static int v850ice_remove_breakpoint (CORE_ADDR, char *);
100 static void v850ice_command (char *, int);
102 static int ice_disassemble (unsigned long, int, char *);
104 static int ice_lookup_addr (unsigned long *, char *, char *);
106 static int ice_lookup_symbol (unsigned long, char *);
108 static void ice_SimulateDisassemble (char *, int);
110 static void ice_SimulateAddrLookup (char *, int);
112 static void ice_Simulate_SymLookup (char *, int);
114 static void ice_fputs (const char *, struct ui_file *);
116 static int ice_file (char *);
118 static int ice_cont (char *);
120 static int ice_stepi (char *);
122 static int ice_nexti (char *);
124 static void togdb_force_update (void);
126 static void view_source (CORE_ADDR);
128 static void do_gdb (char *, char *, void (*func) (char *, int), int);
132 static HWND hidden_hwnd; /* HWND for messages */
134 long (__stdcall * ExeAppReq) (char *, long, char *, struct MessageIO *);
136 long (__stdcall * RegisterClient) (HWND);
138 long (__stdcall * UnregisterClient) (void);
140 extern Tcl_Interp *gdbtk_interp;
142 /* Globals local to this file only */
143 static int ice_open = 0; /* Is ICE open? */
145 static char *v850_CB_Result; /* special char array for saving 'callback' results */
147 static int SimulateCallback; /* simulate a callback event */
149 #define MAX_BLOCK_SIZE 64*1024 /* Cannot transfer memory in blocks bigger
151 /* MDI/ICE Message IDs */
152 #define GSINGLESTEP 0x200 /* single-step target */
153 #define GRESUME 0x201 /* resume target */
154 #define GREADREG 0x202 /* read a register */
155 #define GWRITEREG 0x203 /* write a register */
156 #define GWRITEBLOCK 0x204 /* write a block of memory */
157 #define GREADBLOCK 0x205 /* read a block of memory */
158 #define GSETBREAK 0x206 /* set a breakpoint */
159 #define GREMOVEBREAK 0x207 /* remove a breakpoint */
160 #define GHALT 0x208 /* ??? */
161 #define GCHECKSTATUS 0x209 /* check status of ICE */
162 #define GMDIREPLY 0x210 /* Reply for previous query - NOT USED */
163 #define GDOWNLOAD 0x211 /* something for MDI */
164 #define GCOMMAND 0x212 /* execute command in ice */
165 #define GLOADFILENAME 0x213 /* retrieve load filename */
166 #define GWRITEMEM 0x214 /* write word, half-word, or byte */
168 /* GCHECKSTATUS return codes: */
169 #define ICE_Idle 0x00
170 #define ICE_Breakpoint 0x01 /* hit a breakpoint */
171 #define ICE_Stepped 0x02 /* have stepped */
172 #define ICE_Exception 0x03 /* have exception */
173 #define ICE_Halted 0x04 /* hit a user halt */
174 #define ICE_Exited 0x05 /* called exit */
175 #define ICE_Terminated 0x06 /* user terminated */
176 #define ICE_Running 0x07
177 #define ICE_Unknown 0x99
179 /* Windows messages */
180 #define WM_STATE_CHANGE WM_USER+101
181 #define WM_SYM_TO_ADDR WM_USER+102
182 #define WM_ADDR_TO_SYM WM_USER+103
183 #define WM_DISASSEMBLY WM_USER+104
184 #define WM_SOURCE WM_USER+105
186 /* STATE_CHANGE codes */
187 #define STATE_CHANGE_REGS 1 /* Register(s) changed */
188 #define STATE_CHANGE_LOAD 2 /* HW reset */
189 #define STATE_CHANGE_RESET 3 /* Load new file */
190 #define STATE_CHANGE_CONT 4 /* Run target */
191 #define STATE_CHANGE_STOP 5 /* Stop target */
192 #define STATE_CHANGE_STEPI 6 /* Stepi target */
193 #define STATE_CHANGE_NEXTI 7 /* Nexti target */
195 static struct target_ops v850ice_ops; /* Forward decl */
197 /* This function creates a hidden window */
199 init_hidden_window (void)
203 if (hidden_hwnd != NULL)
207 class.cbClsExtra = 0;
208 class.cbWndExtra = 0;
209 class.hInstance = GetModuleHandle (0);
210 class.hbrBackground = NULL;
211 class.lpszMenuName = NULL;
212 class.lpszClassName = "gdb_v850ice";
213 class.lpfnWndProc = v850ice_wndproc;
215 class.hCursor = NULL;
217 if (!RegisterClass (&class))
220 hidden_hwnd = CreateWindow ("gdb_v850ice", "gdb_v850ice", WS_TILED,
221 0, 0, 0, 0, NULL, NULL, class.hInstance,
223 if (hidden_hwnd == NULL)
228 err = GetLastError ();
229 FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
231 printf_unfiltered ("Could not create window: %s", buf);
239 This function is installed as the message handler for the hidden window
240 which QBox will use to communicate with gdb. It recognize and acts
241 on the following messages:
244 WM_ADDR_TO_SYM | Not implemented at NEC's request
246 WM_STATE_CHANGE - tells us that a state change has occured in the ICE
248 static LRESULT CALLBACK
249 v850ice_wndproc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
251 LRESULT result = FALSE;
256 MessageBox (0, "Symbol resolution\nNot implemented", "GDB", MB_OK);
259 MessageBox (0, "Address resolution\nNot implemented", "GDB", MB_OK);
262 view_source ((CORE_ADDR) lParam);
264 case WM_STATE_CHANGE:
267 case STATE_CHANGE_LOAD:
269 struct MessageIO iob;
275 /* Load in a new file... Need filename */
276 ExeAppReq ("GDB", GLOADFILENAME, NULL, &iob);
277 if (!catch_errors ((catch_errors_ftype *) ice_file, iob.buf, "", RETURN_MASK_ALL))
278 printf_unfiltered ("load errored\n");
281 case STATE_CHANGE_RESET:
282 registers_changed ();
283 flush_cached_frames ();
284 togdb_force_update ();
287 case STATE_CHANGE_REGS:
288 registers_changed ();
289 togdb_force_update ();
292 case STATE_CHANGE_CONT:
293 if (!catch_errors ((catch_errors_ftype *) ice_cont, NULL, "", RETURN_MASK_ALL))
294 printf_unfiltered ("continue errored\n");
297 case STATE_CHANGE_STEPI:
298 if (!catch_errors ((catch_errors_ftype *) ice_stepi, (PTR) (int) lParam, "",
300 printf_unfiltered ("stepi errored\n");
303 case STATE_CHANGE_NEXTI:
304 if (!catch_errors ((catch_errors_ftype *) ice_nexti, (PTR) (int) lParam, "",
306 printf_unfiltered ("nexti errored\n");
313 return DefWindowProc (hwnd, message, wParam, lParam);
318 /* Code for opening a connection to the ICE. */
321 v850ice_open (char *name, int from_tty)
326 error ("Too many arguments.");
328 target_preopen (from_tty);
330 unpush_target (&v850ice_ops);
333 puts_filtered ("V850ice debugging\n");
335 push_target (&v850ice_ops); /* Switch to using v850ice target now */
337 target_terminal_init ();
339 /* Initialize everything necessary to facilitate communication
340 between QBox, gdb, and the DLLs which control the ICE */
341 if (ExeAppReq == NULL)
343 handle = LoadLibrary ("necmsg.dll");
345 error ("Cannot load necmsg.dll");
347 ExeAppReq = (long (*) (char *, long, char *, struct MessageIO *))
348 GetProcAddress (handle, "ExeAppReq");
349 RegisterClient = (long (*) (HWND))
350 GetProcAddress (handle, "RegisterClient");
351 UnregisterClient = (long (*) (void))
352 GetProcAddress (handle, "UnregisterClient");
354 if (ExeAppReq == NULL || RegisterClient == NULL || UnregisterClient == NULL)
355 error ("Could not find requisite functions in necmsg.dll.");
357 if (!init_hidden_window ())
358 error ("could not initialize message handling");
361 /* Tell the DLL we are here */
362 RegisterClient (hidden_hwnd);
366 /* Without this, some commands which require an active target (such as kill)
367 won't work. This variable serves (at least) double duty as both the pid
368 of the target process (if it has such), and as a flag indicating that a
369 target is active. These functions should be split out into seperate
370 variables, especially since GDB will someday have a notion of debugging
371 several processes. */
372 inferior_ptid = pid_to_ptid (42000);
378 /* Clean up connection to a remote debugger. */
382 v850ice_close (int quitting)
388 inferior_ptid = null_ptid;
392 /* Stop the process on the ice. */
396 /* This is silly, but it works... */
397 v850ice_command ("stop", 0);
401 v850ice_detach (char *args, int from_tty)
404 error ("Argument given to \"detach\" when remotely debugging.");
408 puts_filtered ("Ending v850ice debugging.\n");
411 /* Tell the remote machine to resume. */
414 v850ice_resume (ptid_t ptid, int step, enum target_signal siggnal)
418 struct MessageIO iob;
424 retval = ExeAppReq ("GDB", GSINGLESTEP, "step", &iob);
426 retval = ExeAppReq ("GDB", GRESUME, "run", &iob);
429 error ("ExeAppReq (step = %d) returned %d", step, retval);
432 /* Wait until the remote machine stops, then return,
433 storing status in STATUS just as `wait' would.
434 Returns "pid" (though it's not clear what, if anything, that
435 means in the case of this target). */
438 v850ice_wait (ptid_t ptid, struct target_waitstatus *status)
442 struct MessageIO iob;
451 if (count++ % 100000)
457 v850_status = ExeAppReq ("GDB", GCHECKSTATUS, NULL, &iob);
465 status->kind = TARGET_WAITKIND_STOPPED;
466 status->value.sig = TARGET_SIGNAL_TRAP;
470 status->kind = TARGET_WAITKIND_SIGNALLED;
471 status->value.sig = TARGET_SIGNAL_SEGV;
475 status->kind = TARGET_WAITKIND_EXITED;
476 status->value.integer = 0;
480 status->kind = TARGET_WAITKIND_SIGNALLED;
481 status->value.sig = TARGET_SIGNAL_KILL;
490 return inferior_ptid;
494 convert_register (int regno, char *buf)
497 sprintf (buf, "r%d", regno);
498 else if (REGISTER_NAME (regno)[0] == 's'
499 && REGISTER_NAME (regno)[1] == 'r')
502 sprintf (buf, "%s", REGISTER_NAME (regno));
507 /* Read the remote registers into the block REGS. */
508 /* Note that the ICE returns register contents as ascii hex strings. We have
509 to convert that to an unsigned long, and then call store_unsigned_integer to
510 convert it to target byte-order if necessary. */
513 v850ice_fetch_registers (int regno)
518 struct MessageIO iob;
519 unsigned long regval;
524 for (regno = 0; regno < NUM_REGS; regno++)
525 v850ice_fetch_registers (regno);
529 strcpy (cmd, "reg ");
530 if (!convert_register (regno, &cmd[4]))
533 iob.size = sizeof val;
535 retval = ExeAppReq ("GDB", GREADREG, cmd, &iob);
537 error ("1: ExeAppReq returned %d: cmd = %s", retval, cmd);
539 regval = strtoul (val, NULL, 16);
540 if (regval == 0 && p == val)
541 error ("v850ice_fetch_registers (%d): bad value from ICE: %s.",
544 store_unsigned_integer (val, REGISTER_RAW_SIZE (regno), regval);
545 supply_register (regno, val);
548 /* Store register REGNO, or all registers if REGNO == -1, from the contents
552 v850ice_store_registers (int regno)
556 unsigned long regval;
558 struct MessageIO iob;
564 for (regno = 0; regno < NUM_REGS; regno++)
565 v850ice_store_registers (regno);
569 regval = extract_unsigned_integer (®isters[REGISTER_BYTE (regno)],
570 REGISTER_RAW_SIZE (regno));
571 strcpy (cmd, "reg ");
572 if (!convert_register (regno, &cmd[4]))
574 sprintf (cmd + strlen (cmd), "=0x%x", regval);
576 retval = ExeAppReq ("GDB", GWRITEREG, cmd, &iob);
578 error ("2: ExeAppReq returned %d: cmd = %s", retval, cmd);
581 /* Prepare to store registers. Nothing to do here, since the ICE can write one
582 register at a time. */
585 v850ice_prepare_to_store (void)
589 /* Read or write LEN bytes from inferior memory at MEMADDR, transferring
590 to or from debugger address MYADDR. Write to inferior if SHOULD_WRITE is
591 nonzero. TARGET is unused. Returns length of data written or read;
594 We can only read/write MAX_BLOCK_SIZE bytes at a time, though, or the DLL
598 v850ice_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
599 int should_write, struct target_ops *target)
603 struct MessageIO iob;
608 if (len == 4 || len == 2 || len == 1)
622 value |= (long) ((myaddr[3] << 24) & 0xff000000);
623 value |= (long) ((myaddr[2] << 16) & 0x00ff0000);
624 value |= (long) ((myaddr[1] << 8) & 0x0000ff00);
625 value |= (long) (myaddr[0] & 0x000000ff);
629 value |= (long) ((myaddr[1] << 8) & 0xff00);
630 value |= (long) (myaddr[0] & 0x00ff);
634 value |= (long) (myaddr[0] & 0xff);
638 sprintf (cmd, "memory %c c 0x%x=0x%x", c, (int) memaddr, value);
639 retval = ExeAppReq ("GDB", GWRITEMEM, cmd, &iob);
648 iob.size = len > MAX_BLOCK_SIZE ? MAX_BLOCK_SIZE : len;
650 sprintf (cmd, "memory b c 0x%x=0x00 l=%d", (int) memaddr, iob.size);
651 retval = ExeAppReq ("GDB", GWRITEBLOCK, cmd, &iob);
668 tmp = alloca (len + 100);
670 memset (tmp + len, 0xff, 100);
675 iob.size = len > MAX_BLOCK_SIZE ? MAX_BLOCK_SIZE : len;
677 sprintf (cmd, "memory b 0x%x l=%d", (int) memaddr, iob.size);
678 retval = ExeAppReq ("GDB", GREADBLOCK, cmd, &iob);
690 for (i = 0; i < 100; i++)
692 if (t[sent + i] != 0xff)
694 warning ("GREADBLOCK trashed bytes after transfer area.");
698 memcpy (myaddr, t, sent);
703 error ("3: ExeAppReq returned %d: cmd = %s", retval, cmd);
709 v850ice_files_info (struct target_ops *ignore)
711 puts_filtered ("Debugging a target via the NEC V850 ICE.\n");
715 v850ice_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
720 struct MessageIO iob;
724 sprintf (cmd, "%d, ", addr);
726 retval = ExeAppReq ("GDB", GSETBREAK, cmd, &iob);
728 error ("ExeAppReq (GSETBREAK) returned %d: cmd = %s", retval, cmd);
734 v850ice_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
739 struct MessageIO iob;
744 sprintf (cmd, "%d, ", addr);
746 retval = ExeAppReq ("GDB", GREMOVEBREAK, cmd, &iob);
748 error ("ExeAppReq (GREMOVEBREAK) returned %d: cmd = %s", retval, cmd);
756 target_mourn_inferior ();
757 inferior_ptid = null_ptid;
766 v850ice_load (char *filename, int from_tty)
768 struct MessageIO iob;
773 generic_load (filename, from_tty);
774 ExeAppReq ("GDB", GDOWNLOAD, filename, &iob);
782 target_detach (NULL, 0);
785 printf_unfiltered ("\n");
795 /* Safegaurd against confusing the breakpoint routines... */
796 delete_command (NULL, 0);
798 /* Must supress from_tty, otherwise we could start asking if the
799 user really wants to load a new symbol table, etc... */
800 printf_unfiltered ("Reading symbols from %s...", arg);
802 symbol_file_add_main (arg, 0);
803 printf_unfiltered ("done\n");
805 /* exec_open will kill our target, so reinstall the ICE as
807 v850ice_open (NULL, 0);
809 togdb_force_update ();
816 printf_filtered ("continue (ice)\n");
817 ReplyMessage ((LRESULT) 1);
819 if (gdbtk_interp == NULL)
821 continue_command (NULL, 1);
824 Tcl_Eval (gdbtk_interp, "gdb_immediate continue");
830 do_gdb (char *cmd, char *str, void (*func) (char *, int), int count)
832 ReplyMessage ((LRESULT) 1);
836 printf_unfiltered (str);
838 if (gdbtk_interp == NULL)
843 Tcl_Eval (gdbtk_interp, cmd);
853 do_gdb ("gdb_immediate stepi", "stepi (ice)\n", stepi_command, count);
862 do_gdb ("gdb_immediate nexti", "nexti (ice)\n", nexti_command, count);
867 v850ice_command (char *arg, int from_tty)
869 struct MessageIO iob;
874 ExeAppReq ("GDB", GCOMMAND, arg, &iob);
878 togdb_force_update (void)
880 if (gdbtk_interp != NULL)
881 Tcl_Eval (gdbtk_interp, "gdbtk_update");
885 view_source (CORE_ADDR addr)
889 if (gdbtk_interp != NULL)
891 sprintf (c, "catch {set src [lindex [ManagedWin::find SrcWin] 0]\n$src location BROWSE [gdb_loc *0x%x]}", addr);
892 Tcl_Eval (gdbtk_interp, c);
896 /* Define the target subroutine names */
899 init_850ice_ops (void)
901 v850ice_ops.to_shortname = "ice";
902 v850ice_ops.to_longname = "NEC V850 ICE interface";
903 v850ice_ops.to_doc = "Debug a system controlled by a NEC 850 ICE.";
904 v850ice_ops.to_open = v850ice_open;
905 v850ice_ops.to_close = v850ice_close;
906 v850ice_ops.to_attach = NULL;
907 v850ice_ops.to_post_attach = NULL;
908 v850ice_ops.to_require_attach = NULL;
909 v850ice_ops.to_detach = v850ice_detach;
910 v850ice_ops.to_require_detach = NULL;
911 v850ice_ops.to_resume = v850ice_resume;
912 v850ice_ops.to_wait = v850ice_wait;
913 v850ice_ops.to_post_wait = NULL;
914 v850ice_ops.to_fetch_registers = v850ice_fetch_registers;
915 v850ice_ops.to_store_registers = v850ice_store_registers;
916 v850ice_ops.to_prepare_to_store = v850ice_prepare_to_store;
917 v850ice_ops.to_xfer_memory = v850ice_xfer_memory;
918 v850ice_ops.to_files_info = v850ice_files_info;
919 v850ice_ops.to_insert_breakpoint = v850ice_insert_breakpoint;
920 v850ice_ops.to_remove_breakpoint = v850ice_remove_breakpoint;
921 v850ice_ops.to_terminal_init = NULL;
922 v850ice_ops.to_terminal_inferior = NULL;
923 v850ice_ops.to_terminal_ours_for_output = NULL;
924 v850ice_ops.to_terminal_ours = NULL;
925 v850ice_ops.to_terminal_info = NULL;
926 v850ice_ops.to_kill = v850ice_kill;
927 v850ice_ops.to_load = v850ice_load;
928 v850ice_ops.to_lookup_symbol = NULL;
929 v850ice_ops.to_create_inferior = NULL;
930 v850ice_ops.to_mourn_inferior = v850ice_mourn;
931 v850ice_ops.to_can_run = 0;
932 v850ice_ops.to_notice_signals = 0;
933 v850ice_ops.to_thread_alive = NULL;
934 v850ice_ops.to_stop = v850ice_stop;
935 v850ice_ops.to_pid_to_exec_file = NULL;
936 v850ice_ops.to_stratum = process_stratum;
937 v850ice_ops.DONT_USE = NULL;
938 v850ice_ops.to_has_all_memory = 1;
939 v850ice_ops.to_has_memory = 1;
940 v850ice_ops.to_has_stack = 1;
941 v850ice_ops.to_has_registers = 1;
942 v850ice_ops.to_has_execution = 1;
943 v850ice_ops.to_sections = NULL;
944 v850ice_ops.to_sections_end = NULL;
945 v850ice_ops.to_magic = OPS_MAGIC;
949 _initialize_v850ice (void)
952 add_target (&v850ice_ops);
954 add_com ("ice", class_obscure, v850ice_command,
955 "Send command to ICE");