I reworked and included Carl's patch to have a new bochsrc directive

to describe the format of the log prefix. This option can be any string
with special tokens being replaced at run time :
  #   %t : 11 decimal digits timer tick
  #   %i : 8 hexadecimal digits of cpu0 current eip
  #   %e : 1 character event type ('i'nfo, 'd'ebug, 'p'anic, 'e'rror)
  #   %d : 5 characters string of the device, between brackets
the default is "%t%i%d", so the logprefix is the same as before.

New tokens can be easily added or changed if needed.


Modified Files:
  .bochsrc bochs.h logio.cc main.cc gui/control.cc
  gui/siminterface.h gui/siminterface.cc
  patches/patch.logfilefmteip
This commit is contained in:
Christophe Bothamy 2002-06-26 14:42:35 +00:00
parent 5d84b38abd
commit a926744628
8 changed files with 549 additions and 62 deletions

View File

@ -151,6 +151,22 @@ floppy_bootsig_check: disabled=0
#log: /dev/null
log: bochsout.txt
#=======================================================================
# LOGPREFIX:
# This handles the format of the string prepended to each log line :
# You may use those special tokens :
# %t : 11 decimal digits timer tick
# %i : 8 hexadecimal digits of cpu0 current eip
# %e : 1 character event type ('i'nfo, 'd'ebug, 'p'anic, 'e'rror)
# %d : 5 characters string of the device, between brackets
#
# Default : %t%e%d
# Examples:
# logprefix: %t-%e-@%i-%d
# logprefix: %i%e%d
#=======================================================================
#logprefix: %t%e%d
#=======================================================================
# LOG CONTROLS
#

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: bochs.h,v 1.65 2002-06-16 15:02:27 vruppert Exp $
// $Id: bochs.h,v 1.66 2002-06-26 14:42:34 cbothamy Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -277,12 +277,16 @@ public:
}
} logfunc_t;
#define BX_LOGPREFIX_SIZE 51
class iofunctions {
int showtick,magic;
int magic;
char logprefix[BX_LOGPREFIX_SIZE];
FILE *logfd;
class logfunctions *log;
void init(void);
void flush(void);
void setlogprefix(void);
// Log Class defines
#define IOLOG 0
#define FDLOG 1
@ -589,6 +593,7 @@ typedef struct {
typedef struct {
bx_param_string_c *Ofilename;
bx_param_string_c *Oprefix;
// one array item for each log level, indexed by LOGLEV_*.
// values: ACT_IGNORE, ACT_REPORT, ACT_ASK, ACT_FATAL
unsigned char actions[N_LOGLEV];

View File

@ -1,10 +1,10 @@
/////////////////////////////////////////////////////////////////////////
// $Id: control.cc,v 1.50 2002-06-23 18:02:55 vruppert Exp $
// $Id: control.cc,v 1.51 2002-06-26 14:42:34 cbothamy Exp $
/////////////////////////////////////////////////////////////////////////
//
/*
* gui/control.cc
* $Id: control.cc,v 1.50 2002-06-23 18:02:55 vruppert Exp $
* $Id: control.cc,v 1.51 2002-06-26 14:42:34 cbothamy Exp $
*
* This is code for a text-mode control panel. Note that this file
* does NOT include bochs.h. Instead, it does all of its contact with
@ -102,6 +102,30 @@ clean_string (char *s0)
return s;
}
void
double_percent (char *s, int max_len)
{
char d[CPANEL_PATH_LEN];
int i=0,j=0;
if (max_len>CPANEL_PATH_LEN)
max_len=CPANEL_PATH_LEN;
max_len--;
while((s[i]!=0)&&(j<max_len))
{
d[j++]=s[i];
if((s[i]=='%')&&(j<max_len))
{
d[j++]=s[i];
}
i++;
}
d[j]=0;
strcpy(s,d);
}
/* returns 0 on success, -1 on failure. The value goes into out. */
int
ask_uint (char *prompt, Bit32u min, Bit32u max, Bit32u the_default, Bit32u *out, int base)
@ -292,15 +316,16 @@ static char *startup_options_prompt =
"------------------\n"
"0. Return to previous menu\n"
"1. Log file: %s\n"
"2. Log options for all devices\n"
"3. Log options for individual devices\n"
"4. Memory options\n"
"5. Interface options\n"
"6. Disk options\n"
"7. Serial or Parallel port options\n"
"8. Sound Blaster 16 options\n"
"9. NE2000 network card options\n"
"10. Other options\n"
"2. Log prefix: %s\n"
"3. Log options for all devices\n"
"4. Log options for individual devices\n"
"5. Memory options\n"
"6. Interface options\n"
"7. Disk options\n"
"8. Serial or Parallel port options\n"
"9. Sound Blaster 16 options\n"
"10. NE2000 network card options\n"
"11. Other options\n"
"\n"
"Please choose one: [0] ";
@ -444,23 +469,32 @@ int bx_control_panel (int menu)
case BX_CPANEL_START_OPTS:
{
char prompt[CPANEL_PATH_LEN];
char oldpath[CPANEL_PATH_LEN];
int retval = SIM->get_log_file (oldpath, CPANEL_PATH_LEN);
assert (retval >= 0);
sprintf (prompt, startup_options_prompt, oldpath);
if (ask_uint (prompt, 0, 10, 0, &choice, 10) < 0) return -1;
char oldpath[CPANEL_PATH_LEN];
char oldprefix[CPANEL_PATH_LEN];
int retval;
retval = SIM->get_log_file (oldpath, CPANEL_PATH_LEN);
assert (retval >= 0);
double_percent(oldpath,CPANEL_PATH_LEN);
retval = SIM->get_log_prefix (oldprefix, CPANEL_PATH_LEN);
assert (retval >= 0);
double_percent(oldprefix,CPANEL_PATH_LEN);
sprintf (prompt, startup_options_prompt, oldpath, oldprefix);
if (ask_uint (prompt, 0, 11, 0, &choice, 10) < 0) return -1;
switch (choice) {
case 0: return 0;
case 1: askparam (BXP_LOG_FILENAME); break;
case 2: bx_log_options (0); break;
case 3: bx_log_options (1); break;
case 4: do_menu (BXP_MENU_MEMORY); break;
case 5: do_menu (BXP_MENU_INTERFACE); break;
case 6: do_menu (BXP_MENU_DISK); break;
case 7: do_menu (BXP_MENU_SERIAL_PARALLEL); break;
case 8: do_menu (BXP_SB16); break;
case 9: do_menu (BXP_NE2K); break;
case 10: do_menu (BXP_MENU_MISC); break;
case 2: askparam (BXP_LOG_PREFIX); break;
case 3: bx_log_options (0); break;
case 4: bx_log_options (1); break;
case 5: do_menu (BXP_MENU_MEMORY); break;
case 6: do_menu (BXP_MENU_INTERFACE); break;
case 7: do_menu (BXP_MENU_DISK); break;
case 8: do_menu (BXP_MENU_SERIAL_PARALLEL); break;
case 9: do_menu (BXP_SB16); break;
case 10: do_menu (BXP_NE2K); break;
case 11: do_menu (BXP_MENU_MISC); break;
default: BAD_OPTION(menu, choice);
}
}

View File

@ -1,10 +1,10 @@
/////////////////////////////////////////////////////////////////////////
// $Id: siminterface.cc,v 1.41 2002-04-23 07:44:34 cbothamy Exp $
// $Id: siminterface.cc,v 1.42 2002-06-26 14:42:35 cbothamy Exp $
/////////////////////////////////////////////////////////////////////////
//
/*
* gui/siminterface.cc
* $Id: siminterface.cc,v 1.41 2002-04-23 07:44:34 cbothamy Exp $
* $Id: siminterface.cc,v 1.42 2002-06-26 14:42:35 cbothamy Exp $
*
* Defines the actual link between bx_simulator_interface_c methods
* and the simulator. This file includes bochs.h because it needs
@ -69,6 +69,8 @@ public:
virtual int write_rc (char *path, int overwrite);
virtual int get_log_file (char *path, int len);
virtual int set_log_file (char *path);
virtual int get_log_prefix (char *prefix, int len);
virtual int set_log_prefix (char *prefix);
virtual int get_floppy_options (int drive, bx_floppy_options *out);
virtual int get_cdrom_options (int drive, bx_cdrom_options *out);
virtual char *get_floppy_type_name (int type);
@ -293,6 +295,20 @@ bx_real_sim_c::set_log_file (char *path)
return 0;
}
int
bx_real_sim_c::get_log_prefix (char *prefix, int len)
{
strncpy (prefix, bx_options.log.Oprefix->getptr (), len);
return 0;
}
int
bx_real_sim_c::set_log_prefix (char *prefix)
{
bx_options.log.Oprefix->set (prefix);
return 0;
}
int
bx_real_sim_c::get_floppy_options (int drive, bx_floppy_options *out)
{

View File

@ -1,10 +1,10 @@
/////////////////////////////////////////////////////////////////////////
// $Id: siminterface.h,v 1.37 2002-05-02 07:54:22 cbothamy Exp $
// $Id: siminterface.h,v 1.38 2002-06-26 14:42:34 cbothamy Exp $
/////////////////////////////////////////////////////////////////////////
//
/*
* gui/siminterface.h
* $Id: siminterface.h,v 1.37 2002-05-02 07:54:22 cbothamy Exp $
* $Id: siminterface.h,v 1.38 2002-06-26 14:42:34 cbothamy Exp $
*
* Interface to the simulator, currently only used by control.cc.
* The base class bx_simulator_interface_c, contains only virtual functions
@ -103,6 +103,7 @@ typedef enum {
BXP_I440FX_SUPPORT,
BXP_NEWHARDDRIVESUPPORT,
BXP_LOG_FILENAME,
BXP_LOG_PREFIX,
BXP_CMOS_PATH,
BXP_CMOS_IMAGE,
BXP_CMOS_TIME0,
@ -596,6 +597,8 @@ public:
virtual int write_rc (char *rc, int overwrite) {return -1;}
virtual int get_log_file (char *path, int len) {return -1;}
virtual int set_log_file (char *path) {return -1;}
virtual int get_log_prefix (char *prefix, int len) {return -1;}
virtual int set_log_prefix (char *prefix) {return -1;}
virtual int get_floppy_options (int drive, bx_floppy_options *out) {return -1;}
virtual int get_cdrom_options (int drive, bx_cdrom_options *out) {return -1;}
virtual char *get_floppy_type_name (int type) {return NULL;}

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: logio.cc,v 1.18 2002-06-01 07:39:19 vruppert Exp $
// $Id: logio.cc,v 1.19 2002-06-26 14:42:34 cbothamy Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2001 MandrakeSoft S.A.
@ -45,12 +45,48 @@ iofunctions::flush(void) {
}
}
// This converts the option string to a printf style string with the following args:
// 1. timer, 2. event, 3. cpu0 eip, 4. device
void
iofunctions::setlogprefix(void) {
int i=0;
char *s;
char *f;
s=bx_options.log.Oprefix->getptr ();
strcpy(logprefix,"");
while (*s!=0) {
if (*s!='%') {
if (strlen(logprefix)<sizeof(logprefix)-1)
strncat(logprefix,s,1);
else break;
}
else {
f="";
switch (*(++s)) {
case 't': f="%1$011lld"; break;
case 'i': f="%3$08x"; break;
case 'e': f="%2$c"; break;
case 'd': f="%4$s"; break;
case '%': f="%%"; break;
}
if(strlen(logprefix)+strlen(f)<sizeof(logprefix)-1)
strcat(logprefix,f);
else break;
if(*s==0)break;
}
s++;
}
}
void
iofunctions::init(void) {
// iofunctions methods must not be called before this magic
// number is set.
magic=MAGIC_LOGNUM;
showtick = 1;
// sets the default logprefix
strcpy(logprefix,"%1$011lld%2$c%4$s");
n_logfn = 0;
init_log(stderr);
log = new logfunc_t(this);
@ -92,6 +128,8 @@ iofunctions::init_log(const char *fn)
}
logfd = newfd;
logfn = newfn;
setlogprefix();
}
void
@ -107,6 +145,7 @@ iofunctions::init_log(FILE *fs)
} else {
logfn = "(unknown)";
}
}
void
@ -135,8 +174,8 @@ iofunctions::out(int f, int l, const char *prefix, const char *fmt, va_list ap)
assert (this != NULL);
assert (logfd != NULL);
if( showtick )
fprintf(logfd, "%011lld", bx_pc_system.time_ticks());
//if( showtick )
// fprintf(logfd, "%011lld", bx_pc_system.time_ticks());
switch(l) {
case LOGLEV_INFO: c='i'; break;
@ -145,10 +184,13 @@ iofunctions::out(int f, int l, const char *prefix, const char *fmt, va_list ap)
case LOGLEV_DEBUG: c='d'; break;
default: break;
}
fprintf(logfd, "%c",c);
//fprintf(logfd, "-%c",c);
if(prefix != NULL)
fprintf(logfd, "%s ", prefix);
//if(prefix != NULL)
// fprintf(logfd, "%s ", prefix);
fprintf(logfd, logprefix, bx_pc_system.time_ticks(), c, BX_CPU(0)->eip, prefix==NULL?"":prefix);
fprintf(logfd," ");
if(l==LOGLEV_PANIC)
fprintf(logfd, ">>PANIC<< ");

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: main.cc,v 1.101 2002-05-25 13:16:55 vruppert Exp $
// $Id: main.cc,v 1.102 2002-06-26 14:42:34 cbothamy Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2001 MandrakeSoft S.A.
@ -103,7 +103,7 @@ bx_options_t bx_options = {
NULL, // newHardDriveSupport
{ 0, NULL, NULL, NULL }, // load32bitOSImage hack stuff
// log options: ignore debug, report info and error, crash on panic.
{ NULL, { ACT_IGNORE, ACT_REPORT, ACT_REPORT, ACT_ASK } },
{ NULL, NULL, { ACT_IGNORE, ACT_REPORT, ACT_REPORT, ACT_ASK } },
{ NULL, NULL }, // KeyboardMapping
};
@ -832,6 +832,12 @@ void bx_init_options ()
"-", BX_PATHNAME_LEN);
bx_options.log.Ofilename->set_ask_format ("Enter log filename: [%s] ");
bx_options.log.Oprefix = new bx_param_string_c (BXP_LOG_PREFIX,
"logprefix:prefix",
"Prefix prepended to log output",
"%t%e%d", BX_PATHNAME_LEN);
bx_options.log.Oprefix->set_ask_format ("Enter log prefix: [%s] ");
// loader
bx_options.load32bitOSImage.OwhichOS = new bx_param_enum_c (BXP_LOAD32BITOS_WHICH,
"Which operating system?",
@ -1693,6 +1699,12 @@ parse_line_formatted(char *context, int num_params, char *params[])
}
bx_options.log.Ofilename->set (params[1]);
}
else if (!strcmp(params[0], "logprefix")) {
if (num_params != 2) {
BX_PANIC(("%s: logprefix directive has wrong # args.", context));
}
bx_options.log.Oprefix->set (params[1]);
}
else if (!strcmp(params[0], "panic")) {
if (num_params != 2) {
BX_PANIC(("%s: panic directive malformed.", context));
@ -2277,6 +2289,7 @@ int
bx_write_log_options (FILE *fp, bx_log_options *opt)
{
fprintf (fp, "log: %s\n", opt->Ofilename->getptr ());
fprintf (fp, "logprefix: %s\n", opt->Oprefix->getptr ());
// no syntax to describe all the possible action settings for every
// device. Instead, take a vote and record the most popular action
// for each level of event.

View File

@ -1,9 +1,22 @@
----------------------------------------------------------------------
Patch name: patch.logfilefmteip
Author: Carl Sopchak
Date: May, 1st 2002
Date: May, 26th 2002
Detailed description:
I reworked and included Carl's patch to have a new bochsrc directive
to describe the format of the log prefix. This option can be any string
with special tokens being replaced at run time :
# %t : 11 decimal digits timer tick
# %i : 8 hexadecimal digits of cpu0 current eip
# %e : 1 character event type ('i'nfo, 'd'ebug, 'p'anic, 'e'rror)
# %d : 5 characters string of the device, between brackets
the default is "%t%i%d", so the logprefix is the same as before.
New tokens can be easily added or changed if needed.
Original Detailed description:
While working with Bela Lubkin of Caldera, trying to
get bochs to install SCO OSR5, Bela asked me to add the
EIP to the log file. The attached patch changes the
@ -25,50 +38,395 @@ Detailed description:
Patch was created with:
cvs diff -u
Apply patch to what version:
cvs checked out on May, 1st 2002
cvs checked out on May, 26th 2002
Instructions:
To patch, go to main bochs directory.
Type "patch -p0 < THIS_PATCH_FILE".
----------------------------------------------------------------------
Index: .bochsrc
===================================================================
RCS file: /cvsroot/bochs/bochs/.bochsrc,v
retrieving revision 1.41
diff -u -r1.41 .bochsrc
--- .bochsrc 4 May 2002 16:00:40 -0000 1.41
+++ .bochsrc 26 Jun 2002 14:39:43 -0000
@@ -152,6 +152,22 @@
log: bochsout.txt
#=======================================================================
+# LOGPREFIX:
+# This handles the format of the string prepended to each log line :
+# You may use those special tokens :
+# %t : 11 decimal digits timer tick
+# %i : 8 hexadecimal digits of cpu0 current eip
+# %e : 1 character event type ('i'nfo, 'd'ebug, 'p'anic, 'e'rror)
+# %d : 5 characters string of the device, between brackets
+#
+# Default : %t%e%d
+# Examples:
+# logprefix: %t-%e-@%i-%d
+# logprefix: %i%e%d
+#=======================================================================
+#logprefix: %t%e%d
+
+#=======================================================================
# LOG CONTROLS
#
# Bochs now has four severity levels for event logging.
Index: bochs.h
===================================================================
RCS file: /cvsroot/bochs/bochs/bochs.h,v
retrieving revision 1.63
diff -u -r1.63 bochs.h
--- bochs.h 23 Apr 2002 07:44:34 -0000 1.63
+++ bochs.h 1 May 2002 18:11:54 -0000
@@ -265,6 +265,7 @@
retrieving revision 1.65
diff -u -r1.65 bochs.h
--- bochs.h 16 Jun 2002 15:02:27 -0000 1.65
+++ bochs.h 26 Jun 2002 14:39:44 -0000
@@ -277,12 +277,16 @@
}
} logfunc_t;
+#define BX_LOGPREFIX_SIZE 51
+
class iofunctions {
int showtick,magic;
+ int showeip;
- int showtick,magic;
+ int magic;
+ char logprefix[BX_LOGPREFIX_SIZE];
FILE *logfd;
class logfunctions *log;
void init(void);
void flush(void);
+ void setlogprefix(void);
// Log Class defines
#define IOLOG 0
#define FDLOG 1
@@ -589,6 +593,7 @@
typedef struct {
bx_param_string_c *Ofilename;
+ bx_param_string_c *Oprefix;
// one array item for each log level, indexed by LOGLEV_*.
// values: ACT_IGNORE, ACT_REPORT, ACT_ASK, ACT_FATAL
unsigned char actions[N_LOGLEV];
Index: logio.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/logio.cc,v
retrieving revision 1.17
diff -u -r1.17 logio.cc
--- logio.cc 18 Apr 2002 00:22:19 -0000 1.17
+++ logio.cc 1 May 2002 18:11:54 -0000
@@ -51,6 +51,7 @@
retrieving revision 1.18
diff -u -r1.18 logio.cc
--- logio.cc 1 Jun 2002 07:39:19 -0000 1.18
+++ logio.cc 26 Jun 2002 14:39:44 -0000
@@ -45,12 +45,48 @@
}
}
+// This converts the option string to a printf style string with the following args:
+// 1. timer, 2. event, 3. cpu0 eip, 4. device
+void
+iofunctions::setlogprefix(void) {
+ int i=0;
+ char *s;
+ char *f;
+
+ s=bx_options.log.Oprefix->getptr ();
+ strcpy(logprefix,"");
+ while (*s!=0) {
+ if (*s!='%') {
+ if (strlen(logprefix)<sizeof(logprefix)-1)
+ strncat(logprefix,s,1);
+ else break;
+ }
+ else {
+ f="";
+ switch (*(++s)) {
+ case 't': f="%1$011lld"; break;
+ case 'i': f="%3$08x"; break;
+ case 'e': f="%2$c"; break;
+ case 'd': f="%4$s"; break;
+ case '%': f="%%"; break;
+ }
+ if(strlen(logprefix)+strlen(f)<sizeof(logprefix)-1)
+ strcat(logprefix,f);
+ else break;
+ if(*s==0)break;
+ }
+ s++;
+ }
+}
+
void
iofunctions::init(void) {
// iofunctions methods must not be called before this magic
// number is set.
magic=MAGIC_LOGNUM;
showtick = 1;
+ showeip = 1;
- showtick = 1;
+
+ // sets the default logprefix
+ strcpy(logprefix,"%1$011lld%2$c%4$s");
n_logfn = 0;
init_log(stderr);
log = new logfunc_t(this);
@@ -145,7 +146,10 @@
@@ -92,6 +128,8 @@
}
logfd = newfd;
logfn = newfn;
+
+ setlogprefix();
}
void
@@ -107,6 +145,7 @@
} else {
logfn = "(unknown)";
}
+
}
void
@@ -135,8 +174,8 @@
assert (this != NULL);
assert (logfd != NULL);
- if( showtick )
- fprintf(logfd, "%011lld", bx_pc_system.time_ticks());
+ //if( showtick )
+ // fprintf(logfd, "%011lld", bx_pc_system.time_ticks());
switch(l) {
case LOGLEV_INFO: c='i'; break;
@@ -145,10 +184,13 @@
case LOGLEV_DEBUG: c='d'; break;
default: break;
}
- fprintf(logfd, "%c",c);
+ fprintf(logfd, "-%c",c);
+ //fprintf(logfd, "-%c",c);
+
+ if( showeip )
+ fprintf(logfd, "-@%08x", BX_CPU(0)->eip);
+ //if(prefix != NULL)
+ // fprintf(logfd, "%s ", prefix);
- if(prefix != NULL)
- fprintf(logfd, "%s ", prefix);
+ fprintf(logfd, logprefix, bx_pc_system.time_ticks(), c, BX_CPU(0)->eip, prefix==NULL?"":prefix);
+ fprintf(logfd," ");
if(l==LOGLEV_PANIC)
fprintf(logfd, ">>PANIC<< ");
Index: main.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/main.cc,v
retrieving revision 1.101
diff -u -r1.101 main.cc
--- main.cc 25 May 2002 13:16:55 -0000 1.101
+++ main.cc 26 Jun 2002 14:39:44 -0000
@@ -103,7 +103,7 @@
NULL, // newHardDriveSupport
{ 0, NULL, NULL, NULL }, // load32bitOSImage hack stuff
// log options: ignore debug, report info and error, crash on panic.
- { NULL, { ACT_IGNORE, ACT_REPORT, ACT_REPORT, ACT_ASK } },
+ { NULL, NULL, { ACT_IGNORE, ACT_REPORT, ACT_REPORT, ACT_ASK } },
{ NULL, NULL }, // KeyboardMapping
};
@@ -832,6 +832,12 @@
"-", BX_PATHNAME_LEN);
bx_options.log.Ofilename->set_ask_format ("Enter log filename: [%s] ");
+ bx_options.log.Oprefix = new bx_param_string_c (BXP_LOG_PREFIX,
+ "logprefix:prefix",
+ "Prefix prepended to log output",
+ "%t%e%d", BX_PATHNAME_LEN);
+ bx_options.log.Oprefix->set_ask_format ("Enter log prefix: [%s] ");
+
// loader
bx_options.load32bitOSImage.OwhichOS = new bx_param_enum_c (BXP_LOAD32BITOS_WHICH,
"Which operating system?",
@@ -1693,6 +1699,12 @@
}
bx_options.log.Ofilename->set (params[1]);
}
+ else if (!strcmp(params[0], "logprefix")) {
+ if (num_params != 2) {
+ BX_PANIC(("%s: logprefix directive has wrong # args.", context));
+ }
+ bx_options.log.Oprefix->set (params[1]);
+ }
else if (!strcmp(params[0], "panic")) {
if (num_params != 2) {
BX_PANIC(("%s: panic directive malformed.", context));
@@ -2277,6 +2289,7 @@
bx_write_log_options (FILE *fp, bx_log_options *opt)
{
fprintf (fp, "log: %s\n", opt->Ofilename->getptr ());
+ fprintf (fp, "logprefix: %s\n", opt->Oprefix->getptr ());
// no syntax to describe all the possible action settings for every
// device. Instead, take a vote and record the most popular action
// for each level of event.
Index: gui/control.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/gui/control.cc,v
retrieving revision 1.50
diff -u -r1.50 control.cc
--- gui/control.cc 23 Jun 2002 18:02:55 -0000 1.50
+++ gui/control.cc 26 Jun 2002 14:39:44 -0000
@@ -102,6 +102,30 @@
return s;
}
+void
+double_percent (char *s, int max_len)
+{
+ char d[CPANEL_PATH_LEN];
+ int i=0,j=0;
+
+ if (max_len>CPANEL_PATH_LEN)
+ max_len=CPANEL_PATH_LEN;
+
+ max_len--;
+
+ while((s[i]!=0)&&(j<max_len))
+ {
+ d[j++]=s[i];
+ if((s[i]=='%')&&(j<max_len))
+ {
+ d[j++]=s[i];
+ }
+ i++;
+ }
+ d[j]=0;
+ strcpy(s,d);
+}
+
/* returns 0 on success, -1 on failure. The value goes into out. */
int
ask_uint (char *prompt, Bit32u min, Bit32u max, Bit32u the_default, Bit32u *out, int base)
@@ -292,15 +316,16 @@
"------------------\n"
"0. Return to previous menu\n"
"1. Log file: %s\n"
-"2. Log options for all devices\n"
-"3. Log options for individual devices\n"
-"4. Memory options\n"
-"5. Interface options\n"
-"6. Disk options\n"
-"7. Serial or Parallel port options\n"
-"8. Sound Blaster 16 options\n"
-"9. NE2000 network card options\n"
-"10. Other options\n"
+"2. Log prefix: %s\n"
+"3. Log options for all devices\n"
+"4. Log options for individual devices\n"
+"5. Memory options\n"
+"6. Interface options\n"
+"7. Disk options\n"
+"8. Serial or Parallel port options\n"
+"9. Sound Blaster 16 options\n"
+"10. NE2000 network card options\n"
+"11. Other options\n"
"\n"
"Please choose one: [0] ";
@@ -444,23 +469,32 @@
case BX_CPANEL_START_OPTS:
{
char prompt[CPANEL_PATH_LEN];
- char oldpath[CPANEL_PATH_LEN];
- int retval = SIM->get_log_file (oldpath, CPANEL_PATH_LEN);
- assert (retval >= 0);
- sprintf (prompt, startup_options_prompt, oldpath);
- if (ask_uint (prompt, 0, 10, 0, &choice, 10) < 0) return -1;
+ char oldpath[CPANEL_PATH_LEN];
+ char oldprefix[CPANEL_PATH_LEN];
+ int retval;
+
+ retval = SIM->get_log_file (oldpath, CPANEL_PATH_LEN);
+ assert (retval >= 0);
+ double_percent(oldpath,CPANEL_PATH_LEN);
+ retval = SIM->get_log_prefix (oldprefix, CPANEL_PATH_LEN);
+ assert (retval >= 0);
+ double_percent(oldprefix,CPANEL_PATH_LEN);
+
+ sprintf (prompt, startup_options_prompt, oldpath, oldprefix);
+ if (ask_uint (prompt, 0, 11, 0, &choice, 10) < 0) return -1;
switch (choice) {
case 0: return 0;
case 1: askparam (BXP_LOG_FILENAME); break;
- case 2: bx_log_options (0); break;
- case 3: bx_log_options (1); break;
- case 4: do_menu (BXP_MENU_MEMORY); break;
- case 5: do_menu (BXP_MENU_INTERFACE); break;
- case 6: do_menu (BXP_MENU_DISK); break;
- case 7: do_menu (BXP_MENU_SERIAL_PARALLEL); break;
- case 8: do_menu (BXP_SB16); break;
- case 9: do_menu (BXP_NE2K); break;
- case 10: do_menu (BXP_MENU_MISC); break;
+ case 2: askparam (BXP_LOG_PREFIX); break;
+ case 3: bx_log_options (0); break;
+ case 4: bx_log_options (1); break;
+ case 5: do_menu (BXP_MENU_MEMORY); break;
+ case 6: do_menu (BXP_MENU_INTERFACE); break;
+ case 7: do_menu (BXP_MENU_DISK); break;
+ case 8: do_menu (BXP_MENU_SERIAL_PARALLEL); break;
+ case 9: do_menu (BXP_SB16); break;
+ case 10: do_menu (BXP_NE2K); break;
+ case 11: do_menu (BXP_MENU_MISC); break;
default: BAD_OPTION(menu, choice);
}
}
Index: gui/siminterface.h
===================================================================
RCS file: /cvsroot/bochs/bochs/gui/siminterface.h,v
retrieving revision 1.37
diff -u -r1.37 siminterface.h
--- gui/siminterface.h 2 May 2002 07:54:22 -0000 1.37
+++ gui/siminterface.h 26 Jun 2002 14:39:44 -0000
@@ -103,6 +103,7 @@
BXP_I440FX_SUPPORT,
BXP_NEWHARDDRIVESUPPORT,
BXP_LOG_FILENAME,
+ BXP_LOG_PREFIX,
BXP_CMOS_PATH,
BXP_CMOS_IMAGE,
BXP_CMOS_TIME0,
@@ -596,6 +597,8 @@
virtual int write_rc (char *rc, int overwrite) {return -1;}
virtual int get_log_file (char *path, int len) {return -1;}
virtual int set_log_file (char *path) {return -1;}
+ virtual int get_log_prefix (char *prefix, int len) {return -1;}
+ virtual int set_log_prefix (char *prefix) {return -1;}
virtual int get_floppy_options (int drive, bx_floppy_options *out) {return -1;}
virtual int get_cdrom_options (int drive, bx_cdrom_options *out) {return -1;}
virtual char *get_floppy_type_name (int type) {return NULL;}
Index: gui/siminterface.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/gui/siminterface.cc,v
retrieving revision 1.41
diff -u -r1.41 siminterface.cc
--- gui/siminterface.cc 23 Apr 2002 07:44:34 -0000 1.41
+++ gui/siminterface.cc 26 Jun 2002 14:39:44 -0000
@@ -69,6 +69,8 @@
virtual int write_rc (char *path, int overwrite);
virtual int get_log_file (char *path, int len);
virtual int set_log_file (char *path);
+ virtual int get_log_prefix (char *prefix, int len);
+ virtual int set_log_prefix (char *prefix);
virtual int get_floppy_options (int drive, bx_floppy_options *out);
virtual int get_cdrom_options (int drive, bx_cdrom_options *out);
virtual char *get_floppy_type_name (int type);
@@ -290,6 +292,20 @@
bx_real_sim_c::set_log_file (char *path)
{
bx_options.log.Ofilename->set (path);
+ return 0;
+}
+
+int
+bx_real_sim_c::get_log_prefix (char *prefix, int len)
+{
+ strncpy (prefix, bx_options.log.Oprefix->getptr (), len);
+ return 0;
+}
+
+int
+bx_real_sim_c::set_log_prefix (char *prefix)
+{
+ bx_options.log.Oprefix->set (prefix);
return 0;
}
if(prefix != NULL)
fprintf(logfd, "%s ", prefix);