From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:58995) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QWtMv-00006J-0n for qemu-devel@nongnu.org; Wed, 15 Jun 2011 12:55:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QWtMq-0003ix-P1 for qemu-devel@nongnu.org; Wed, 15 Jun 2011 12:55:04 -0400 Received: from mail-qw0-f45.google.com ([209.85.216.45]:46658) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QWtMq-0003iq-9s for qemu-devel@nongnu.org; Wed, 15 Jun 2011 12:55:00 -0400 Received: by qwj8 with SMTP id 8so350534qwj.4 for ; Wed, 15 Jun 2011 09:54:59 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: References: <4DEDE627.1070907@redhat.com> From: Blue Swirl Date: Wed, 15 Jun 2011 19:54:39 +0300 Message-ID: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH] Command line support for altering the log file location List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Matthew Fernandez Cc: Kevin Wolf , Anthony Liguori , qemu-devel@nongnu.org Thanks, applied. On Wed, Jun 8, 2011 at 5:32 AM, Matthew Fernandez wrote: > Add command line support for logging to a location other than /tmp/qemu.l= og. > > With logging enabled (command line option -d), the log is written to > the hard-coded path /tmp/qemu.log. This patch adds support for writing > the log to a different location by passing the -D option. > > Signed-off-by: Matthew Fernandez > ---- > > Thanks Kevin and Blue Swirl for the feedback. Amended patch is below. > On 7 June 2011 18:49, Kevin Wolf wrote: >> Am 05.06.2011 02:46, schrieb Matthew Fernandez: >>> So, to clarify, all text above the '----' is included as the commit >>> message and the sign off line should be in this section. All text >>> below the '----' before the first diff is treated as comments that are >>> not to be committed. Is this correct? If so I'll send through an >>> ammended patch with these changes. >> >> Yes, this is correct. >> >> Kevin >> >>> >>> On 4 June 2011 20:18, Blue Swirl wrote: >>>> On Tue, May 31, 2011 at 9:20 AM, Matthew Fernandez >>>> wrote: >>>>> Hi, >>>>> >>>>> The included patch adds command line support for logging to a locatio= n >>>>> other than /tmp/qemu.log. The diff is relative to commit >>>>> 2eb9f241824d000fcd90bd7f4b49e40b88e62975. Please let me know if >>>>> anything needs to be cleaned up or changed. Anthony, I'm not sure who >>>>> should be responsible for reviewing/accepting this, but I've CCed you >>>>> as it touches vl.c. >>>> >>>> The patch looks OK, however the above text (which git-am would use as >>>> the commit message) needs to be changed. How about something like >>>> this: >>>> Add command line support for logging to a location other than /tmp/qem= u.log. >>>> >>>> If you want to add comments which should not go to the commit message, >>>> please put them below the line with '----'. >>>> >>>>> Thanks, >>>>> Matthew >>>>> >>>>> ---- >>>>> Signed-off-by: Matthew Fernandez >>>> >>>> Also this needs to be above the =C2=A0'----' line. > > > > diff --git a/bsd-user/main.c b/bsd-user/main.c > index 0c3fca1..0af8a7e 100644 > --- a/bsd-user/main.c > +++ b/bsd-user/main.c > @@ -690,7 +690,8 @@ static void usage(void) > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"-bsd type =C2=A0 =C2=A0 =C2=A0 = =C2=A0 select emulated BSD type > FreeBSD/NetBSD/OpenBSD (default)\n" > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"\n" > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"Debug options:\n" > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "-d options =C2=A0 activate log (log= file=3D%s)\n" > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "-d options =C2=A0 activate log (def= ault logfile=3D%s)\n" > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "-D logfile =C2=A0 override default = logfile location\n" > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"-p pagesize =C2=A0set the host = page size to 'pagesize'\n" > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"-singlestep =C2=A0always run in= singlestep mode\n" > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"-strace =C2=A0 =C2=A0 =C2=A0log= system calls\n" > @@ -731,6 +732,8 @@ int main(int argc, char **argv) > =C2=A0{ > =C2=A0 =C2=A0 const char *filename; > =C2=A0 =C2=A0 const char *cpu_model; > + =C2=A0 =C2=A0const char *log_file =3D DEBUG_LOGFILE; > + =C2=A0 =C2=A0const char *log_mask =3D NULL; > =C2=A0 =C2=A0 struct target_pt_regs regs1, *regs =3D ®s1; > =C2=A0 =C2=A0 struct image_info info1, *info =3D &info1; > =C2=A0 =C2=A0 TaskState ts1, *ts =3D &ts1; > @@ -745,9 +748,6 @@ int main(int argc, char **argv) > =C2=A0 =C2=A0 if (argc <=3D 1) > =C2=A0 =C2=A0 =C2=A0 =C2=A0 usage(); > > - =C2=A0 =C2=A0/* init debug */ > - =C2=A0 =C2=A0cpu_set_log_filename(DEBUG_LOGFILE); > - > =C2=A0 =C2=A0 if ((envlist =3D envlist_create()) =3D=3D NULL) { > =C2=A0 =C2=A0 =C2=A0 =C2=A0 (void) fprintf(stderr, "Unable to allocate en= vlist\n"); > =C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > @@ -775,22 +775,15 @@ int main(int argc, char **argv) > =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!strcmp(r, "-")) { > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else if (!strcmp(r, "d")) { > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int mask; > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0const CPULogItem *item; > - > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (optind >=3D argc) > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (optind >=3D argc) { > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break; > - > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0r =3D argv[optind++]; > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0mask =3D cpu_str_to_log_mask(r= ); > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!mask) { > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0printf("Log item= s (comma separated):\n"); > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for(item =3D cpu= _log_items; item->mask !=3D 0; item++) { > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pr= intf("%-10s %s\n", item->name, item->help); > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0exit(1); > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0cpu_set_log(mask); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0log_mask =3D argv[optind++]; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0} else if (!strcmp(r, "D")) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (optind >=3D argc) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0log_file =3D argv[optind++]; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else if (!strcmp(r, "E")) { > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 r =3D argv[optind++]; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (envlist_setenv(envlist, r) = !=3D 0) > @@ -867,6 +860,23 @@ int main(int argc, char **argv) > =C2=A0 =C2=A0 =C2=A0 =C2=A0 usage(); > =C2=A0 =C2=A0 filename =3D argv[optind]; > > + =C2=A0 =C2=A0/* init debug */ > + =C2=A0 =C2=A0cpu_set_log_filename(log_file); > + =C2=A0 =C2=A0if (log_mask) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0int mask; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0const CPULogItem *item; > + > + =C2=A0 =C2=A0 =C2=A0 =C2=A0mask =3D cpu_str_to_log_mask(r); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!mask) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0printf("Log items (comma separ= ated):\n"); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for (item =3D cpu_log_items; i= tem->mask !=3D 0; item++) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0printf("%-10s %s= \n", item->name, item->help); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0exit(1); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0} > + =C2=A0 =C2=A0 =C2=A0 =C2=A0cpu_set_log(mask); > + =C2=A0 =C2=A0} > + > =C2=A0 =C2=A0 /* Zero out regs */ > =C2=A0 =C2=A0 memset(regs, 0, sizeof(struct target_pt_regs)); > > diff --git a/cpus.c b/cpus.c > index 1fc34b7..17e96b5 100644 > --- a/cpus.c > +++ b/cpus.c > @@ -1142,6 +1142,11 @@ void set_cpu_log(const char *optarg) > =C2=A0 =C2=A0 cpu_set_log(mask); > =C2=A0} > > +void set_cpu_log_filename(const char *optarg) > +{ > + =C2=A0 =C2=A0cpu_set_log_filename(optarg); > +} > + > =C2=A0/* Return the virtual CPU time, based on the instruction counter. = =C2=A0*/ > =C2=A0int64_t cpu_get_icount(void) > =C2=A0{ > diff --git a/cpus.h b/cpus.h > index 6fdeb0d..f42b54e 100644 > --- a/cpus.h > +++ b/cpus.h > @@ -19,6 +19,7 @@ void vm_state_notify(int running, int reason); > =C2=A0bool cpu_exec_all(void); > =C2=A0void set_numa_modes(void); > =C2=A0void set_cpu_log(const char *optarg); > +void set_cpu_log_filename(const char *optarg); > =C2=A0void list_cpus(FILE *f, fprintf_function cpu_fprintf, const char *o= ptarg); > > =C2=A0#endif > diff --git a/darwin-user/main.c b/darwin-user/main.c > index 175e12f..a6dc859 100644 > --- a/darwin-user/main.c > +++ b/darwin-user/main.c > @@ -738,6 +738,8 @@ TaskState *first_task_state; > =C2=A0int main(int argc, char **argv) > =C2=A0{ > =C2=A0 =C2=A0 const char *filename; > + =C2=A0 =C2=A0const char *log_file =3D DEBUG_LOGFILE; > + =C2=A0 =C2=A0const char *log_mask =3D NULL; > =C2=A0 =C2=A0 struct target_pt_regs regs1, *regs =3D ®s1; > =C2=A0 =C2=A0 TaskState ts1, *ts =3D &ts1; > =C2=A0 =C2=A0 CPUState *env; > @@ -749,9 +751,6 @@ int main(int argc, char **argv) > =C2=A0 =C2=A0 if (argc <=3D 1) > =C2=A0 =C2=A0 =C2=A0 =C2=A0 usage(); > > - =C2=A0 =C2=A0/* init debug */ > - =C2=A0 =C2=A0cpu_set_log_filename(DEBUG_LOGFILE); > - > =C2=A0 =C2=A0 optind =3D 1; > =C2=A0 =C2=A0 for(;;) { > =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (optind >=3D argc) > @@ -764,22 +763,15 @@ int main(int argc, char **argv) > =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!strcmp(r, "-")) { > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else if (!strcmp(r, "d")) { > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int mask; > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0CPULogItem *item; > - > - =C2=A0 =C2=A0 =C2=A0 =C2=A0if (optind >=3D argc) > - =C2=A0 =C2=A0 =C2=A0 =C2=A0break; > - > - =C2=A0 =C2=A0 =C2=A0 =C2=A0r =3D argv[optind++]; > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0mask =3D cpu_str_to_log_mask(r= ); > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!mask) { > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0printf("Log item= s (comma separated):\n"); > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for(item =3D cpu= _log_items; item->mask !=3D 0; item++) { > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pr= intf("%-10s %s\n", item->name, item->help); > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0exit(1); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (optind >=3D argc) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0cpu_set_log(mask); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0log_mask =3D argv[optind++]; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0} else if (!strcmp(r, "D")) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (optind >=3D argc) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0log_file =3D argv[optind++]; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else if (!strcmp(r, "s")) { > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 r =3D argv[optind++]; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 stack_size =3D strtol(r, (char = **)&r, 0); > @@ -821,6 +813,23 @@ int main(int argc, char **argv) > =C2=A0 =C2=A0 =C2=A0 =C2=A0 usage(); > =C2=A0 =C2=A0 filename =3D argv[optind]; > > + =C2=A0 =C2=A0/* init debug */ > + =C2=A0 =C2=A0cpu_set_log_filename(log_file); > + =C2=A0 =C2=A0if (log_mask) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0int mask; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0CPULogItem *item; > + > + =C2=A0 =C2=A0 =C2=A0 =C2=A0mask =3D cpu_str_to_log_mask(r); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!mask) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0printf("Log items (comma separ= ated):\n"); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for (item =3D cpu_log_items; i= tem->mask !=3D 0; item++) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0printf("%-10s %s= \n", item->name, item->help); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0exit(1); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0} > + =C2=A0 =C2=A0 =C2=A0 =C2=A0cpu_set_log(mask); > + =C2=A0 =C2=A0} > + > =C2=A0 =C2=A0 /* Zero out regs */ > =C2=A0 =C2=A0 memset(regs, 0, sizeof(struct target_pt_regs)); > > diff --git a/linux-user/main.c b/linux-user/main.c > index 088def3..23c229c 100644 > --- a/linux-user/main.c > +++ b/linux-user/main.c > @@ -2848,6 +2848,8 @@ int main(int argc, char **argv, char **envp) > =C2=A0{ > =C2=A0 =C2=A0 const char *filename; > =C2=A0 =C2=A0 const char *cpu_model; > + =C2=A0 =C2=A0const char *log_file =3D DEBUG_LOGFILE; > + =C2=A0 =C2=A0const char *log_mask =3D NULL; > =C2=A0 =C2=A0 struct target_pt_regs regs1, *regs =3D ®s1; > =C2=A0 =C2=A0 struct image_info info1, *info =3D &info1; > =C2=A0 =C2=A0 struct linux_binprm bprm; > @@ -2869,9 +2871,6 @@ int main(int argc, char **argv, char **envp) > > =C2=A0 =C2=A0 qemu_cache_utils_init(envp); > > - =C2=A0 =C2=A0/* init debug */ > - =C2=A0 =C2=A0cpu_set_log_filename(DEBUG_LOGFILE); > - > =C2=A0 =C2=A0 if ((envlist =3D envlist_create()) =3D=3D NULL) { > =C2=A0 =C2=A0 =C2=A0 =C2=A0 (void) fprintf(stderr, "Unable to allocate en= vlist\n"); > =C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > @@ -2910,22 +2909,15 @@ int main(int argc, char **argv, char **envp) > =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!strcmp(r, "-")) { > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else if (!strcmp(r, "d")) { > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int mask; > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0const CPULogItem *item; > - > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (optind >=3D argc) > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (optind >=3D argc) { > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break; > - > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 r =3D argv[optind++]; > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0mask =3D cpu_str_to_log_mask(r= ); > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!mask) { > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0printf("Log item= s (comma separated):\n"); > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for(item =3D cpu= _log_items; item->mask !=3D 0; item++) { > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pr= intf("%-10s %s\n", item->name, item->help); > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0exit(1); > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0cpu_set_log(mask); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0log_mask =3D argv[optind++]; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0} else if (!strcmp(r, "D")) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (optind >=3D argc) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0log_file =3D argv[optind++]; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else if (!strcmp(r, "E")) { > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 r =3D argv[optind++]; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (envlist_setenv(envlist, r) = !=3D 0) > @@ -3038,6 +3030,23 @@ int main(int argc, char **argv, char **envp) > =C2=A0 =C2=A0 filename =3D argv[optind]; > =C2=A0 =C2=A0 exec_path =3D argv[optind]; > > + =C2=A0 =C2=A0/* init debug */ > + =C2=A0 =C2=A0cpu_set_log_filename(log_file); > + =C2=A0 =C2=A0if (log_mask) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0int mask; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0const CPULogItem *item; > + > + =C2=A0 =C2=A0 =C2=A0 =C2=A0mask =3D cpu_str_to_log_mask(r); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!mask) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0printf("Log items (comma separ= ated):\n"); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for (item =3D cpu_log_items; i= tem->mask !=3D 0; item++) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0printf("%-10s %s= \n", item->name, item->help); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0exit(1); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0} > + =C2=A0 =C2=A0 =C2=A0 =C2=A0cpu_set_log(mask); > + =C2=A0 =C2=A0} > + > =C2=A0 =C2=A0 /* Zero out regs */ > =C2=A0 =C2=A0 memset(regs, 0, sizeof(struct target_pt_regs)); > > diff --git a/qemu-options.hx b/qemu-options.hx > index 82e085a..05513e8 100644 > --- a/qemu-options.hx > +++ b/qemu-options.hx > @@ -1991,6 +1991,15 @@ STEXI > =C2=A0Output log in /tmp/qemu.log > =C2=A0ETEXI > > +DEF("D", HAS_ARG, QEMU_OPTION_D, \ > + =C2=A0 =C2=A0"-D logfile =C2=A0 =C2=A0 =C2=A0output log to logfile (ins= tead of the default > /tmp/qemu.log)\n", > + =C2=A0 =C2=A0QEMU_ARCH_ALL) > +STEXI > +@item -D > +@findex -D > +Output log in logfile instead of /tmp/qemu.log > +ETEXI > + > =C2=A0DEF("hdachs", HAS_ARG, QEMU_OPTION_hdachs, \ > =C2=A0 =C2=A0 "-hdachs c,h,s[,t]\n" \ > =C2=A0 =C2=A0 " =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fo= rce hard disk 0 physical geometry and the > optional BIOS\n" \ > diff --git a/vl.c b/vl.c > index b362871..e459f64 100644 > --- a/vl.c > +++ b/vl.c > @@ -2060,6 +2060,8 @@ int main(int argc, char **argv, char **envp) > =C2=A0#endif > =C2=A0 =C2=A0 int defconfig =3D 1; > =C2=A0 =C2=A0 const char *trace_file =3D NULL; > + =C2=A0 =C2=A0const char *log_mask =3D NULL; > + =C2=A0 =C2=A0const char *log_file =3D NULL; > > =C2=A0 =C2=A0 atexit(qemu_run_exit_notifiers); > =C2=A0 =C2=A0 error_set_progname(argv[0]); > @@ -2434,7 +2436,10 @@ int main(int argc, char **argv, char **envp) > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break; > =C2=A0#endif > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case QEMU_OPTION_d: > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0set_cpu_log(opta= rg); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0log_mask =3D opt= arg; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case QEMU_OPTION_D: > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0log_file =3D opt= arg; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case QEMU_OPTION_s: > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 gdbstub_dev =3D "= tcp::" DEFAULT_GDBSTUB_PORT; > @@ -2900,6 +2905,18 @@ int main(int argc, char **argv, char **envp) > =C2=A0 =C2=A0 } > =C2=A0 =C2=A0 loc_set_none(); > > + =C2=A0 =C2=A0/* Open the logfile at this point, if necessary. We can't = open the logfile > + =C2=A0 =C2=A0 * when encountering either of the logging options (-d or = -D) because the > + =C2=A0 =C2=A0 * other one may be encountered later on the command line,= changing the > + =C2=A0 =C2=A0 * location or level of logging. > + =C2=A0 =C2=A0 */ > + =C2=A0 =C2=A0if (log_mask) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (log_file) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0set_cpu_log_filename(log_file)= ; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0} > + =C2=A0 =C2=A0 =C2=A0 =C2=A0set_cpu_log(log_mask); > + =C2=A0 =C2=A0} > + > =C2=A0 =C2=A0 if (!st_init(trace_file)) { > =C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "warning: unable to initializ= e simple trace > backend\n"); > =C2=A0 =C2=A0 } >