From 96850d8bb40e282217776e17977dd8ac10d0d10f Mon Sep 17 00:00:00 2001 From: Sigrid Date: Tue, 8 Dec 2020 10:01:44 +0100 Subject: [PATCH] vmx: add -D option to enable debug messages, use vmdebug for non-fatal "errors" --- sys/man/1/vmx | 6 ++++++ sys/src/cmd/vmx/exith.c | 6 +++--- sys/src/cmd/vmx/fns.h | 2 +- sys/src/cmd/vmx/io.c | 6 +++--- sys/src/cmd/vmx/vga.c | 14 +++++++------- sys/src/cmd/vmx/vmx.c | 25 +++++++++++++++++++++++-- 6 files changed, 43 insertions(+), 16 deletions(-) diff --git a/sys/man/1/vmx b/sys/man/1/vmx index fef51735c..ac07769f8 100644 --- a/sys/man/1/vmx +++ b/sys/man/1/vmx @@ -4,6 +4,9 @@ vmx \- virtual PC .SH SYNOPSIS .B vmx [ +.B -D +] +[ .B -M .I mem ] @@ -58,6 +61,9 @@ Boot modules can be specified with the .B -m argument. .PP +.B -D +enables debug messages. +.PP If .B -v is specified, a graphics device, PS/2 keyboard and mouse are simulated. diff --git a/sys/src/cmd/vmx/exith.c b/sys/src/cmd/vmx/exith.c index a96646294..1a6afc634 100644 --- a/sys/src/cmd/vmx/exith.c +++ b/sys/src/cmd/vmx/exith.c @@ -294,7 +294,7 @@ cpuid(ExitInfo *ei) break; default: if((ax & 0xf0000000) != 0x40000000) - vmerror("unknown cpuid field eax=%#ux", ax); + vmdebug("unknown cpuid field eax=%#ux", ax); zero: ax = cx = 0; break; @@ -327,10 +327,10 @@ rdwrmsr(ExitInfo *ei) break; default: if(rd){ - vmerror("read from unknown MSR %#ux ignored", cx); + vmdebug("read from unknown MSR %#ux ignored", cx); val = 0; }else - vmerror("write to unknown MSR %#ux ignored (val=%#ullx)", cx, val); + vmdebug("write to unknown MSR %#ux ignored (val=%#ullx)", cx, val); break; } if(rd){ diff --git a/sys/src/cmd/vmx/fns.h b/sys/src/cmd/vmx/fns.h index 54c9ef252..61336d83c 100644 --- a/sys/src/cmd/vmx/fns.h +++ b/sys/src/cmd/vmx/fns.h @@ -11,7 +11,7 @@ void pitadvance(void); void rtcadvance(void); void settimer(vlong targ); void vmerror(char *, ...); -#define vmdebug vmerror +void vmdebug(char *, ...); int ctl(char *, ...); void registermmio(uvlong, uvlong, uvlong (*)(int, uvlong, uvlong)); void irqline(int, int); diff --git a/sys/src/cmd/vmx/io.c b/sys/src/cmd/vmx/io.c index 2de8fe605..e3125ab51 100644 --- a/sys/src/cmd/vmx/io.c +++ b/sys/src/cmd/vmx/io.c @@ -726,7 +726,7 @@ kbdcmd(u8int val) case 0xf2: keyputc(0xfa); keyputc(0xab); keyputc(0x41); break; /* keyboard id */ case 0xee: keyputc(0xee); break; /* echo */ default: - vmerror("unknown kbd command %#ux", val); + vmdebug("unknown kbd command %#ux", val); keyputc(0xfe); } } @@ -1203,9 +1203,9 @@ u32int iowhine(int isin, u16int port, u32int val, int sz, void *mod) { if(isin) - vmerror("%s%sread from unknown i/o port %#ux ignored (sz=%d, pc=%#ullx)", mod != nil ? mod : "", mod != nil ? ": " : "", port, sz, rget(RPC)); + vmdebug("%s%sread from unknown i/o port %#ux ignored (sz=%d, pc=%#ullx)", mod != nil ? mod : "", mod != nil ? ": " : "", port, sz, rget(RPC)); else - vmerror("%s%swrite to unknown i/o port %#ux ignored (val=%#ux, sz=%d, pc=%#ullx)", mod != nil ? mod : "", mod != nil ? ": " : "", port, val, sz, rget(RPC)); + vmdebug("%s%swrite to unknown i/o port %#ux ignored (val=%#ux, sz=%d, pc=%#ullx)", mod != nil ? mod : "", mod != nil ? ": " : "", port, val, sz, rget(RPC)); return -1; } diff --git a/sys/src/cmd/vmx/vga.c b/sys/src/cmd/vmx/vga.c index eea5c8deb..b59eb44a1 100644 --- a/sys/src/cmd/vmx/vga.c +++ b/sys/src/cmd/vmx/vga.c @@ -178,7 +178,7 @@ vgaio(int isin, u16int port, u32int val, int sz, void *) switch(vga.sidx){ case 0: vga.seq[vga.sidx] = val & 3; return 0; case 4: vga.seq[vga.sidx] = val & 0xe; return 0; - default: vmerror("vga: write to unknown sequencer register %#ux (val=%#ux)", vga.sidx, val); return 0; + default: vmdebug("vga: write to unknown sequencer register %#ux (val=%#ux)", vga.sidx, val); return 0; } case 0x3c6: return 0; case 0x3c7: vga.rdidx = val << 2; return 0; @@ -194,7 +194,7 @@ vgaio(int isin, u16int port, u32int val, int sz, void *) case 4: vga.graph[vga.gidx] = val & 3; break; case 8: vga.graph[vga.gidx] = val; break; default: - vmerror("vga: write to unknown graphics register %#ux (val=%#ux)", vga.gidx, val); + vmdebug("vga: write to unknown graphics register %#ux (val=%#ux)", vga.gidx, val); } return 0; case 0x3d4: vga.cidx = val; return 0; @@ -204,7 +204,7 @@ vgaio(int isin, u16int port, u32int val, int sz, void *) vga.crtc[vga.cidx] = val; return 0; default: - vmerror("vga: write to unknown CRTC register %#ux (val=%#ux)", vga.cidx, val); + vmdebug("vga: write to unknown CRTC register %#ux (val=%#ux)", vga.cidx, val); } return 0; case 0x103c0: return vga.aidx & 0x3f; @@ -215,7 +215,7 @@ vgaio(int isin, u16int port, u32int val, int sz, void *) case 0: case 4: return vga.seq[vga.sidx]; - default: vmerror("vga: read from unknown sequencer register %#ux (val=%#ux)", vga.sidx, val); return 0; + default: vmdebug("vga: read from unknown sequencer register %#ux (val=%#ux)", vga.sidx, val); return 0; } case 0x103c6: return 0xff; case 0x103c7: return vga.rdidx >> 2; @@ -232,7 +232,7 @@ vgaio(int isin, u16int port, u32int val, int sz, void *) case 8: return vga.graph[vga.gidx]; default: - vmerror("vga: read from unknown graphics register %#ux", vga.gidx); + vmdebug("vga: read from unknown graphics register %#ux", vga.gidx); return 0; } case 0x103d4: return vga.cidx; @@ -241,7 +241,7 @@ vgaio(int isin, u16int port, u32int val, int sz, void *) case 10: case 11: case 12: case 13: case 14: case 15: return vga.crtc[vga.cidx]; default: - vmerror("vga: read from unknown CRTC register %#ux", vga.cidx); + vmdebug("vga: read from unknown CRTC register %#ux", vga.cidx); return 0; } case 0x103ca: @@ -374,7 +374,7 @@ keyproc(void *) nkdown[k->code >> 6] |= 1ULL<<(k->code&63); break; } - if(k == nil) vmerror("unknown key %d", r); + if(k == nil) vmdebug("unknown key %d", r); } if(mousegrab && (nkdown[0]>>29 & 1) != 0 && (nkdown[0]>>56 & 1) != 0){ mousegrab = 0; diff --git a/sys/src/cmd/vmx/vmx.c b/sys/src/cmd/vmx/vmx.c index 64536c522..8b71ecfd1 100644 --- a/sys/src/cmd/vmx/vmx.c +++ b/sys/src/cmd/vmx/vmx.c @@ -11,7 +11,7 @@ Region *mmap; int ctlfd, regsfd, mapfd, waitfd; Channel *waitch, *sleepch, *notifch; enum { MSEC = 1000*1000, MinSleep = MSEC, SleeperPoll = 2000*MSEC } ; -int getexit, state; +int getexit, state, debug; typedef struct VmxNotif VmxNotif; struct VmxNotif { void (*f)(void *); @@ -48,6 +48,23 @@ vmerror(char *fmt, ...) fmtfdflush(&f); } +void +vmdebug(char *fmt, ...) +{ + Fmt f; + char buf[256]; + va_list arg; + + if(debug == 0) + return; + fmtfdinit(&f, 2, buf, sizeof buf); + va_start(arg, fmt); + fmtvprint(&f, fmt, arg); + va_end(arg); + fmtprint(&f, "\n"); + fmtfdflush(&f); +} + int ctl(char *fmt, ...) { @@ -599,7 +616,8 @@ threadmain(int argc, char **argv) waitch = chancreate(sizeof(char *), 32); sleepch = chancreate(sizeof(ulong), 32); notifch = chancreate(sizeof(VmxNotif), 16); - + debug = 0; + ARGBEGIN { case 'm': bootmod = realloc(bootmod, (bootmodn + 1) * sizeof(char *)); @@ -634,6 +652,9 @@ threadmain(int argc, char **argv) } edevn++; break; + case 'D': + debug++; + break; case 'M': gmemsz = siparse(EARGF(usage())); if(gmemsz != (uintptr) gmemsz) sysfatal("too much memory for address space");