/* ICE interface for the NEC V850 for GDB, the GNU debugger.
- Copyright 1996, Free Software Foundation, Inc.
+ Copyright 1996, 1997, 1998, 1999, 2000, 2001
+ Free Software Foundation, Inc.
This file is part of GDB.
#include "gdbcore.h"
#include "value.h"
#include "command.h"
+#include "regcache.h"
+#include <tcl.h>
#include <windows.h>
#include <winuser.h> /* for WM_USER */
};
/* Prototypes for functions located in other files */
-extern void break_command PARAMS ((char *, int));
+extern void break_command (char *, int);
-extern void stepi_command PARAMS ((char *, int));
-
-extern void nexti_command PARAMS ((char *, int));
-
-extern void continue_command PARAMS ((char *, int));
-
-extern int (*ui_loop_hook) PARAMS ((int));
+extern int (*ui_loop_hook) (int);
/* Prototypes for local functions */
-static int init_hidden_window PARAMS ((void));
+static int init_hidden_window (void);
-static LRESULT CALLBACK v850ice_wndproc PARAMS ((HWND, UINT, WPARAM, LPARAM));
+static LRESULT CALLBACK v850ice_wndproc (HWND, UINT, WPARAM, LPARAM);
-static void v850ice_files_info PARAMS ((struct target_ops * ignore));
+static void v850ice_files_info (struct target_ops *ignore);
-static int v850ice_xfer_memory PARAMS ((CORE_ADDR memaddr, char *myaddr,
- int len, int should_write,
- struct target_ops * target));
+static int v850ice_xfer_memory (CORE_ADDR memaddr, char *myaddr,
+ int len, int should_write,
+ struct target_ops *target);
-static void v850ice_prepare_to_store PARAMS ((void));
+static void v850ice_prepare_to_store (void);
-static void v850ice_fetch_registers PARAMS ((int regno));
+static void v850ice_fetch_registers (int regno);
-static void v850ice_resume PARAMS ((int pid, int step,
- enum target_signal siggnal));
+static void v850ice_resume (ptid_t ptid, int step,
+ enum target_signal siggnal);
-static void v850ice_open PARAMS ((char *name, int from_tty));
+static void v850ice_open (char *name, int from_tty);
-static void v850ice_close PARAMS ((int quitting));
+static void v850ice_close (int quitting);
-static void v850ice_stop PARAMS ((void));
+static void v850ice_stop (void);
-static void v850ice_store_registers PARAMS ((int regno));
+static void v850ice_store_registers (int regno);
-static void v850ice_mourn PARAMS ((void));
+static void v850ice_mourn (void);
-static int v850ice_wait PARAMS ((int pid, struct target_waitstatus * status));
+static ptid_t v850ice_wait (ptid_t ptid,
+ struct target_waitstatus *status);
-static void v850ice_kill PARAMS ((void));
+static void v850ice_kill (void);
-static void v850ice_detach PARAMS ((char *args, int from_tty));
+static void v850ice_detach (char *args, int from_tty);
-static int v850ice_insert_breakpoint PARAMS ((CORE_ADDR, char *));
+static int v850ice_insert_breakpoint (CORE_ADDR, char *);
-static int v850ice_remove_breakpoint PARAMS ((CORE_ADDR, char *));
+static int v850ice_remove_breakpoint (CORE_ADDR, char *);
-static void v850ice_command PARAMS ((char *, int));
+static void v850ice_command (char *, int);
-static int ice_disassemble PARAMS ((unsigned long, int, char *));
+static int ice_disassemble (unsigned long, int, char *);
-static int ice_lookup_addr PARAMS ((unsigned long *, char *, char *));
+static int ice_lookup_addr (unsigned long *, char *, char *);
-static int ice_lookup_symbol PARAMS ((unsigned long, char *));
+static int ice_lookup_symbol (unsigned long, char *);
-static void ice_SimulateDisassemble PARAMS ((char *, int));
+static void ice_SimulateDisassemble (char *, int);
-static void ice_SimulateAddrLookup PARAMS ((char *, int));
+static void ice_SimulateAddrLookup (char *, int);
-static void ice_Simulate_SymLookup PARAMS ((char *, int));
+static void ice_Simulate_SymLookup (char *, int);
-static void ice_fputs PARAMS ((const char *, GDB_FILE *));
+static void ice_fputs (const char *, struct ui_file *);
-static int ice_file PARAMS ((char *));
+static int ice_file (char *);
-static int ice_cont PARAMS ((char *));
+static int ice_cont (char *);
-static int ice_stepi PARAMS ((char *));
+static int ice_stepi (char *);
-static int ice_nexti PARAMS ((char *));
+static int ice_nexti (char *);
-static void togdb_force_update PARAMS ((void));
+static void togdb_force_update (void);
-static void do_gdb (char *, char *, void (*func) PARAMS ((char *, int)), int);
+static void view_source (CORE_ADDR);
+
+static void do_gdb (char *, char *, void (*func) (char *, int), int);
/* Globals */
static HWND hidden_hwnd; /* HWND for messages */
-long (__stdcall * ExeAppReq) PARAMS ((char *, long, char *, struct MessageIO *));
+long (__stdcall * ExeAppReq) (char *, long, char *, struct MessageIO *);
-long (__stdcall * RegisterClient) PARAMS ((HWND));
+long (__stdcall * RegisterClient) (HWND);
-long (__stdcall * UnregisterClient) PARAMS ((void));
+long (__stdcall * UnregisterClient) (void);
+extern Tcl_Interp *gdbtk_interp;
/* Globals local to this file only */
static int ice_open = 0; /* Is ICE open? */
/* This function creates a hidden window */
static int
-init_hidden_window ()
+init_hidden_window (void)
{
WNDCLASS class;
WM_STATE_CHANGE - tells us that a state change has occured in the ICE
*/
static LRESULT CALLBACK
-v850ice_wndproc (hwnd, message, wParam, lParam)
- HWND hwnd;
- UINT message;
- WPARAM wParam;
- LPARAM lParam;
+v850ice_wndproc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
LRESULT result = FALSE;
MessageBox (0, "Address resolution\nNot implemented", "GDB", MB_OK);
break;
case WM_SOURCE:
+ view_source ((CORE_ADDR) lParam);
break;
case WM_STATE_CHANGE:
switch (wParam)
result = TRUE;
break;
case STATE_CHANGE_STEPI:
- if (!catch_errors ((catch_errors_ftype *) ice_stepi, (PTR) (int) lParam, "",
+ if (!catch_errors ((catch_errors_ftype *) ice_stepi, (int) lParam, "",
RETURN_MASK_ALL))
printf_unfiltered ("stepi errored\n");
result = TRUE;
break;
case STATE_CHANGE_NEXTI:
- if (!catch_errors ((catch_errors_ftype *) ice_nexti, (PTR) (int) lParam, "",
+ if (!catch_errors ((catch_errors_ftype *) ice_nexti, (int) lParam, "",
RETURN_MASK_ALL))
printf_unfiltered ("nexti errored\n");
result = TRUE;
/* Code for opening a connection to the ICE. */
static void
-v850ice_open (name, from_tty)
- char *name;
- int from_tty;
+v850ice_open (char *name, int from_tty)
{
HINSTANCE handle;
if (handle == NULL)
error ("Cannot load necmsg.dll");
- ExeAppReq = (long (*)PARAMS ((char *, long, char *, struct MessageIO *)))
+ ExeAppReq = (long (*) (char *, long, char *, struct MessageIO *))
GetProcAddress (handle, "ExeAppReq");
- RegisterClient = (long (*)PARAMS ((HWND)))
+ RegisterClient = (long (*) (HWND))
GetProcAddress (handle, "RegisterClient");
- UnregisterClient = (long (*)PARAMS ((void)))
+ UnregisterClient = (long (*) (void))
GetProcAddress (handle, "UnregisterClient");
if (ExeAppReq == NULL || RegisterClient == NULL || UnregisterClient == NULL)
target is active. These functions should be split out into seperate
variables, especially since GDB will someday have a notion of debugging
several processes. */
- inferior_pid = 42000;
+ inferior_ptid = pid_to_ptid (42000);
start_remote ();
return;
/* Clean up connection to a remote debugger. */
-/* ARGSUSED */
static void
-v850ice_close (quitting)
- int quitting;
+v850ice_close (int quitting)
{
if (ice_open)
{
UnregisterClient ();
ice_open = 0;
- inferior_pid = 0;
+ inferior_ptid = null_ptid;
}
}
/* Stop the process on the ice. */
static void
-v850ice_stop ()
+v850ice_stop (void)
{
/* This is silly, but it works... */
v850ice_command ("stop", 0);
}
static void
-v850ice_detach (args, from_tty)
- char *args;
- int from_tty;
+v850ice_detach (char *args, int from_tty)
{
if (args)
error ("Argument given to \"detach\" when remotely debugging.");
/* Tell the remote machine to resume. */
static void
-v850ice_resume (pid, step, siggnal)
- int pid, step;
- enum target_signal siggnal;
+v850ice_resume (ptid_t ptid, int step, enum target_signal siggnal)
{
long retval;
char buf[256];
Returns "pid" (though it's not clear what, if anything, that
means in the case of this target). */
-static int
-v850ice_wait (pid, status)
- int pid;
- struct target_waitstatus *status;
+static ptid_t
+v850ice_wait (ptid_t ptid, struct target_waitstatus *status)
{
long v850_status;
char buf[256];
}
while (!done);
- return inferior_pid;
+ return inferior_ptid;
}
static int
-convert_register (regno, buf)
- int regno;
- char *buf;
+convert_register (int regno, char *buf)
{
if (regno <= 31)
sprintf (buf, "r%d", regno);
convert it to target byte-order if necessary. */
static void
-v850ice_fetch_registers (regno)
- int regno;
+v850ice_fetch_registers (int regno)
{
long retval;
char cmd[100];
error ("v850ice_fetch_registers (%d): bad value from ICE: %s.",
regno, val);
- store_unsigned_integer (val, REGISTER_RAW_SIZE (regno), regval);
+ store_unsigned_integer (val, DEPRECATED_REGISTER_RAW_SIZE (regno), regval);
supply_register (regno, val);
}
of REGISTERS. */
static void
-v850ice_store_registers (regno)
- int regno;
+v850ice_store_registers (int regno)
{
long retval;
char cmd[100];
return;
}
- regval = extract_unsigned_integer (®isters[REGISTER_BYTE (regno)],
- REGISTER_RAW_SIZE (regno));
+ regval = extract_unsigned_integer (&deprecated_registers[DEPRECATED_REGISTER_BYTE (regno)],
+ DEPRECATED_REGISTER_RAW_SIZE (regno));
strcpy (cmd, "reg ");
if (!convert_register (regno, &cmd[4]))
return;
register at a time. */
static void
-v850ice_prepare_to_store ()
+v850ice_prepare_to_store (void)
{
}
/* Read or write LEN bytes from inferior memory at MEMADDR, transferring
to or from debugger address MYADDR. Write to inferior if SHOULD_WRITE is
- nonzero. Returns length of data written or read; 0 for error.
+ nonzero. TARGET is unused. Returns length of data written or read;
+ 0 for error.
We can only read/write MAX_BLOCK_SIZE bytes at a time, though, or the DLL
- dies */
-/* ARGSUSED */
+ dies. */
static int
-v850ice_xfer_memory (memaddr, myaddr, len, should_write, target)
- CORE_ADDR memaddr;
- char *myaddr;
- int len;
- int should_write;
- struct target_ops *target; /* ignored */
+v850ice_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
+ int should_write, struct target_ops *target)
{
long retval;
char cmd[100];
}
static void
-v850ice_files_info (ignore)
- struct target_ops *ignore;
+v850ice_files_info (struct target_ops *ignore)
{
puts_filtered ("Debugging a target via the NEC V850 ICE.\n");
}
static int
-v850ice_insert_breakpoint (addr, contents_cache)
- CORE_ADDR addr;
- char *contents_cache;
+v850ice_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
{
long retval;
char cmd[100];
}
static int
-v850ice_remove_breakpoint (addr, contents_cache)
- CORE_ADDR addr;
- char *contents_cache;
+v850ice_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
{
long retval;
char cmd[100];
}
static void
-v850ice_kill ()
+v850ice_kill (void)
{
target_mourn_inferior ();
- inferior_pid = 0;
+ inferior_ptid = null_ptid;
}
static void
-v850ice_mourn ()
+v850ice_mourn (void)
{
}
static void
-v850ice_load (filename, from_tty)
- char *filename;
- int from_tty;
+v850ice_load (char *filename, int from_tty)
{
struct MessageIO iob;
char buf[256];
}
static int
-ice_file (arg)
- char *arg;
+ice_file (char *arg)
{
char *s;
/* Must supress from_tty, otherwise we could start asking if the
user really wants to load a new symbol table, etc... */
printf_unfiltered ("Reading symbols from %s...", arg);
- exec_file_command (arg, 0);
- symbol_file_command (arg, 0);
+ exec_open (arg, 0);
+ symbol_file_add_main (arg, 0);
printf_unfiltered ("done\n");
- /* exec_file_command will kill our target, so reinstall the ICE as
+ /* exec_open will kill our target, so reinstall the ICE as
the target. */
v850ice_open (NULL, 0);
}
static int
-ice_cont (c)
- char *c;
+ice_cont (char *c)
{
printf_filtered ("continue (ice)\n");
ReplyMessage ((LRESULT) 1);
+ if (gdbtk_interp == NULL)
+ {
continue_command (NULL, 1);
+ }
+ else
+ Tcl_Eval (gdbtk_interp, "gdb_immediate continue");
return 1;
}
static void
-do_gdb (cmd, str, func, count)
- char *cmd;
- char *str;
- void (*func) PARAMS ((char *, int));
- int count;
+do_gdb (char *cmd, char *str, void (*func) (char *, int), int count)
{
ReplyMessage ((LRESULT) 1);
{
printf_unfiltered (str);
+ if (gdbtk_interp == NULL)
+ {
func (NULL, 0);
+ }
+ else
+ Tcl_Eval (gdbtk_interp, cmd);
}
}
static int
-ice_stepi (c)
- char *c;
+ice_stepi (char *c)
{
int count = (int) c;
}
static int
-ice_nexti (c)
- char *c;
+ice_nexti (char *c)
{
int count = (int) c;
}
static void
-v850ice_command (arg, from_tty)
- char *arg;
- int from_tty;
+v850ice_command (char *arg, int from_tty)
{
struct MessageIO iob;
char buf[256];
static void
togdb_force_update (void)
{
+ if (gdbtk_interp != NULL)
+ Tcl_Eval (gdbtk_interp, "gdbtk_update");
}
+static void
+view_source (CORE_ADDR addr)
+{
+ char c[256];
+
+ if (gdbtk_interp != NULL)
+ {
+ sprintf (c, "catch {set src [lindex [ManagedWin::find SrcWin] 0]\n$src location BROWSE [gdb_loc *0x%x]}", addr);
+ Tcl_Eval (gdbtk_interp, c);
+ }
+}
/* Define the target subroutine names */
v850ice_ops.to_doc = "Debug a system controlled by a NEC 850 ICE.";
v850ice_ops.to_open = v850ice_open;
v850ice_ops.to_close = v850ice_close;
- v850ice_ops.to_attach = NULL;
- v850ice_ops.to_post_attach = NULL;
- v850ice_ops.to_require_attach = NULL;
v850ice_ops.to_detach = v850ice_detach;
- v850ice_ops.to_require_detach = NULL;
v850ice_ops.to_resume = v850ice_resume;
v850ice_ops.to_wait = v850ice_wait;
- v850ice_ops.to_post_wait = NULL;
v850ice_ops.to_fetch_registers = v850ice_fetch_registers;
v850ice_ops.to_store_registers = v850ice_store_registers;
v850ice_ops.to_prepare_to_store = v850ice_prepare_to_store;
v850ice_ops.to_files_info = v850ice_files_info;
v850ice_ops.to_insert_breakpoint = v850ice_insert_breakpoint;
v850ice_ops.to_remove_breakpoint = v850ice_remove_breakpoint;
- v850ice_ops.to_terminal_init = NULL;
- v850ice_ops.to_terminal_inferior = NULL;
- v850ice_ops.to_terminal_ours_for_output = NULL;
- v850ice_ops.to_terminal_ours = NULL;
- v850ice_ops.to_terminal_info = NULL;
v850ice_ops.to_kill = v850ice_kill;
v850ice_ops.to_load = v850ice_load;
- v850ice_ops.to_lookup_symbol = NULL;
- v850ice_ops.to_create_inferior = NULL;
v850ice_ops.to_mourn_inferior = v850ice_mourn;
- v850ice_ops.to_can_run = 0;
- v850ice_ops.to_notice_signals = 0;
- v850ice_ops.to_thread_alive = NULL;
v850ice_ops.to_stop = v850ice_stop;
- v850ice_ops.to_pid_to_exec_file = NULL;
- v850ice_ops.to_core_file_to_sym_file = NULL;
v850ice_ops.to_stratum = process_stratum;
- v850ice_ops.DONT_USE = NULL;
v850ice_ops.to_has_all_memory = 1;
v850ice_ops.to_has_memory = 1;
v850ice_ops.to_has_stack = 1;
v850ice_ops.to_has_registers = 1;
v850ice_ops.to_has_execution = 1;
- v850ice_ops.to_sections = NULL;
- v850ice_ops.to_sections_end = NULL;
v850ice_ops.to_magic = OPS_MAGIC;
}
void
-_initialize_v850ice ()
+_initialize_v850ice (void)
{
init_850ice_ops ();
add_target (&v850ice_ops);