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:
Bryce Denney 2002-11-19 09:27:39 +00:00
parent ab4fbffeeb
commit eff7720ae7
3 changed files with 70 additions and 66 deletions

View File

@ -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);

View File

@ -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) {

View File

@ -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;