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 int (*ui_loop_hook
) (int);
55 /* Prototypes for local functions */
56 static int init_hidden_window (void);
58 static LRESULT CALLBACK
v850ice_wndproc (HWND
, UINT
, WPARAM
, LPARAM
);
60 static void v850ice_files_info (struct target_ops
*ignore
);
62 static int v850ice_xfer_memory (CORE_ADDR memaddr
, char *myaddr
,
63 int len
, int should_write
,
64 struct target_ops
*target
);
66 static void v850ice_prepare_to_store (void);
68 static void v850ice_fetch_registers (int regno
);
70 static void v850ice_resume (ptid_t ptid
, int step
,
71 enum target_signal siggnal
);
73 static void v850ice_open (char *name
, int from_tty
);
75 static void v850ice_close (int quitting
);
77 static void v850ice_stop (void);
79 static void v850ice_store_registers (int regno
);
81 static void v850ice_mourn (void);
83 static ptid_t
v850ice_wait (ptid_t ptid
,
84 struct target_waitstatus
*status
);
86 static void v850ice_kill (void);
88 static void v850ice_detach (char *args
, int from_tty
);
90 static int v850ice_insert_breakpoint (CORE_ADDR
, char *);
92 static int v850ice_remove_breakpoint (CORE_ADDR
, char *);
94 static void v850ice_command (char *, int);
96 static int ice_disassemble (unsigned long, int, char *);
98 static int ice_lookup_addr (unsigned long *, char *, char *);
100 static int ice_lookup_symbol (unsigned long, char *);
102 static void ice_SimulateDisassemble (char *, int);
104 static void ice_SimulateAddrLookup (char *, int);
106 static void ice_Simulate_SymLookup (char *, int);
108 static void ice_fputs (const char *, struct ui_file
*);
110 static int ice_file (char *);
112 static int ice_cont (char *);
114 static int ice_stepi (char *);
116 static int ice_nexti (char *);
118 static void togdb_force_update (void);
120 static void view_source (CORE_ADDR
);
122 static void do_gdb (char *, char *, void (*func
) (char *, int), int);
126 static HWND hidden_hwnd
; /* HWND for messages */
128 long (__stdcall
* ExeAppReq
) (char *, long, char *, struct MessageIO
*);
130 long (__stdcall
* RegisterClient
) (HWND
);
132 long (__stdcall
* UnregisterClient
) (void);
134 extern Tcl_Interp
*gdbtk_interp
;
136 /* Globals local to this file only */
137 static int ice_open
= 0; /* Is ICE open? */
139 static char *v850_CB_Result
; /* special char array for saving 'callback' results */
141 static int SimulateCallback
; /* simulate a callback event */
143 #define MAX_BLOCK_SIZE 64*1024 /* Cannot transfer memory in blocks bigger
145 /* MDI/ICE Message IDs */
146 #define GSINGLESTEP 0x200 /* single-step target */
147 #define GRESUME 0x201 /* resume target */
148 #define GREADREG 0x202 /* read a register */
149 #define GWRITEREG 0x203 /* write a register */
150 #define GWRITEBLOCK 0x204 /* write a block of memory */
151 #define GREADBLOCK 0x205 /* read a block of memory */
152 #define GSETBREAK 0x206 /* set a breakpoint */
153 #define GREMOVEBREAK 0x207 /* remove a breakpoint */
154 #define GHALT 0x208 /* ??? */
155 #define GCHECKSTATUS 0x209 /* check status of ICE */
156 #define GMDIREPLY 0x210 /* Reply for previous query - NOT USED */
157 #define GDOWNLOAD 0x211 /* something for MDI */
158 #define GCOMMAND 0x212 /* execute command in ice */
159 #define GLOADFILENAME 0x213 /* retrieve load filename */
160 #define GWRITEMEM 0x214 /* write word, half-word, or byte */
162 /* GCHECKSTATUS return codes: */
163 #define ICE_Idle 0x00
164 #define ICE_Breakpoint 0x01 /* hit a breakpoint */
165 #define ICE_Stepped 0x02 /* have stepped */
166 #define ICE_Exception 0x03 /* have exception */
167 #define ICE_Halted 0x04 /* hit a user halt */
168 #define ICE_Exited 0x05 /* called exit */
169 #define ICE_Terminated 0x06 /* user terminated */
170 #define ICE_Running 0x07
171 #define ICE_Unknown 0x99
173 /* Windows messages */
174 #define WM_STATE_CHANGE WM_USER+101
175 #define WM_SYM_TO_ADDR WM_USER+102
176 #define WM_ADDR_TO_SYM WM_USER+103
177 #define WM_DISASSEMBLY WM_USER+104
178 #define WM_SOURCE WM_USER+105
180 /* STATE_CHANGE codes */
181 #define STATE_CHANGE_REGS 1 /* Register(s) changed */
182 #define STATE_CHANGE_LOAD 2 /* HW reset */
183 #define STATE_CHANGE_RESET 3 /* Load new file */
184 #define STATE_CHANGE_CONT 4 /* Run target */
185 #define STATE_CHANGE_STOP 5 /* Stop target */
186 #define STATE_CHANGE_STEPI 6 /* Stepi target */
187 #define STATE_CHANGE_NEXTI 7 /* Nexti target */
189 static struct target_ops v850ice_ops
; /* Forward decl */
191 /* This function creates a hidden window */
193 init_hidden_window (void)
197 if (hidden_hwnd
!= NULL
)
201 class.cbClsExtra
= 0;
202 class.cbWndExtra
= 0;
203 class.hInstance
= GetModuleHandle (0);
204 class.hbrBackground
= NULL
;
205 class.lpszMenuName
= NULL
;
206 class.lpszClassName
= "gdb_v850ice";
207 class.lpfnWndProc
= v850ice_wndproc
;
209 class.hCursor
= NULL
;
211 if (!RegisterClass (&class))
214 hidden_hwnd
= CreateWindow ("gdb_v850ice", "gdb_v850ice", WS_TILED
,
215 0, 0, 0, 0, NULL
, NULL
, class.hInstance
,
217 if (hidden_hwnd
== NULL
)
222 err
= GetLastError ();
223 FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
, NULL
, err
,
225 printf_unfiltered ("Could not create window: %s", buf
);
233 This function is installed as the message handler for the hidden window
234 which QBox will use to communicate with gdb. It recognize and acts
235 on the following messages:
238 WM_ADDR_TO_SYM | Not implemented at NEC's request
240 WM_STATE_CHANGE - tells us that a state change has occured in the ICE
242 static LRESULT CALLBACK
243 v850ice_wndproc (HWND hwnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
245 LRESULT result
= FALSE
;
250 MessageBox (0, "Symbol resolution\nNot implemented", "GDB", MB_OK
);
253 MessageBox (0, "Address resolution\nNot implemented", "GDB", MB_OK
);
256 view_source ((CORE_ADDR
) lParam
);
258 case WM_STATE_CHANGE
:
261 case STATE_CHANGE_LOAD
:
263 struct MessageIO iob
;
269 /* Load in a new file... Need filename */
270 ExeAppReq ("GDB", GLOADFILENAME
, NULL
, &iob
);
271 if (!catch_errors ((catch_errors_ftype
*) ice_file
, iob
.buf
, "", RETURN_MASK_ALL
))
272 printf_unfiltered ("load errored\n");
275 case STATE_CHANGE_RESET
:
276 registers_changed ();
277 flush_cached_frames ();
278 togdb_force_update ();
281 case STATE_CHANGE_REGS
:
282 registers_changed ();
283 togdb_force_update ();
286 case STATE_CHANGE_CONT
:
287 if (!catch_errors ((catch_errors_ftype
*) ice_cont
, NULL
, "", RETURN_MASK_ALL
))
288 printf_unfiltered ("continue errored\n");
291 case STATE_CHANGE_STEPI
:
292 if (!catch_errors ((catch_errors_ftype
*) ice_stepi
, (int) lParam
, "",
294 printf_unfiltered ("stepi errored\n");
297 case STATE_CHANGE_NEXTI
:
298 if (!catch_errors ((catch_errors_ftype
*) ice_nexti
, (int) lParam
, "",
300 printf_unfiltered ("nexti errored\n");
307 return DefWindowProc (hwnd
, message
, wParam
, lParam
);
312 /* Code for opening a connection to the ICE. */
315 v850ice_open (char *name
, int from_tty
)
320 error ("Too many arguments.");
322 target_preopen (from_tty
);
324 unpush_target (&v850ice_ops
);
327 puts_filtered ("V850ice debugging\n");
329 push_target (&v850ice_ops
); /* Switch to using v850ice target now */
331 target_terminal_init ();
333 /* Initialize everything necessary to facilitate communication
334 between QBox, gdb, and the DLLs which control the ICE */
335 if (ExeAppReq
== NULL
)
337 handle
= LoadLibrary ("necmsg.dll");
339 error ("Cannot load necmsg.dll");
341 ExeAppReq
= (long (*) (char *, long, char *, struct MessageIO
*))
342 GetProcAddress (handle
, "ExeAppReq");
343 RegisterClient
= (long (*) (HWND
))
344 GetProcAddress (handle
, "RegisterClient");
345 UnregisterClient
= (long (*) (void))
346 GetProcAddress (handle
, "UnregisterClient");
348 if (ExeAppReq
== NULL
|| RegisterClient
== NULL
|| UnregisterClient
== NULL
)
349 error ("Could not find requisite functions in necmsg.dll.");
351 if (!init_hidden_window ())
352 error ("could not initialize message handling");
355 /* Tell the DLL we are here */
356 RegisterClient (hidden_hwnd
);
360 /* Without this, some commands which require an active target (such as kill)
361 won't work. This variable serves (at least) double duty as both the pid
362 of the target process (if it has such), and as a flag indicating that a
363 target is active. These functions should be split out into seperate
364 variables, especially since GDB will someday have a notion of debugging
365 several processes. */
366 inferior_ptid
= pid_to_ptid (42000);
372 /* Clean up connection to a remote debugger. */
376 v850ice_close (int quitting
)
382 inferior_ptid
= null_ptid
;
386 /* Stop the process on the ice. */
390 /* This is silly, but it works... */
391 v850ice_command ("stop", 0);
395 v850ice_detach (char *args
, int from_tty
)
398 error ("Argument given to \"detach\" when remotely debugging.");
402 puts_filtered ("Ending v850ice debugging.\n");
405 /* Tell the remote machine to resume. */
408 v850ice_resume (ptid_t ptid
, int step
, enum target_signal siggnal
)
412 struct MessageIO iob
;
418 retval
= ExeAppReq ("GDB", GSINGLESTEP
, "step", &iob
);
420 retval
= ExeAppReq ("GDB", GRESUME
, "run", &iob
);
423 error ("ExeAppReq (step = %d) returned %d", step
, retval
);
426 /* Wait until the remote machine stops, then return,
427 storing status in STATUS just as `wait' would.
428 Returns "pid" (though it's not clear what, if anything, that
429 means in the case of this target). */
432 v850ice_wait (ptid_t ptid
, struct target_waitstatus
*status
)
436 struct MessageIO iob
;
445 if (count
++ % 100000)
451 v850_status
= ExeAppReq ("GDB", GCHECKSTATUS
, NULL
, &iob
);
459 status
->kind
= TARGET_WAITKIND_STOPPED
;
460 status
->value
.sig
= TARGET_SIGNAL_TRAP
;
464 status
->kind
= TARGET_WAITKIND_SIGNALLED
;
465 status
->value
.sig
= TARGET_SIGNAL_SEGV
;
469 status
->kind
= TARGET_WAITKIND_EXITED
;
470 status
->value
.integer
= 0;
474 status
->kind
= TARGET_WAITKIND_SIGNALLED
;
475 status
->value
.sig
= TARGET_SIGNAL_KILL
;
484 return inferior_ptid
;
488 convert_register (int regno
, char *buf
)
491 sprintf (buf
, "r%d", regno
);
492 else if (REGISTER_NAME (regno
)[0] == 's'
493 && REGISTER_NAME (regno
)[1] == 'r')
496 sprintf (buf
, "%s", REGISTER_NAME (regno
));
501 /* Read the remote registers into the block REGS. */
502 /* Note that the ICE returns register contents as ascii hex strings. We have
503 to convert that to an unsigned long, and then call store_unsigned_integer to
504 convert it to target byte-order if necessary. */
507 v850ice_fetch_registers (int regno
)
512 struct MessageIO iob
;
513 unsigned long regval
;
518 for (regno
= 0; regno
< NUM_REGS
; regno
++)
519 v850ice_fetch_registers (regno
);
523 strcpy (cmd
, "reg ");
524 if (!convert_register (regno
, &cmd
[4]))
527 iob
.size
= sizeof val
;
529 retval
= ExeAppReq ("GDB", GREADREG
, cmd
, &iob
);
531 error ("1: ExeAppReq returned %d: cmd = %s", retval
, cmd
);
533 regval
= strtoul (val
, NULL
, 16);
534 if (regval
== 0 && p
== val
)
535 error ("v850ice_fetch_registers (%d): bad value from ICE: %s.",
538 store_unsigned_integer (val
, REGISTER_RAW_SIZE (regno
), regval
);
539 supply_register (regno
, val
);
542 /* Store register REGNO, or all registers if REGNO == -1, from the contents
546 v850ice_store_registers (int regno
)
550 unsigned long regval
;
552 struct MessageIO iob
;
558 for (regno
= 0; regno
< NUM_REGS
; regno
++)
559 v850ice_store_registers (regno
);
563 regval
= extract_unsigned_integer (&deprecated_registers
[REGISTER_BYTE (regno
)],
564 REGISTER_RAW_SIZE (regno
));
565 strcpy (cmd
, "reg ");
566 if (!convert_register (regno
, &cmd
[4]))
568 sprintf (cmd
+ strlen (cmd
), "=0x%x", regval
);
570 retval
= ExeAppReq ("GDB", GWRITEREG
, cmd
, &iob
);
572 error ("2: ExeAppReq returned %d: cmd = %s", retval
, cmd
);
575 /* Prepare to store registers. Nothing to do here, since the ICE can write one
576 register at a time. */
579 v850ice_prepare_to_store (void)
583 /* Read or write LEN bytes from inferior memory at MEMADDR, transferring
584 to or from debugger address MYADDR. Write to inferior if SHOULD_WRITE is
585 nonzero. TARGET is unused. Returns length of data written or read;
588 We can only read/write MAX_BLOCK_SIZE bytes at a time, though, or the DLL
592 v850ice_xfer_memory (CORE_ADDR memaddr
, char *myaddr
, int len
,
593 int should_write
, struct target_ops
*target
)
597 struct MessageIO iob
;
602 if (len
== 4 || len
== 2 || len
== 1)
616 value
|= (long) ((myaddr
[3] << 24) & 0xff000000);
617 value
|= (long) ((myaddr
[2] << 16) & 0x00ff0000);
618 value
|= (long) ((myaddr
[1] << 8) & 0x0000ff00);
619 value
|= (long) (myaddr
[0] & 0x000000ff);
623 value
|= (long) ((myaddr
[1] << 8) & 0xff00);
624 value
|= (long) (myaddr
[0] & 0x00ff);
628 value
|= (long) (myaddr
[0] & 0xff);
632 sprintf (cmd
, "memory %c c 0x%x=0x%x", c
, (int) memaddr
, value
);
633 retval
= ExeAppReq ("GDB", GWRITEMEM
, cmd
, &iob
);
642 iob
.size
= len
> MAX_BLOCK_SIZE
? MAX_BLOCK_SIZE
: len
;
644 sprintf (cmd
, "memory b c 0x%x=0x00 l=%d", (int) memaddr
, iob
.size
);
645 retval
= ExeAppReq ("GDB", GWRITEBLOCK
, cmd
, &iob
);
662 tmp
= alloca (len
+ 100);
664 memset (tmp
+ len
, 0xff, 100);
669 iob
.size
= len
> MAX_BLOCK_SIZE
? MAX_BLOCK_SIZE
: len
;
671 sprintf (cmd
, "memory b 0x%x l=%d", (int) memaddr
, iob
.size
);
672 retval
= ExeAppReq ("GDB", GREADBLOCK
, cmd
, &iob
);
684 for (i
= 0; i
< 100; i
++)
686 if (t
[sent
+ i
] != 0xff)
688 warning ("GREADBLOCK trashed bytes after transfer area.");
692 memcpy (myaddr
, t
, sent
);
697 error ("3: ExeAppReq returned %d: cmd = %s", retval
, cmd
);
703 v850ice_files_info (struct target_ops
*ignore
)
705 puts_filtered ("Debugging a target via the NEC V850 ICE.\n");
709 v850ice_insert_breakpoint (CORE_ADDR addr
, char *contents_cache
)
714 struct MessageIO iob
;
718 sprintf (cmd
, "%d, ", addr
);
720 retval
= ExeAppReq ("GDB", GSETBREAK
, cmd
, &iob
);
722 error ("ExeAppReq (GSETBREAK) returned %d: cmd = %s", retval
, cmd
);
728 v850ice_remove_breakpoint (CORE_ADDR addr
, char *contents_cache
)
733 struct MessageIO iob
;
738 sprintf (cmd
, "%d, ", addr
);
740 retval
= ExeAppReq ("GDB", GREMOVEBREAK
, cmd
, &iob
);
742 error ("ExeAppReq (GREMOVEBREAK) returned %d: cmd = %s", retval
, cmd
);
750 target_mourn_inferior ();
751 inferior_ptid
= null_ptid
;
760 v850ice_load (char *filename
, int from_tty
)
762 struct MessageIO iob
;
767 generic_load (filename
, from_tty
);
768 ExeAppReq ("GDB", GDOWNLOAD
, filename
, &iob
);
776 target_detach (NULL
, 0);
779 printf_unfiltered ("\n");
789 /* Safegaurd against confusing the breakpoint routines... */
790 delete_command (NULL
, 0);
792 /* Must supress from_tty, otherwise we could start asking if the
793 user really wants to load a new symbol table, etc... */
794 printf_unfiltered ("Reading symbols from %s...", arg
);
796 symbol_file_add_main (arg
, 0);
797 printf_unfiltered ("done\n");
799 /* exec_open will kill our target, so reinstall the ICE as
801 v850ice_open (NULL
, 0);
803 togdb_force_update ();
810 printf_filtered ("continue (ice)\n");
811 ReplyMessage ((LRESULT
) 1);
813 if (gdbtk_interp
== NULL
)
815 continue_command (NULL
, 1);
818 Tcl_Eval (gdbtk_interp
, "gdb_immediate continue");
824 do_gdb (char *cmd
, char *str
, void (*func
) (char *, int), int count
)
826 ReplyMessage ((LRESULT
) 1);
830 printf_unfiltered (str
);
832 if (gdbtk_interp
== NULL
)
837 Tcl_Eval (gdbtk_interp
, cmd
);
847 do_gdb ("gdb_immediate stepi", "stepi (ice)\n", stepi_command
, count
);
856 do_gdb ("gdb_immediate nexti", "nexti (ice)\n", nexti_command
, count
);
861 v850ice_command (char *arg
, int from_tty
)
863 struct MessageIO iob
;
868 ExeAppReq ("GDB", GCOMMAND
, arg
, &iob
);
872 togdb_force_update (void)
874 if (gdbtk_interp
!= NULL
)
875 Tcl_Eval (gdbtk_interp
, "gdbtk_update");
879 view_source (CORE_ADDR addr
)
883 if (gdbtk_interp
!= NULL
)
885 sprintf (c
, "catch {set src [lindex [ManagedWin::find SrcWin] 0]\n$src location BROWSE [gdb_loc *0x%x]}", addr
);
886 Tcl_Eval (gdbtk_interp
, c
);
890 /* Define the target subroutine names */
893 init_850ice_ops (void)
895 v850ice_ops
.to_shortname
= "ice";
896 v850ice_ops
.to_longname
= "NEC V850 ICE interface";
897 v850ice_ops
.to_doc
= "Debug a system controlled by a NEC 850 ICE.";
898 v850ice_ops
.to_open
= v850ice_open
;
899 v850ice_ops
.to_close
= v850ice_close
;
900 v850ice_ops
.to_detach
= v850ice_detach
;
901 v850ice_ops
.to_resume
= v850ice_resume
;
902 v850ice_ops
.to_wait
= v850ice_wait
;
903 v850ice_ops
.to_fetch_registers
= v850ice_fetch_registers
;
904 v850ice_ops
.to_store_registers
= v850ice_store_registers
;
905 v850ice_ops
.to_prepare_to_store
= v850ice_prepare_to_store
;
906 v850ice_ops
.to_xfer_memory
= v850ice_xfer_memory
;
907 v850ice_ops
.to_files_info
= v850ice_files_info
;
908 v850ice_ops
.to_insert_breakpoint
= v850ice_insert_breakpoint
;
909 v850ice_ops
.to_remove_breakpoint
= v850ice_remove_breakpoint
;
910 v850ice_ops
.to_kill
= v850ice_kill
;
911 v850ice_ops
.to_load
= v850ice_load
;
912 v850ice_ops
.to_mourn_inferior
= v850ice_mourn
;
913 v850ice_ops
.to_stop
= v850ice_stop
;
914 v850ice_ops
.to_stratum
= process_stratum
;
915 v850ice_ops
.to_has_all_memory
= 1;
916 v850ice_ops
.to_has_memory
= 1;
917 v850ice_ops
.to_has_stack
= 1;
918 v850ice_ops
.to_has_registers
= 1;
919 v850ice_ops
.to_has_execution
= 1;
920 v850ice_ops
.to_magic
= OPS_MAGIC
;
924 _initialize_v850ice (void)
927 add_target (&v850ice_ops
);
929 add_com ("ice", class_obscure
, v850ice_command
,
930 "Send command to ICE");