1 /* ICE interface for the NEC V850 for GDB, the GNU debugger.
2 Copyright 1996, 2000, 2001 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"
37 #include <winuser.h> /* for WM_USER */
39 extern unsigned long int strtoul (const char *nptr
, char **endptr
,
42 /* Local data definitions */
45 int size
; /* length of input or output in bytes */
46 char *buf
; /* buffer having the input/output information */
49 /* Prototypes for functions located in other files */
50 extern void break_command (char *, int);
52 extern void stepi_command (char *, int);
54 extern void nexti_command (char *, int);
56 extern void continue_command (char *, int);
58 extern int (*ui_loop_hook
) (int);
60 /* Prototypes for local functions */
61 static int init_hidden_window (void);
63 static LRESULT CALLBACK
v850ice_wndproc (HWND
, UINT
, WPARAM
, LPARAM
);
65 static void v850ice_files_info (struct target_ops
*ignore
);
67 static int v850ice_xfer_memory (CORE_ADDR memaddr
, char *myaddr
,
68 int len
, int should_write
,
69 struct target_ops
*target
);
71 static void v850ice_prepare_to_store (void);
73 static void v850ice_fetch_registers (int regno
);
75 static void v850ice_resume (int pid
, int step
, enum target_signal siggnal
);
77 static void v850ice_open (char *name
, int from_tty
);
79 static void v850ice_close (int quitting
);
81 static void v850ice_stop (void);
83 static void v850ice_store_registers (int regno
);
85 static void v850ice_mourn (void);
87 static int v850ice_wait (int pid
, struct target_waitstatus
*status
);
89 static void v850ice_kill (void);
91 static void v850ice_detach (char *args
, int from_tty
);
93 static int v850ice_insert_breakpoint (CORE_ADDR
, char *);
95 static int v850ice_remove_breakpoint (CORE_ADDR
, char *);
97 static void v850ice_command (char *, int);
99 static int ice_disassemble (unsigned long, int, char *);
101 static int ice_lookup_addr (unsigned long *, char *, char *);
103 static int ice_lookup_symbol (unsigned long, char *);
105 static void ice_SimulateDisassemble (char *, int);
107 static void ice_SimulateAddrLookup (char *, int);
109 static void ice_Simulate_SymLookup (char *, int);
111 static void ice_fputs (const char *, struct ui_file
*);
113 static int ice_file (char *);
115 static int ice_cont (char *);
117 static int ice_stepi (char *);
119 static int ice_nexti (char *);
121 static void togdb_force_update (void);
123 static void view_source (CORE_ADDR
);
125 static void do_gdb (char *, char *, void (*func
) (char *, int), int);
129 static HWND hidden_hwnd
; /* HWND for messages */
131 long (__stdcall
* ExeAppReq
) (char *, long, char *, struct MessageIO
*);
133 long (__stdcall
* RegisterClient
) (HWND
);
135 long (__stdcall
* UnregisterClient
) (void);
137 extern Tcl_Interp
*gdbtk_interp
;
139 /* Globals local to this file only */
140 static int ice_open
= 0; /* Is ICE open? */
142 static char *v850_CB_Result
; /* special char array for saving 'callback' results */
144 static int SimulateCallback
; /* simulate a callback event */
146 #define MAX_BLOCK_SIZE 64*1024 /* Cannot transfer memory in blocks bigger
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 */
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
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
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 */
192 static struct target_ops v850ice_ops
; /* Forward decl */
194 /* This function creates a hidden window */
196 init_hidden_window (void)
200 if (hidden_hwnd
!= NULL
)
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
;
212 class.hCursor
= NULL
;
214 if (!RegisterClass (&class))
217 hidden_hwnd
= CreateWindow ("gdb_v850ice", "gdb_v850ice", WS_TILED
,
218 0, 0, 0, 0, NULL
, NULL
, class.hInstance
,
220 if (hidden_hwnd
== NULL
)
225 err
= GetLastError ();
226 FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
, NULL
, err
,
228 printf_unfiltered ("Could not create window: %s", buf
);
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:
241 WM_ADDR_TO_SYM | Not implemented at NEC's request
243 WM_STATE_CHANGE - tells us that a state change has occured in the ICE
245 static LRESULT CALLBACK
246 v850ice_wndproc (HWND hwnd
, UINT message
, WPARAM wParam
, LPARAM 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
);
259 view_source ((CORE_ADDR
) lParam
);
261 case WM_STATE_CHANGE
:
264 case STATE_CHANGE_LOAD
:
266 struct MessageIO iob
;
272 /* Load in a new file... Need filename */
273 ExeAppReq ("GDB", GLOADFILENAME
, NULL
, &iob
);
274 if (!catch_errors ((catch_errors_ftype
*) ice_file
, iob
.buf
, "", RETURN_MASK_ALL
))
275 printf_unfiltered ("load errored\n");
278 case STATE_CHANGE_RESET
:
279 registers_changed ();
280 flush_cached_frames ();
281 togdb_force_update ();
284 case STATE_CHANGE_REGS
:
285 registers_changed ();
286 togdb_force_update ();
289 case STATE_CHANGE_CONT
:
290 if (!catch_errors ((catch_errors_ftype
*) ice_cont
, NULL
, "", RETURN_MASK_ALL
))
291 printf_unfiltered ("continue errored\n");
294 case STATE_CHANGE_STEPI
:
295 if (!catch_errors ((catch_errors_ftype
*) ice_stepi
, (PTR
) (int) lParam
, "",
297 printf_unfiltered ("stepi errored\n");
300 case STATE_CHANGE_NEXTI
:
301 if (!catch_errors ((catch_errors_ftype
*) ice_nexti
, (PTR
) (int) lParam
, "",
303 printf_unfiltered ("nexti errored\n");
310 return DefWindowProc (hwnd
, message
, wParam
, lParam
);
315 /* Code for opening a connection to the ICE. */
318 v850ice_open (char *name
, int from_tty
)
323 error ("Too many arguments.");
325 target_preopen (from_tty
);
327 unpush_target (&v850ice_ops
);
330 puts_filtered ("V850ice debugging\n");
332 push_target (&v850ice_ops
); /* Switch to using v850ice target now */
334 target_terminal_init ();
336 /* Initialize everything necessary to facilitate communication
337 between QBox, gdb, and the DLLs which control the ICE */
338 if (ExeAppReq
== NULL
)
340 handle
= LoadLibrary ("necmsg.dll");
342 error ("Cannot load necmsg.dll");
344 ExeAppReq
= (long (*) (char *, long, char *, struct MessageIO
*))
345 GetProcAddress (handle
, "ExeAppReq");
346 RegisterClient
= (long (*) (HWND
))
347 GetProcAddress (handle
, "RegisterClient");
348 UnregisterClient
= (long (*) (void))
349 GetProcAddress (handle
, "UnregisterClient");
351 if (ExeAppReq
== NULL
|| RegisterClient
== NULL
|| UnregisterClient
== NULL
)
352 error ("Could not find requisite functions in necmsg.dll.");
354 if (!init_hidden_window ())
355 error ("could not initialize message handling");
358 /* Tell the DLL we are here */
359 RegisterClient (hidden_hwnd
);
363 /* Without this, some commands which require an active target (such as kill)
364 won't work. This variable serves (at least) double duty as both the pid
365 of the target process (if it has such), and as a flag indicating that a
366 target is active. These functions should be split out into seperate
367 variables, especially since GDB will someday have a notion of debugging
368 several processes. */
369 inferior_pid
= 42000;
375 /* Clean up connection to a remote debugger. */
379 v850ice_close (int quitting
)
389 /* Stop the process on the ice. */
393 /* This is silly, but it works... */
394 v850ice_command ("stop", 0);
398 v850ice_detach (char *args
, int from_tty
)
401 error ("Argument given to \"detach\" when remotely debugging.");
405 puts_filtered ("Ending v850ice debugging.\n");
408 /* Tell the remote machine to resume. */
411 v850ice_resume (int pid
, int step
, enum target_signal siggnal
)
415 struct MessageIO iob
;
421 retval
= ExeAppReq ("GDB", GSINGLESTEP
, "step", &iob
);
423 retval
= ExeAppReq ("GDB", GRESUME
, "run", &iob
);
426 error ("ExeAppReq (step = %d) returned %d", step
, retval
);
429 /* Wait until the remote machine stops, then return,
430 storing status in STATUS just as `wait' would.
431 Returns "pid" (though it's not clear what, if anything, that
432 means in the case of this target). */
435 v850ice_wait (int pid
, struct target_waitstatus
*status
)
439 struct MessageIO iob
;
448 if (count
++ % 100000)
454 v850_status
= ExeAppReq ("GDB", GCHECKSTATUS
, NULL
, &iob
);
462 status
->kind
= TARGET_WAITKIND_STOPPED
;
463 status
->value
.sig
= TARGET_SIGNAL_TRAP
;
467 status
->kind
= TARGET_WAITKIND_SIGNALLED
;
468 status
->value
.sig
= TARGET_SIGNAL_SEGV
;
472 status
->kind
= TARGET_WAITKIND_EXITED
;
473 status
->value
.integer
= 0;
477 status
->kind
= TARGET_WAITKIND_SIGNALLED
;
478 status
->value
.sig
= TARGET_SIGNAL_KILL
;
491 convert_register (int regno
, char *buf
)
494 sprintf (buf
, "r%d", regno
);
495 else if (REGISTER_NAME (regno
)[0] == 's'
496 && REGISTER_NAME (regno
)[1] == 'r')
499 sprintf (buf
, "%s", REGISTER_NAME (regno
));
504 /* Read the remote registers into the block REGS. */
505 /* Note that the ICE returns register contents as ascii hex strings. We have
506 to convert that to an unsigned long, and then call store_unsigned_integer to
507 convert it to target byte-order if necessary. */
510 v850ice_fetch_registers (int regno
)
515 struct MessageIO iob
;
516 unsigned long regval
;
521 for (regno
= 0; regno
< NUM_REGS
; regno
++)
522 v850ice_fetch_registers (regno
);
526 strcpy (cmd
, "reg ");
527 if (!convert_register (regno
, &cmd
[4]))
530 iob
.size
= sizeof val
;
532 retval
= ExeAppReq ("GDB", GREADREG
, cmd
, &iob
);
534 error ("1: ExeAppReq returned %d: cmd = %s", retval
, cmd
);
536 regval
= strtoul (val
, NULL
, 16);
537 if (regval
== 0 && p
== val
)
538 error ("v850ice_fetch_registers (%d): bad value from ICE: %s.",
541 store_unsigned_integer (val
, REGISTER_RAW_SIZE (regno
), regval
);
542 supply_register (regno
, val
);
545 /* Store register REGNO, or all registers if REGNO == -1, from the contents
549 v850ice_store_registers (int regno
)
553 unsigned long regval
;
555 struct MessageIO iob
;
561 for (regno
= 0; regno
< NUM_REGS
; regno
++)
562 v850ice_store_registers (regno
);
566 regval
= extract_unsigned_integer (®isters
[REGISTER_BYTE (regno
)],
567 REGISTER_RAW_SIZE (regno
));
568 strcpy (cmd
, "reg ");
569 if (!convert_register (regno
, &cmd
[4]))
571 sprintf (cmd
+ strlen (cmd
), "=0x%x", regval
);
573 retval
= ExeAppReq ("GDB", GWRITEREG
, cmd
, &iob
);
575 error ("2: ExeAppReq returned %d: cmd = %s", retval
, cmd
);
578 /* Prepare to store registers. Nothing to do here, since the ICE can write one
579 register at a time. */
582 v850ice_prepare_to_store (void)
586 /* Read or write LEN bytes from inferior memory at MEMADDR, transferring
587 to or from debugger address MYADDR. Write to inferior if SHOULD_WRITE is
588 nonzero. TARGET is unused. Returns length of data written or read;
591 We can only read/write MAX_BLOCK_SIZE bytes at a time, though, or the DLL
595 v850ice_xfer_memory (CORE_ADDR memaddr
, char *myaddr
, int len
,
596 int should_write
, struct target_ops
*target
)
600 struct MessageIO iob
;
605 if (len
== 4 || len
== 2 || len
== 1)
619 value
|= (long) ((myaddr
[3] << 24) & 0xff000000);
620 value
|= (long) ((myaddr
[2] << 16) & 0x00ff0000);
621 value
|= (long) ((myaddr
[1] << 8) & 0x0000ff00);
622 value
|= (long) (myaddr
[0] & 0x000000ff);
626 value
|= (long) ((myaddr
[1] << 8) & 0xff00);
627 value
|= (long) (myaddr
[0] & 0x00ff);
631 value
|= (long) (myaddr
[0] & 0xff);
635 sprintf (cmd
, "memory %c c 0x%x=0x%x", c
, (int) memaddr
, value
);
636 retval
= ExeAppReq ("GDB", GWRITEMEM
, cmd
, &iob
);
645 iob
.size
= len
> MAX_BLOCK_SIZE
? MAX_BLOCK_SIZE
: len
;
647 sprintf (cmd
, "memory b c 0x%x=0x00 l=%d", (int) memaddr
, iob
.size
);
648 retval
= ExeAppReq ("GDB", GWRITEBLOCK
, cmd
, &iob
);
665 tmp
= alloca (len
+ 100);
667 memset (tmp
+ len
, 0xff, 100);
672 iob
.size
= len
> MAX_BLOCK_SIZE
? MAX_BLOCK_SIZE
: len
;
674 sprintf (cmd
, "memory b 0x%x l=%d", (int) memaddr
, iob
.size
);
675 retval
= ExeAppReq ("GDB", GREADBLOCK
, cmd
, &iob
);
687 for (i
= 0; i
< 100; i
++)
689 if (t
[sent
+ i
] != 0xff)
691 warning ("GREADBLOCK trashed bytes after transfer area.");
695 memcpy (myaddr
, t
, sent
);
700 error ("3: ExeAppReq returned %d: cmd = %s", retval
, cmd
);
706 v850ice_files_info (struct target_ops
*ignore
)
708 puts_filtered ("Debugging a target via the NEC V850 ICE.\n");
712 v850ice_insert_breakpoint (CORE_ADDR addr
, char *contents_cache
)
717 struct MessageIO iob
;
721 sprintf (cmd
, "%d, ", addr
);
723 retval
= ExeAppReq ("GDB", GSETBREAK
, cmd
, &iob
);
725 error ("ExeAppReq (GSETBREAK) returned %d: cmd = %s", retval
, cmd
);
731 v850ice_remove_breakpoint (CORE_ADDR addr
, char *contents_cache
)
736 struct MessageIO iob
;
741 sprintf (cmd
, "%d, ", addr
);
743 retval
= ExeAppReq ("GDB", GREMOVEBREAK
, cmd
, &iob
);
745 error ("ExeAppReq (GREMOVEBREAK) returned %d: cmd = %s", retval
, cmd
);
753 target_mourn_inferior ();
763 v850ice_load (char *filename
, int from_tty
)
765 struct MessageIO iob
;
770 generic_load (filename
, from_tty
);
771 ExeAppReq ("GDB", GDOWNLOAD
, filename
, &iob
);
779 target_detach (NULL
, 0);
782 printf_unfiltered ("\n");
792 /* Safegaurd against confusing the breakpoint routines... */
793 delete_command (NULL
, 0);
795 /* Must supress from_tty, otherwise we could start asking if the
796 user really wants to load a new symbol table, etc... */
797 printf_unfiltered ("Reading symbols from %s...", arg
);
799 symbol_file_add_main (arg
, 0);
800 printf_unfiltered ("done\n");
802 /* exec_open will kill our target, so reinstall the ICE as
804 v850ice_open (NULL
, 0);
806 togdb_force_update ();
813 printf_filtered ("continue (ice)\n");
814 ReplyMessage ((LRESULT
) 1);
816 if (gdbtk_interp
== NULL
)
818 continue_command (NULL
, 1);
821 Tcl_Eval (gdbtk_interp
, "gdb_immediate continue");
827 do_gdb (char *cmd
, char *str
, void (*func
) (char *, int), int count
)
829 ReplyMessage ((LRESULT
) 1);
833 printf_unfiltered (str
);
835 if (gdbtk_interp
== NULL
)
840 Tcl_Eval (gdbtk_interp
, cmd
);
850 do_gdb ("gdb_immediate stepi", "stepi (ice)\n", stepi_command
, count
);
859 do_gdb ("gdb_immediate nexti", "nexti (ice)\n", nexti_command
, count
);
864 v850ice_command (char *arg
, int from_tty
)
866 struct MessageIO iob
;
871 ExeAppReq ("GDB", GCOMMAND
, arg
, &iob
);
875 togdb_force_update (void)
877 if (gdbtk_interp
!= NULL
)
878 Tcl_Eval (gdbtk_interp
, "gdbtk_update");
882 view_source (CORE_ADDR addr
)
886 if (gdbtk_interp
!= NULL
)
888 sprintf (c
, "catch {set src [lindex [ManagedWin::find SrcWin] 0]\n$src location BROWSE [gdb_loc *0x%x]}", addr
);
889 Tcl_Eval (gdbtk_interp
, c
);
893 /* Define the target subroutine names */
896 init_850ice_ops (void)
898 v850ice_ops
.to_shortname
= "ice";
899 v850ice_ops
.to_longname
= "NEC V850 ICE interface";
900 v850ice_ops
.to_doc
= "Debug a system controlled by a NEC 850 ICE.";
901 v850ice_ops
.to_open
= v850ice_open
;
902 v850ice_ops
.to_close
= v850ice_close
;
903 v850ice_ops
.to_attach
= NULL
;
904 v850ice_ops
.to_post_attach
= NULL
;
905 v850ice_ops
.to_require_attach
= NULL
;
906 v850ice_ops
.to_detach
= v850ice_detach
;
907 v850ice_ops
.to_require_detach
= NULL
;
908 v850ice_ops
.to_resume
= v850ice_resume
;
909 v850ice_ops
.to_wait
= v850ice_wait
;
910 v850ice_ops
.to_post_wait
= NULL
;
911 v850ice_ops
.to_fetch_registers
= v850ice_fetch_registers
;
912 v850ice_ops
.to_store_registers
= v850ice_store_registers
;
913 v850ice_ops
.to_prepare_to_store
= v850ice_prepare_to_store
;
914 v850ice_ops
.to_xfer_memory
= v850ice_xfer_memory
;
915 v850ice_ops
.to_files_info
= v850ice_files_info
;
916 v850ice_ops
.to_insert_breakpoint
= v850ice_insert_breakpoint
;
917 v850ice_ops
.to_remove_breakpoint
= v850ice_remove_breakpoint
;
918 v850ice_ops
.to_terminal_init
= NULL
;
919 v850ice_ops
.to_terminal_inferior
= NULL
;
920 v850ice_ops
.to_terminal_ours_for_output
= NULL
;
921 v850ice_ops
.to_terminal_ours
= NULL
;
922 v850ice_ops
.to_terminal_info
= NULL
;
923 v850ice_ops
.to_kill
= v850ice_kill
;
924 v850ice_ops
.to_load
= v850ice_load
;
925 v850ice_ops
.to_lookup_symbol
= NULL
;
926 v850ice_ops
.to_create_inferior
= NULL
;
927 v850ice_ops
.to_mourn_inferior
= v850ice_mourn
;
928 v850ice_ops
.to_can_run
= 0;
929 v850ice_ops
.to_notice_signals
= 0;
930 v850ice_ops
.to_thread_alive
= NULL
;
931 v850ice_ops
.to_stop
= v850ice_stop
;
932 v850ice_ops
.to_pid_to_exec_file
= NULL
;
933 v850ice_ops
.to_core_file_to_sym_file
= NULL
;
934 v850ice_ops
.to_stratum
= process_stratum
;
935 v850ice_ops
.DONT_USE
= NULL
;
936 v850ice_ops
.to_has_all_memory
= 1;
937 v850ice_ops
.to_has_memory
= 1;
938 v850ice_ops
.to_has_stack
= 1;
939 v850ice_ops
.to_has_registers
= 1;
940 v850ice_ops
.to_has_execution
= 1;
941 v850ice_ops
.to_sections
= NULL
;
942 v850ice_ops
.to_sections_end
= NULL
;
943 v850ice_ops
.to_magic
= OPS_MAGIC
;
947 _initialize_v850ice (void)
950 add_target (&v850ice_ops
);
952 add_com ("ice", class_obscure
, v850ice_command
,
953 "Send command to ICE");