mirror of https://github.com/bochs-emu/Bochs
This fixes bug #640549: dbg fails if wx configured but not on.
- The Bochs debugger uses BX_WITH_WX to decide to change to wxWindows debugger behavior: sending a synchronous message to the config interface to get a new command, sending all dbg_printf output to the config interface, deciding whether to trap control-C, etc. But now that it's possible to compile with BX_WITH_WX and BX_WITH_other_things, this isn't quite right anymore. With this change, we now use calls to a new method SIM->is_wx_selected() to decide which behavior to use. This method is equivalent to checking if the display library variable is set to "wx", but it's implemented in such a way that it only has to check a boolean for each call to SIM->is_wx_selected(). - in siminterface.cc, init some local variables to 0 to avoid compile warnings. Modified Files: debug/dbg_main.cc gui/siminterface.cc gui/siminterface.h
This commit is contained in:
parent
ab4fbffeeb
commit
eff7720ae7
|
@ -1,5 +1,5 @@
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// $Id: dbg_main.cc,v 1.88 2002-11-19 05:47:44 bdenney Exp $
|
// $Id: dbg_main.cc,v 1.89 2002-11-19 09:27:38 bdenney Exp $
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||||
|
@ -63,7 +63,6 @@ static char tmp_buf[512];
|
||||||
static char *tmp_buf_ptr;
|
static char *tmp_buf_ptr;
|
||||||
static char *argv0 = NULL;
|
static char *argv0 = NULL;
|
||||||
|
|
||||||
|
|
||||||
#if BX_NUM_SIMULATORS >= 2
|
#if BX_NUM_SIMULATORS >= 2
|
||||||
#define BX_DBG_IO_JOURNAL_SIZE 1024
|
#define BX_DBG_IO_JOURNAL_SIZE 1024
|
||||||
#define BX_DBG_UCMEM_JOURNAL_SIZE 1024
|
#define BX_DBG_UCMEM_JOURNAL_SIZE 1024
|
||||||
|
@ -383,7 +382,6 @@ process_sim2:
|
||||||
BX_MEM(1)->load_ROM(bx_options.vgarom.path->getptr (), 0xc0000);
|
BX_MEM(1)->load_ROM(bx_options.vgarom.path->getptr (), 0xc0000);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// (mch) Moved from main.cc
|
// (mch) Moved from main.cc
|
||||||
DEV_init_devices();
|
DEV_init_devices();
|
||||||
DEV_reset_devices(BX_RESET_HARDWARE);
|
DEV_reset_devices(BX_RESET_HARDWARE);
|
||||||
|
@ -400,10 +398,10 @@ process_sim2:
|
||||||
0);
|
0);
|
||||||
|
|
||||||
// setup Ctrl-C handler
|
// setup Ctrl-C handler
|
||||||
#if !BX_WITH_WX
|
if (!SIM->is_wx_selected ()) {
|
||||||
signal(SIGINT, bx_debug_ctrlc_handler);
|
signal(SIGINT, bx_debug_ctrlc_handler);
|
||||||
BX_INFO (("set SIGINT handler to bx_debug_ctrlc_handler"));
|
BX_INFO (("set SIGINT handler to bx_debug_ctrlc_handler"));
|
||||||
#endif
|
}
|
||||||
|
|
||||||
// Print disassembly of the first instruction... you wouldn't think it
|
// Print disassembly of the first instruction... you wouldn't think it
|
||||||
// would have to be so hard. First initialize guard_found, since it is used
|
// would have to be so hard. First initialize guard_found, since it is used
|
||||||
|
@ -506,8 +504,7 @@ bx_get_command(void)
|
||||||
if (bx_infile_stack_index == 0) {
|
if (bx_infile_stack_index == 0) {
|
||||||
sprintf(prompt, "<bochs:%d> ", bx_infile_stack[bx_infile_stack_index].lineno);
|
sprintf(prompt, "<bochs:%d> ", bx_infile_stack[bx_infile_stack_index].lineno);
|
||||||
}
|
}
|
||||||
#if BX_WITH_WX
|
if (SIM->is_wx_selected() && bx_infile_stack_index == 0) {
|
||||||
if (bx_infile_stack_index == 0) {
|
|
||||||
// wait for wxWindows to send another debugger command
|
// wait for wxWindows to send another debugger command
|
||||||
charptr_ret = SIM->debug_get_next_command ();
|
charptr_ret = SIM->debug_get_next_command ();
|
||||||
if (charptr_ret) {
|
if (charptr_ret) {
|
||||||
|
@ -522,8 +519,8 @@ bx_get_command(void)
|
||||||
// shutting down
|
// shutting down
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#elif HAVE_LIBREADLINE
|
#if HAVE_LIBREADLINE
|
||||||
if (bx_infile_stack_index == 0) {
|
else if (bx_infile_stack_index == 0) {
|
||||||
charptr_ret = readline (prompt);
|
charptr_ret = readline (prompt);
|
||||||
// beware, returns NULL on end of file
|
// beware, returns NULL on end of file
|
||||||
if (charptr_ret && strlen(charptr_ret) > 0) {
|
if (charptr_ret && strlen(charptr_ret) > 0) {
|
||||||
|
@ -533,16 +530,15 @@ bx_get_command(void)
|
||||||
free (charptr_ret);
|
free (charptr_ret);
|
||||||
charptr_ret = &tmp_buf[0];
|
charptr_ret = &tmp_buf[0];
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
#endif
|
||||||
|
else if (bx_infile_stack_index == 0) {
|
||||||
|
dbg_printf ( "%s", prompt);
|
||||||
|
}
|
||||||
|
if (bx_infile_stack_index != 0) {
|
||||||
charptr_ret = fgets(tmp_buf, 512,
|
charptr_ret = fgets(tmp_buf, 512,
|
||||||
bx_infile_stack[bx_infile_stack_index].fp);
|
bx_infile_stack[bx_infile_stack_index].fp);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
if (bx_infile_stack_index == 0)
|
|
||||||
dbg_printf ( "%s", prompt);
|
|
||||||
charptr_ret = fgets(tmp_buf, 512,
|
|
||||||
bx_infile_stack[bx_infile_stack_index].fp);
|
|
||||||
#endif
|
|
||||||
if (charptr_ret == NULL) {
|
if (charptr_ret == NULL) {
|
||||||
// see if error was due to EOF condition
|
// see if error was due to EOF condition
|
||||||
if (feof(bx_infile_stack[bx_infile_stack_index].fp)) {
|
if (feof(bx_infile_stack[bx_infile_stack_index].fp)) {
|
||||||
|
@ -650,18 +646,18 @@ bxerror(char *s)
|
||||||
bx_debug_ctrlc_handler(int signum)
|
bx_debug_ctrlc_handler(int signum)
|
||||||
{
|
{
|
||||||
UNUSED(signum);
|
UNUSED(signum);
|
||||||
#if BX_WITH_WX
|
if (SIM->is_wx_selected ()) {
|
||||||
// in a multithreaded environment, a signal such as SIGINT can be sent to all
|
// in a multithreaded environment, a signal such as SIGINT can be sent to all
|
||||||
// threads. This function is only intended to handle signals in the
|
// threads. This function is only intended to handle signals in the
|
||||||
// simulator thread. It will simply return if called from any other thread.
|
// simulator thread. It will simply return if called from any other thread.
|
||||||
// Otherwise the BX_PANIC() below can be called in multiple threads at
|
// Otherwise the BX_PANIC() below can be called in multiple threads at
|
||||||
// once, leading to multiple threads trying to display a dialog box,
|
// once, leading to multiple threads trying to display a dialog box,
|
||||||
// leading to GUI deadlock.
|
// leading to GUI deadlock.
|
||||||
if (!SIM->is_sim_thread ()) {
|
if (!SIM->is_sim_thread ()) {
|
||||||
BX_INFO (("bx_signal_handler: ignored sig %d because it wasn't called from the simulator thread", signum));
|
BX_INFO (("bx_signal_handler: ignored sig %d because it wasn't called from the simulator thread", signum));
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
BX_INFO(("Ctrl-C detected in signal handler."));
|
BX_INFO(("Ctrl-C detected in signal handler."));
|
||||||
|
|
||||||
signal(SIGINT, bx_debug_ctrlc_handler);
|
signal(SIGINT, bx_debug_ctrlc_handler);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// $Id: siminterface.cc,v 1.84 2002-11-19 05:54:25 bdenney Exp $
|
// $Id: siminterface.cc,v 1.85 2002-11-19 09:27:38 bdenney Exp $
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// See siminterface.h for description of the siminterface concept.
|
// See siminterface.h for description of the siminterface concept.
|
||||||
|
@ -112,6 +112,8 @@ public:
|
||||||
virtual int begin_simulation (int argc, char *argv[]);
|
virtual int begin_simulation (int argc, char *argv[]);
|
||||||
virtual void set_sim_thread_func (is_sim_thread_func_t func) {}
|
virtual void set_sim_thread_func (is_sim_thread_func_t func) {}
|
||||||
virtual bool is_sim_thread ();
|
virtual bool is_sim_thread ();
|
||||||
|
bool wxsel;
|
||||||
|
virtual bool is_wx_selected () { return wxsel; }
|
||||||
};
|
};
|
||||||
|
|
||||||
bx_param_c *
|
bx_param_c *
|
||||||
|
@ -198,6 +200,7 @@ bx_real_sim_c::bx_real_sim_c ()
|
||||||
ci_callback = NULL;
|
ci_callback = NULL;
|
||||||
ci_callback_data = NULL;
|
ci_callback_data = NULL;
|
||||||
is_sim_thread_func = NULL;
|
is_sim_thread_func = NULL;
|
||||||
|
wxsel = false;
|
||||||
|
|
||||||
enabled = 1;
|
enabled = 1;
|
||||||
int i;
|
int i;
|
||||||
|
@ -302,19 +305,19 @@ bx_real_sim_c::quit_sim (int code) {
|
||||||
longjmp (*quit_context, 1);
|
longjmp (*quit_context, 1);
|
||||||
BX_PANIC (("in bx_real_sim_c::quit_sim, longjmp should never return"));
|
BX_PANIC (("in bx_real_sim_c::quit_sim, longjmp should never return"));
|
||||||
}
|
}
|
||||||
#if BX_WITH_WX
|
if (SIM->is_wx_selected ()) {
|
||||||
// in wxWindows, the whole simulator is running in a separate thread.
|
// in wxWindows, the whole simulator is running in a separate thread.
|
||||||
// our only job is to end the thread as soon as possible, NOT to shut
|
// our only job is to end the thread as soon as possible, NOT to shut
|
||||||
// down the whole application with an exit.
|
// down the whole application with an exit.
|
||||||
BX_CPU(0)->async_event = 1;
|
BX_CPU(0)->async_event = 1;
|
||||||
BX_CPU(0)->kill_bochs_request = 1;
|
BX_CPU(0)->kill_bochs_request = 1;
|
||||||
// the cpu loop will exit very soon after this condition is set.
|
// the cpu loop will exit very soon after this condition is set.
|
||||||
#else
|
} else {
|
||||||
// just a single thread. Use exit() to stop the application.
|
// just a single thread. Use exit() to stop the application.
|
||||||
if (!code)
|
if (!code)
|
||||||
BX_PANIC (("Quit simulation command"));
|
BX_PANIC (("Quit simulation command"));
|
||||||
::exit (0);
|
::exit (0);
|
||||||
#endif
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -592,14 +595,14 @@ bx_real_sim_c::create_disk_image (
|
||||||
}
|
}
|
||||||
|
|
||||||
void bx_real_sim_c::refresh_ci () {
|
void bx_real_sim_c::refresh_ci () {
|
||||||
#if BX_WITH_WX
|
if (SIM->is_wx_selected ()) {
|
||||||
// presently, only wxWindows interface uses these events
|
// presently, only wxWindows interface uses these events
|
||||||
// It's an async event, so allocate a pointer and send it.
|
// It's an async event, so allocate a pointer and send it.
|
||||||
// The event will be freed by the recipient.
|
// The event will be freed by the recipient.
|
||||||
BxEvent *event = new BxEvent ();
|
BxEvent *event = new BxEvent ();
|
||||||
event->type = BX_ASYNC_EVT_REFRESH;
|
event->type = BX_ASYNC_EVT_REFRESH;
|
||||||
sim_to_ci_event (event);
|
sim_to_ci_event (event);
|
||||||
#endif
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bx_param_c *
|
bx_param_c *
|
||||||
|
@ -650,18 +653,18 @@ char *bx_real_sim_c::debug_get_next_command ()
|
||||||
|
|
||||||
void bx_real_sim_c::debug_puts (const char *text)
|
void bx_real_sim_c::debug_puts (const char *text)
|
||||||
{
|
{
|
||||||
#if BX_WITH_WX
|
if (SIM->is_wx_selected ()) {
|
||||||
// send message to the wxWindows debugger
|
// send message to the wxWindows debugger
|
||||||
BxEvent *event = new BxEvent ();
|
BxEvent *event = new BxEvent ();
|
||||||
event->type = BX_ASYNC_EVT_DBG_MSG;
|
event->type = BX_ASYNC_EVT_DBG_MSG;
|
||||||
event->u.logmsg.msg = text;
|
event->u.logmsg.msg = text;
|
||||||
sim_to_ci_event (event);
|
sim_to_ci_event (event);
|
||||||
// the event will be freed by the recipient
|
// the event will be freed by the recipient
|
||||||
#else
|
} else {
|
||||||
// text mode debugger: just write to console
|
// text mode debugger: just write to console
|
||||||
fputs (text, stderr);
|
fputs (text, stderr);
|
||||||
delete [] (char *)text;
|
delete [] (char *)text;
|
||||||
#endif
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -689,6 +692,10 @@ bx_real_sim_c::configuration_interface(const char *ignore, ci_command_t command)
|
||||||
BX_PANIC (("siminterface does not support loading one configuration interface and then calling another"));
|
BX_PANIC (("siminterface does not support loading one configuration interface and then calling another"));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (!strcmp (name, "wx"))
|
||||||
|
wxsel = true;
|
||||||
|
else
|
||||||
|
wxsel = false;
|
||||||
return (*ci_callback)(ci_callback_data, command);
|
return (*ci_callback)(ci_callback_data, command);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -966,7 +973,7 @@ bx_shadow_num_c::bx_shadow_num_c (bx_id id,
|
||||||
|
|
||||||
Bit64s
|
Bit64s
|
||||||
bx_shadow_num_c::get64 () {
|
bx_shadow_num_c::get64 () {
|
||||||
Bit64u current;
|
Bit64u current = 0;
|
||||||
switch (varsize) {
|
switch (varsize) {
|
||||||
case 8: current = *(val.p8bit); break;
|
case 8: current = *(val.p8bit); break;
|
||||||
case 16: current = *(val.p16bit); break;
|
case 16: current = *(val.p16bit); break;
|
||||||
|
@ -987,7 +994,7 @@ bx_shadow_num_c::get64 () {
|
||||||
void
|
void
|
||||||
bx_shadow_num_c::set (Bit64s newval)
|
bx_shadow_num_c::set (Bit64s newval)
|
||||||
{
|
{
|
||||||
Bit64u tmp;
|
Bit64u tmp = 0;
|
||||||
if (newval < min || newval > max)
|
if (newval < min || newval > max)
|
||||||
BX_PANIC (("numerical parameter %s was set to %lld, which is out of range %lld to %lld", get_name (), newval, min, max));
|
BX_PANIC (("numerical parameter %s was set to %lld, which is out of range %lld to %lld", get_name (), newval, min, max));
|
||||||
switch (varsize) {
|
switch (varsize) {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// $Id: siminterface.h,v 1.88 2002-11-18 17:16:07 vruppert Exp $
|
// $Id: siminterface.h,v 1.89 2002-11-19 09:27:39 bdenney Exp $
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Before I can describe what this file is for, I have to make the
|
// Before I can describe what this file is for, I have to make the
|
||||||
|
@ -1260,6 +1260,7 @@ public:
|
||||||
is_sim_thread_func = func;
|
is_sim_thread_func = func;
|
||||||
}
|
}
|
||||||
virtual bool is_sim_thread () {return true;}
|
virtual bool is_sim_thread () {return true;}
|
||||||
|
virtual bool is_wx_selected () {return false;}
|
||||||
};
|
};
|
||||||
|
|
||||||
BOCHSAPI extern bx_simulator_interface_c *SIM;
|
BOCHSAPI extern bx_simulator_interface_c *SIM;
|
||||||
|
|
Loading…
Reference in New Issue