- new, partially implemented, lines in .bochsrc allow run-time choice of

what action to take on panic, error, info, and debug.  The lines don't
  have any effect quite yet because of an initialization order problem
  with the logfunctions.
This commit is contained in:
Bryce Denney 2001-05-22 20:01:40 +00:00
parent cbc8c960d2
commit a04c65e642
4 changed files with 142 additions and 38 deletions

View File

@ -12,6 +12,24 @@ vgaromimage: bios/VGABIOS-elpin-2.40
# examples. Leave only one of each directive uncommented,
# if any.
# Bochs now has four severity levels for event logging.
# panic: cannot proceed. If you choose to continue after a panic,
# don't be surprised if you get unstable behavior.
# error: something went wrong, but it is probably safe to continue the
# simulation.
# info: interesting or useful messages, not 1000's per second.
# debug: messages useful only when debugging the code. This may
# spit out thousands per second.
#
# For events of each level, you can choose to crash, report, or ignore.
# TODO: allow choice based on the facility: e.g. report debug messages
# from the cdrom but ignore debug messages from everything else.
panic: action=crash
error: action=report
info: action=report
debug: action=ignore
#vgaromimage: :bios:VGABIOS-elpin-2.20
#romimage: file=:bios:BIOS-bochs-981222a, address=0xf0000
#floppya: 1_44=[fd:], status=inserted

View File

@ -224,6 +224,7 @@ public:
void error(char *fmt, ...);
void panic(char *fmt, ...);
void ldebug(char *fmt, ...);
void crash ();
void setprefix(char *);
void settype(int);
void setio(class iofunctions *);
@ -240,16 +241,17 @@ class iofunctions {
static char *loglevel[] = {
"DEBUG",
"INFO",
"PANIC",
"ERROR",
"PANIC",
};
return loglevel[i];
}
// Log Level defines
#define LOGLEV_DEBUG 0
#define LOGLEV_INFO 1
#define LOGLEV_PANIC 2
#define LOGLEV_ERROR 3
#define LOGLEV_ERROR 2
#define LOGLEV_PANIC 3
#define MAX_LOGLEV 4
char *getclass(int i) {
char *logclass[] = {
"IO ",
@ -552,6 +554,9 @@ typedef struct {
bx_ne2k_options ne2k;
Boolean newHardDriveSupport;
bx_load32bitOSImage_t load32bitOSImage;
// one array item for each log level, indexed by LOGLEV_*.
// values: 0=ignore event, 1=report event in log, 2=crash
unsigned char log_actions[4];
} bx_options_t;
extern bx_options_t bx_options;

View File

@ -40,12 +40,6 @@
// USER CONFIGURABLE OPTIONS : EDIT ONLY OPTIONS IN THIS SECTION //
///////////////////////////////////////////////////////////////////
// This switch determines if a call to bx_panic will kill the
// simulation or not. Leave it on by default so that default
// functionality stays the same, but now it's easy to change the
// behavior to suit your taste.
#define BX_PANIC_IS_FATAL 1
// I rebuilt the code which provides timers to IO devices.
// Setting this to 1 will introduce a little code which
// will panic out if cases which shouldn't happen occur.

View File

@ -80,7 +80,8 @@ bx_options_t bx_options = {
{NULL, 0}, // cmos path, cmos image boolean
{ 0, 0, 0, {0,0,0,0,0,0}, NULL, NULL }, // ne2k
1, // newHardDriveSupport
{ 0, NULL, NULL, NULL } // load32bitOSImage hack stuff
{ 0, NULL, NULL, NULL }, // load32bitOSImage hack stuff
{ 0, 1, 1, 2 } // ignore debugs, report infos and errors, crash on panics.
};
static char bochsrc_path[512];
@ -239,10 +240,10 @@ logfunctions::logfunctions(void)
io = new iofunc_t(stderr);
}
setio(io);
onoff[LOGLEV_DEBUG]=0;
onoff[LOGLEV_ERROR]=1;
onoff[LOGLEV_PANIC]=1; // XXX careful, disable this, and you disable panics!
onoff[LOGLEV_INFO]=1;
// BUG: unfortunately this can be called before the bochsrc is read,
// which means that the bochsrc has no effect on the actions.
for (int i=0; i<MAX_LOGLEV; i++)
onoff[i] = bx_options.log_actions[i];
}
logfunctions::logfunctions(iofunc_t *iofunc)
@ -250,10 +251,10 @@ logfunctions::logfunctions(iofunc_t *iofunc)
setprefix("[GEN ]");
settype(GENLOG);
setio(iofunc);
onoff[LOGLEV_DEBUG]=0;
onoff[LOGLEV_ERROR]=1;
onoff[LOGLEV_PANIC]=1; // XXX careful, disable this, and you disable panics!
onoff[LOGLEV_INFO]=1;
// BUG: unfortunately this can be called before the bochsrc is read,
// which means that the bochsrc has no effect on the actions.
for (int i=0; i<MAX_LOGLEV; i++)
onoff[i] = bx_options.log_actions[i];
}
logfunctions::~logfunctions(void)
@ -293,6 +294,8 @@ logfunctions::info(char *fmt, ...)
va_start(ap, fmt);
this->logio->out(this->type,LOGLEV_INFO,this->prefix, fmt, ap);
va_end(ap);
if (onoff[LOGLEV_INFO] > 1) crash ();
}
void
@ -310,7 +313,9 @@ logfunctions::error(char *fmt, ...)
va_start(ap, fmt);
this->logio->out(this->type,LOGLEV_ERROR,this->prefix, fmt, ap);
va_end(ap);
if (onoff[LOGLEV_ERROR] > 1) crash ();
}
void
logfunctions::panic(char *fmt, ...)
{
@ -324,29 +329,10 @@ logfunctions::panic(char *fmt, ...)
va_start(ap, fmt);
this->logio->out(this->type,LOGLEV_PANIC,this->prefix, fmt, ap);
#if BX_PANIC_IS_FATAL
// we're about to crash anyway, so we should print the
// panic to stderr so that it's easy to find.
#endif
va_end(ap);
}
#if !BX_PANIC_IS_FATAL
return;
#endif
bx_atexit();
#if !BX_DEBUGGER
exit(1);
#else
static Boolean dbg_exit_called = 0;
if (dbg_exit_called == 0) {
dbg_exit_called = 1;
bx_dbg_exit(1);
}
#endif
if (onoff[LOGLEV_PANIC] > 1) crash ();
}
void
@ -364,6 +350,23 @@ logfunctions::ldebug(char *fmt, ...)
va_start(ap, fmt);
this->logio->out(this->type,LOGLEV_DEBUG,this->prefix, fmt, ap);
va_end(ap);
if (onoff[LOGLEV_DEBUG] > 1) crash ();
}
void
logfunctions::crash (void)
{
bx_atexit();
#if !BX_DEBUGGER
exit(1);
#else
static Boolean dbg_exit_called = 0;
if (dbg_exit_called == 0) {
dbg_exit_called = 1;
bx_dbg_exit(1);
}
#endif
}
iofunc_t *io = NULL;
@ -829,6 +832,90 @@ parse_line_formatted(int num_params, char *params[])
}
strcpy(logfilename, params[1]);
}
else if (!strcmp(params[0], "panic")) {
if (num_params != 2) {
fprintf(stderr, ".bochsrc: panic directive malformed.\n");
exit(1);
}
if (strncmp(params[1], "action=", 7)) {
fprintf(stderr, ".bochsrc: panic directive malformed.\n");
exit(1);
}
char *action = 7 + params[1];
if (!strcmp(action, "crash"))
bx_options.log_actions[LOGLEV_PANIC] = 2;
else if (!strcmp (action, "report"))
bx_options.log_actions[LOGLEV_PANIC] = 1;
else if (!strcmp (action, "ignore"))
bx_options.log_actions[LOGLEV_PANIC] = 0;
else {
fprintf(stderr, ".bochsrc: panic directive malformed.\n");
exit(1);
}
}
else if (!strcmp(params[0], "error")) {
if (num_params != 2) {
fprintf(stderr, ".bochsrc: error directive malformed.\n");
exit(1);
}
if (strncmp(params[1], "action=", 7)) {
fprintf(stderr, ".bochsrc: error directive malformed.\n");
exit(1);
}
char *action = 7 + params[1];
if (!strcmp(action, "crash"))
bx_options.log_actions[LOGLEV_ERROR] = 2;
else if (!strcmp (action, "report"))
bx_options.log_actions[LOGLEV_ERROR] = 1;
else if (!strcmp (action, "ignore"))
bx_options.log_actions[LOGLEV_ERROR] = 0;
else {
fprintf(stderr, ".bochsrc: error directive malformed.\n");
exit(1);
}
}
else if (!strcmp(params[0], "info")) {
if (num_params != 2) {
fprintf(stderr, ".bochsrc: info directive malformed.\n");
exit(1);
}
if (strncmp(params[1], "action=", 7)) {
fprintf(stderr, ".bochsrc: info directive malformed.\n");
exit(1);
}
char *action = 7 + params[1];
if (!strcmp(action, "crash"))
bx_options.log_actions[LOGLEV_INFO] = 2;
else if (!strcmp (action, "report"))
bx_options.log_actions[LOGLEV_INFO] = 1;
else if (!strcmp (action, "ignore"))
bx_options.log_actions[LOGLEV_INFO] = 0;
else {
fprintf(stderr, ".bochsrc: info directive malformed.\n");
exit(1);
}
}
else if (!strcmp(params[0], "debug")) {
if (num_params != 2) {
fprintf(stderr, ".bochsrc: debug directive malformed.\n");
exit(1);
}
if (strncmp(params[1], "action=", 7)) {
fprintf(stderr, ".bochsrc: debug directive malformed.\n");
exit(1);
}
char *action = 7 + params[1];
if (!strcmp(action, "crash"))
bx_options.log_actions[LOGLEV_DEBUG] = 2;
else if (!strcmp (action, "report"))
bx_options.log_actions[LOGLEV_DEBUG] = 1;
else if (!strcmp (action, "ignore"))
bx_options.log_actions[LOGLEV_DEBUG] = 0;
else {
fprintf(stderr, ".bochsrc: debug directive malformed.\n");
exit(1);
}
}
else if (!strcmp(params[0], "romimage")) {
if (num_params != 3) {
fprintf(stderr, ".bochsrc: romimage directive: wrong # args.\n");