1 /* ICE interface for the NEC V850 for GDB, the GNU debugger.
2 Copyright 1996, Free Software Foundation, Inc.
4 This file is part of GDB.
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.
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.
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. */
22 #include "gdb_string.h"
26 #include "breakpoint.h"
35 #include <winuser.h> /* for WM_USER */
37 extern unsigned long int strtoul (const char *nptr, char **endptr,
40 /* Local data definitions */
43 int size; /* length of input or output in bytes */
44 char *buf; /* buffer having the input/output information */
47 /* Prototypes for functions located in other files */
48 extern void break_command PARAMS ((char *, int));
50 extern void stepi_command PARAMS ((char *, int));
52 extern void nexti_command PARAMS ((char *, int));
54 extern void continue_command PARAMS ((char *, int));
56 extern int (*ui_loop_hook) PARAMS ((int));
58 /* Prototypes for local functions */
59 static int init_hidden_window PARAMS ((void));
61 static LRESULT CALLBACK v850ice_wndproc PARAMS ((HWND, UINT, WPARAM, LPARAM));
63 static void v850ice_files_info PARAMS ((struct target_ops * ignore));
65 static int v850ice_xfer_memory PARAMS ((CORE_ADDR memaddr, char *myaddr,
66 int len, int should_write,
67 struct target_ops * target));
69 static void v850ice_prepare_to_store PARAMS ((void));
71 static void v850ice_fetch_registers PARAMS ((int regno));
73 static void v850ice_resume PARAMS ((int pid, int step,
74 enum target_signal siggnal));
76 static void v850ice_open PARAMS ((char *name, int from_tty));
78 static void v850ice_close PARAMS ((int quitting));
80 static void v850ice_stop PARAMS ((void));
82 static void v850ice_store_registers PARAMS ((int regno));
84 static void v850ice_mourn PARAMS ((void));
86 static int v850ice_wait PARAMS ((int pid, struct target_waitstatus * status));
88 static void v850ice_kill PARAMS ((void));
90 static void v850ice_detach PARAMS ((char *args, int from_tty));
92 static int v850ice_insert_breakpoint PARAMS ((CORE_ADDR, char *));
94 static int v850ice_remove_breakpoint PARAMS ((CORE_ADDR, char *));
96 static void v850ice_command PARAMS ((char *, int));
98 static int ice_disassemble PARAMS ((unsigned long, int, char *));
100 static int ice_lookup_addr PARAMS ((unsigned long *, char *, char *));
102 static int ice_lookup_symbol PARAMS ((unsigned long, char *));
104 static void ice_SimulateDisassemble PARAMS ((char *, int));
106 static void ice_SimulateAddrLookup PARAMS ((char *, int));
108 static void ice_Simulate_SymLookup PARAMS ((char *, int));
110 static void ice_fputs PARAMS ((const char *, GDB_FILE *));
112 static int ice_file PARAMS ((char *));
114 static int ice_cont PARAMS ((char *));
116 static int ice_stepi PARAMS ((char *));
118 static int ice_nexti PARAMS ((char *));
120 static void togdb_force_update PARAMS ((void));
122 static void do_gdb (char *, char *, void (*func) PARAMS ((char *, int)), int);
126 static HWND hidden_hwnd; /* HWND for messages */
128 long (__stdcall * ExeAppReq) PARAMS ((char *, long, char *, struct MessageIO *));
130 long (__stdcall * RegisterClient) PARAMS ((HWND));
132 long (__stdcall * UnregisterClient) PARAMS ((void));
135 /* Globals local to this file only */
136 static int ice_open = 0; /* Is ICE open? */
138 static char *v850_CB_Result; /* special char array for saving 'callback' results */
140 static int SimulateCallback; /* simulate a callback event */
142 #define MAX_BLOCK_SIZE 64*1024 /* Cannot transfer memory in blocks bigger
144 /* MDI/ICE Message IDs */
145 #define GSINGLESTEP 0x200 /* single-step target */
146 #define GRESUME 0x201 /* resume target */
147 #define GREADREG 0x202 /* read a register */
148 #define GWRITEREG 0x203 /* write a register */
149 #define GWRITEBLOCK 0x204 /* write a block of memory */
150 #define GREADBLOCK 0x205 /* read a block of memory */
151 #define GSETBREAK 0x206 /* set a breakpoint */
152 #define GREMOVEBREAK 0x207 /* remove a breakpoint */
153 #define GHALT 0x208 /* ??? */
154 #define GCHECKSTATUS 0x209 /* check status of ICE */
155 #define GMDIREPLY 0x210 /* Reply for previous query - NOT USED */
156 #define GDOWNLOAD 0x211 /* something for MDI */
157 #define GCOMMAND 0x212 /* execute command in ice */
158 #define GLOADFILENAME 0x213 /* retrieve load filename */
159 #define GWRITEMEM 0x214 /* write word, half-word, or byte */
161 /* GCHECKSTATUS return codes: */
162 #define ICE_Idle 0x00
163 #define ICE_Breakpoint 0x01 /* hit a breakpoint */
164 #define ICE_Stepped 0x02 /* have stepped */
165 #define ICE_Exception 0x03 /* have exception */
166 #define ICE_Halted 0x04 /* hit a user halt */
167 #define ICE_Exited 0x05 /* called exit */
168 #define ICE_Terminated 0x06 /* user terminated */
169 #define ICE_Running 0x07
170 #define ICE_Unknown 0x99
172 /* Windows messages */
173 #define WM_STATE_CHANGE WM_USER+101
174 #define WM_SYM_TO_ADDR WM_USER+102
175 #define WM_ADDR_TO_SYM WM_USER+103
176 #define WM_DISASSEMBLY WM_USER+104
177 #define WM_SOURCE WM_USER+105
179 /* STATE_CHANGE codes */
180 #define STATE_CHANGE_REGS 1 /* Register(s) changed */
181 #define STATE_CHANGE_LOAD 2 /* HW reset */
182 #define STATE_CHANGE_RESET 3 /* Load new file */
183 #define STATE_CHANGE_CONT 4 /* Run target */
184 #define STATE_CHANGE_STOP 5 /* Stop target */
185 #define STATE_CHANGE_STEPI 6 /* Stepi target */
186 #define STATE_CHANGE_NEXTI 7 /* Nexti target */
188 static struct target_ops v850ice_ops; /* Forward decl */
190 /* This function creates a hidden window */
192 init_hidden_window ()
196 if (hidden_hwnd != NULL)
200 class.cbClsExtra = 0;
201 class.cbWndExtra = 0;
202 class.hInstance = GetModuleHandle (0);
203 class.hbrBackground = NULL;
204 class.lpszMenuName = NULL;
205 class.lpszClassName = "gdb_v850ice";
206 class.lpfnWndProc = v850ice_wndproc;
208 class.hCursor = NULL;
210 if (!RegisterClass (&class))
213 hidden_hwnd = CreateWindow ("gdb_v850ice", "gdb_v850ice", WS_TILED,
214 0, 0, 0, 0, NULL, NULL, class.hInstance,
216 if (hidden_hwnd == NULL)
221 err = GetLastError ();
222 FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
224 printf_unfiltered ("Could not create window: %s", buf);
232 This function is installed as the message handler for the hidden window
233 which QBox will use to communicate with gdb. It recognize and acts
234 on the following messages:
237 WM_ADDR_TO_SYM | Not implemented at NEC's request
239 WM_STATE_CHANGE - tells us that a state change has occured in the ICE
241 static LRESULT CALLBACK
242 v850ice_wndproc (hwnd, message, wParam, lParam)
248 LRESULT result = FALSE;
253 MessageBox (0, "Symbol resolution\nNot implemented", "GDB", MB_OK);
256 MessageBox (0, "Address resolution\nNot implemented", "GDB", MB_OK);
260 case WM_STATE_CHANGE:
263 case STATE_CHANGE_LOAD:
265 struct MessageIO iob;
271 /* Load in a new file... Need filename */
272 ExeAppReq ("GDB", GLOADFILENAME, NULL, &iob);
273 if (!catch_errors ((catch_errors_ftype *) ice_file, iob.buf, "", RETURN_MASK_ALL))
274 printf_unfiltered ("load errored\n");
277 case STATE_CHANGE_RESET:
278 registers_changed ();
279 flush_cached_frames ();
280 togdb_force_update ();
283 case STATE_CHANGE_REGS:
284 registers_changed ();
285 togdb_force_update ();
288 case STATE_CHANGE_CONT:
289 if (!catch_errors ((catch_errors_ftype *) ice_cont, NULL, "", RETURN_MASK_ALL))
290 printf_unfiltered ("continue errored\n");
293 case STATE_CHANGE_STEPI:
294 if (!catch_errors ((catch_errors_ftype *) ice_stepi, (PTR) (int) lParam, "",
296 printf_unfiltered ("stepi errored\n");
299 case STATE_CHANGE_NEXTI:
300 if (!catch_errors ((catch_errors_ftype *) ice_nexti, (PTR) (int) lParam, "",
302 printf_unfiltered ("nexti errored\n");
309 return DefWindowProc (hwnd, message, wParam, lParam);
314 /* Code for opening a connection to the ICE. */
317 v850ice_open (name, from_tty)
324 error ("Too many arguments.");
326 target_preopen (from_tty);
328 unpush_target (&v850ice_ops);
331 puts_filtered ("V850ice debugging\n");
333 push_target (&v850ice_ops); /* Switch to using v850ice target now */
335 target_terminal_init ();
337 /* Initialize everything necessary to facilitate communication
338 between QBox, gdb, and the DLLs which control the ICE */
339 if (ExeAppReq == NULL)
341 handle = LoadLibrary ("necmsg.dll");
343 error ("Cannot load necmsg.dll");
345 ExeAppReq = (long (*)PARAMS ((char *, long, char *, struct MessageIO *)))
346 GetProcAddress (handle, "ExeAppReq");
347 RegisterClient = (long (*)PARAMS ((HWND)))
348 GetProcAddress (handle, "RegisterClient");
349 UnregisterClient = (long (*)PARAMS ((void)))
350 GetProcAddress (handle, "UnregisterClient");
352 if (ExeAppReq == NULL || RegisterClient == NULL || UnregisterClient == NULL)
353 error ("Could not find requisite functions in necmsg.dll.");
355 if (!init_hidden_window ())
356 error ("could not initialize message handling");
359 /* Tell the DLL we are here */
360 RegisterClient (hidden_hwnd);
364 /* Without this, some commands which require an active target (such as kill)
365 won't work. This variable serves (at least) double duty as both the pid
366 of the target process (if it has such), and as a flag indicating that a
367 target is active. These functions should be split out into seperate
368 variables, especially since GDB will someday have a notion of debugging
369 several processes. */
370 inferior_pid = 42000;
376 /* Clean up connection to a remote debugger. */
380 v850ice_close (quitting)
391 /* Stop the process on the ice. */
395 /* This is silly, but it works... */
396 v850ice_command ("stop", 0);
400 v850ice_detach (args, from_tty)
405 error ("Argument given to \"detach\" when remotely debugging.");
409 puts_filtered ("Ending v850ice debugging.\n");
412 /* Tell the remote machine to resume. */
415 v850ice_resume (pid, step, siggnal)
417 enum target_signal siggnal;
421 struct MessageIO iob;
427 retval = ExeAppReq ("GDB", GSINGLESTEP, "step", &iob);
429 retval = ExeAppReq ("GDB", GRESUME, "run", &iob);
432 error ("ExeAppReq (step = %d) returned %d", step, retval);
435 /* Wait until the remote machine stops, then return,
436 storing status in STATUS just as `wait' would.
437 Returns "pid" (though it's not clear what, if anything, that
438 means in the case of this target). */
441 v850ice_wait (pid, status)
443 struct target_waitstatus *status;
447 struct MessageIO iob;
456 if (count++ % 100000)
462 v850_status = ExeAppReq ("GDB", GCHECKSTATUS, NULL, &iob);
470 status->kind = TARGET_WAITKIND_STOPPED;
471 status->value.sig = TARGET_SIGNAL_TRAP;
475 status->kind = TARGET_WAITKIND_SIGNALLED;
476 status->value.sig = TARGET_SIGNAL_SEGV;
480 status->kind = TARGET_WAITKIND_EXITED;
481 status->value.integer = 0;
485 status->kind = TARGET_WAITKIND_SIGNALLED;
486 status->value.sig = TARGET_SIGNAL_KILL;
499 convert_register (regno, buf)
504 sprintf (buf, "r%d", regno);
505 else if (REGISTER_NAME (regno)[0] == 's'
506 && REGISTER_NAME (regno)[1] == 'r')
509 sprintf (buf, "%s", REGISTER_NAME (regno));
514 /* Read the remote registers into the block REGS. */
515 /* Note that the ICE returns register contents as ascii hex strings. We have
516 to convert that to an unsigned long, and then call store_unsigned_integer to
517 convert it to target byte-order if necessary. */
520 v850ice_fetch_registers (regno)
526 struct MessageIO iob;
527 unsigned long regval;
532 for (regno = 0; regno < NUM_REGS; regno++)
533 v850ice_fetch_registers (regno);
537 strcpy (cmd, "reg ");
538 if (!convert_register (regno, &cmd[4]))
541 iob.size = sizeof val;
543 retval = ExeAppReq ("GDB", GREADREG, cmd, &iob);
545 error ("1: ExeAppReq returned %d: cmd = %s", retval, cmd);
547 regval = strtoul (val, NULL, 16);
548 if (regval == 0 && p == val)
549 error ("v850ice_fetch_registers (%d): bad value from ICE: %s.",
552 store_unsigned_integer (val, REGISTER_RAW_SIZE (regno), regval);
553 supply_register (regno, val);
556 /* Store register REGNO, or all registers if REGNO == -1, from the contents
560 v850ice_store_registers (regno)
565 unsigned long regval;
567 struct MessageIO iob;
573 for (regno = 0; regno < NUM_REGS; regno++)
574 v850ice_store_registers (regno);
578 regval = extract_unsigned_integer (®isters[REGISTER_BYTE (regno)],
579 REGISTER_RAW_SIZE (regno));
580 strcpy (cmd, "reg ");
581 if (!convert_register (regno, &cmd[4]))
583 sprintf (cmd + strlen (cmd), "=0x%x", regval);
585 retval = ExeAppReq ("GDB", GWRITEREG, cmd, &iob);
587 error ("2: ExeAppReq returned %d: cmd = %s", retval, cmd);
590 /* Prepare to store registers. Nothing to do here, since the ICE can write one
591 register at a time. */
594 v850ice_prepare_to_store ()
598 /* Read or write LEN bytes from inferior memory at MEMADDR, transferring
599 to or from debugger address MYADDR. Write to inferior if SHOULD_WRITE is
600 nonzero. Returns length of data written or read; 0 for error.
602 We can only read/write MAX_BLOCK_SIZE bytes at a time, though, or the DLL
606 v850ice_xfer_memory (memaddr, myaddr, len, should_write, target)
611 struct target_ops *target; /* ignored */
615 struct MessageIO iob;
620 if (len == 4 || len == 2 || len == 1)
634 value |= (long) ((myaddr[3] << 24) & 0xff000000);
635 value |= (long) ((myaddr[2] << 16) & 0x00ff0000);
636 value |= (long) ((myaddr[1] << 8) & 0x0000ff00);
637 value |= (long) (myaddr[0] & 0x000000ff);
641 value |= (long) ((myaddr[1] << 8) & 0xff00);
642 value |= (long) (myaddr[0] & 0x00ff);
646 value |= (long) (myaddr[0] & 0xff);
650 sprintf (cmd, "memory %c c 0x%x=0x%x", c, (int) memaddr, value);
651 retval = ExeAppReq ("GDB", GWRITEMEM, cmd, &iob);
660 iob.size = len > MAX_BLOCK_SIZE ? MAX_BLOCK_SIZE : len;
662 sprintf (cmd, "memory b c 0x%x=0x00 l=%d", (int) memaddr, iob.size);
663 retval = ExeAppReq ("GDB", GWRITEBLOCK, cmd, &iob);
680 tmp = alloca (len + 100);
682 memset (tmp + len, 0xff, 100);
687 iob.size = len > MAX_BLOCK_SIZE ? MAX_BLOCK_SIZE : len;
689 sprintf (cmd, "memory b 0x%x l=%d", (int) memaddr, iob.size);
690 retval = ExeAppReq ("GDB", GREADBLOCK, cmd, &iob);
702 for (i = 0; i < 100; i++)
704 if (t[sent + i] != 0xff)
706 warning ("GREADBLOCK trashed bytes after transfer area.");
710 memcpy (myaddr, t, sent);
715 error ("3: ExeAppReq returned %d: cmd = %s", retval, cmd);
721 v850ice_files_info (ignore)
722 struct target_ops *ignore;
724 puts_filtered ("Debugging a target via the NEC V850 ICE.\n");
728 v850ice_insert_breakpoint (addr, contents_cache)
730 char *contents_cache;
735 struct MessageIO iob;
739 sprintf (cmd, "%d, ", addr);
741 retval = ExeAppReq ("GDB", GSETBREAK, cmd, &iob);
743 error ("ExeAppReq (GSETBREAK) returned %d: cmd = %s", retval, cmd);
749 v850ice_remove_breakpoint (addr, contents_cache)
751 char *contents_cache;
756 struct MessageIO iob;
761 sprintf (cmd, "%d, ", addr);
763 retval = ExeAppReq ("GDB", GREMOVEBREAK, cmd, &iob);
765 error ("ExeAppReq (GREMOVEBREAK) returned %d: cmd = %s", retval, cmd);
773 target_mourn_inferior ();
783 v850ice_load (filename, from_tty)
787 struct MessageIO iob;
792 generic_load (filename, from_tty);
793 ExeAppReq ("GDB", GDOWNLOAD, filename, &iob);
802 target_detach (NULL, 0);
805 printf_unfiltered ("\n");
815 /* Safegaurd against confusing the breakpoint routines... */
816 delete_command (NULL, 0);
818 /* Must supress from_tty, otherwise we could start asking if the
819 user really wants to load a new symbol table, etc... */
820 printf_unfiltered ("Reading symbols from %s...", arg);
821 exec_file_command (arg, 0);
822 symbol_file_command (arg, 0);
823 printf_unfiltered ("done\n");
825 /* exec_file_command will kill our target, so reinstall the ICE as
827 v850ice_open (NULL, 0);
829 togdb_force_update ();
837 printf_filtered ("continue (ice)\n");
838 ReplyMessage ((LRESULT) 1);
840 continue_command (NULL, 1);
846 do_gdb (cmd, str, func, count)
849 void (*func) PARAMS ((char *, int));
852 ReplyMessage ((LRESULT) 1);
856 printf_unfiltered (str);
869 do_gdb ("gdb_immediate stepi", "stepi (ice)\n", stepi_command, count);
879 do_gdb ("gdb_immediate nexti", "nexti (ice)\n", nexti_command, count);
884 v850ice_command (arg, from_tty)
888 struct MessageIO iob;
893 ExeAppReq ("GDB", GCOMMAND, arg, &iob);
897 togdb_force_update (void)
902 /* Define the target subroutine names */
905 init_850ice_ops (void)
907 v850ice_ops.to_shortname = "ice";
908 v850ice_ops.to_longname = "NEC V850 ICE interface";
909 v850ice_ops.to_doc = "Debug a system controlled by a NEC 850 ICE.";
910 v850ice_ops.to_open = v850ice_open;
911 v850ice_ops.to_close = v850ice_close;
912 v850ice_ops.to_attach = NULL;
913 v850ice_ops.to_post_attach = NULL;
914 v850ice_ops.to_require_attach = NULL;
915 v850ice_ops.to_detach = v850ice_detach;
916 v850ice_ops.to_require_detach = NULL;
917 v850ice_ops.to_resume = v850ice_resume;
918 v850ice_ops.to_wait = v850ice_wait;
919 v850ice_ops.to_post_wait = NULL;
920 v850ice_ops.to_fetch_registers = v850ice_fetch_registers;
921 v850ice_ops.to_store_registers = v850ice_store_registers;
922 v850ice_ops.to_prepare_to_store = v850ice_prepare_to_store;
923 v850ice_ops.to_xfer_memory = v850ice_xfer_memory;
924 v850ice_ops.to_files_info = v850ice_files_info;
925 v850ice_ops.to_insert_breakpoint = v850ice_insert_breakpoint;
926 v850ice_ops.to_remove_breakpoint = v850ice_remove_breakpoint;
927 v850ice_ops.to_terminal_init = NULL;
928 v850ice_ops.to_terminal_inferior = NULL;
929 v850ice_ops.to_terminal_ours_for_output = NULL;
930 v850ice_ops.to_terminal_ours = NULL;
931 v850ice_ops.to_terminal_info = NULL;
932 v850ice_ops.to_kill = v850ice_kill;
933 v850ice_ops.to_load = v850ice_load;
934 v850ice_ops.to_lookup_symbol = NULL;
935 v850ice_ops.to_create_inferior = NULL;
936 v850ice_ops.to_mourn_inferior = v850ice_mourn;
937 v850ice_ops.to_can_run = 0;
938 v850ice_ops.to_notice_signals = 0;
939 v850ice_ops.to_thread_alive = NULL;
940 v850ice_ops.to_stop = v850ice_stop;
941 v850ice_ops.to_pid_to_exec_file = NULL;
942 v850ice_ops.to_core_file_to_sym_file = NULL;
943 v850ice_ops.to_stratum = process_stratum;
944 v850ice_ops.DONT_USE = NULL;
945 v850ice_ops.to_has_all_memory = 1;
946 v850ice_ops.to_has_memory = 1;
947 v850ice_ops.to_has_stack = 1;
948 v850ice_ops.to_has_registers = 1;
949 v850ice_ops.to_has_execution = 1;
950 v850ice_ops.to_sections = NULL;
951 v850ice_ops.to_sections_end = NULL;
952 v850ice_ops.to_magic = OPS_MAGIC;
956 _initialize_v850ice ()
959 add_target (&v850ice_ops);
961 add_com ("ice", class_obscure, v850ice_command,
962 "Send command to ICE");