X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=util%2Fvgabios%2Ftestbios.c;h=c12e72187e4289321714f0d30baddf31c0efc037;hb=4a2daf6a99dcdcf177bf9e0d630fec8b5b65ca30;hp=541f4605889b5b7771a53b33960b1972f13487d3;hpb=284c27f29971326bd786e89c1ceb3f51a53203db;p=coreboot.git diff --git a/util/vgabios/testbios.c b/util/vgabios/testbios.c index 541f46058..c12e72187 100644 --- a/util/vgabios/testbios.c +++ b/util/vgabios/testbios.c @@ -5,11 +5,13 @@ #include #include #include +#include #define die(x) { perror(x); exit(1); } #define warn(x) { perror(x); } -#include +#include +#include "helper_exec.h" #include "test.h" #include "pci-userspace.h" @@ -24,6 +26,8 @@ int intE6_handler(void); void pushw(u16 val); +unsigned short get_device(char *arg_val); + extern int teststart, testend; _ptr p; @@ -76,7 +80,7 @@ void do_int(int num) if (!ret) { printf("\nint%x: not implemented\n", num); - x86emu_dump_xregs(); + //x86emu_dump_xregs(); } } @@ -128,13 +132,13 @@ int main(int argc, char **argv) size_t size = 0; int base = 0; int have_size = 0, have_base = 0, have_ip = 0, have_cs = 0; + int have_devfn = 0; int parse_rom = 0; char *fsegname = 0; unsigned char *fsegptr; unsigned short initialip = 0, initialcs = 0, devfn = 0; X86EMU_intrFuncs intFuncs[256]; void X86EMU_setMemBase(void *base, size_t size); - void X86EMU_setabseg(void *abseg); void x86emu_dump_xregs(void); int X86EMU_set_debug(int debug); int debugflag = 0; @@ -198,7 +202,8 @@ int main(int argc, char **argv) absegname = optarg; break; case 'd': - devfn = strtol(optarg, 0, 0); + devfn = get_device(optarg); + have_devfn = 1; break; case 'D': debugflag = strtol(optarg, 0, 0); @@ -247,6 +252,22 @@ int main(int argc, char **argv) //printf("Point 1 int%x vector at %x\n", 0x42, getIntVect(0x42)); + if (initialip == 0x0003) { + if ((devfn == 0) || (have_devfn == 0)) { + printf("WARNING! It appears you are trying to run an option ROM.\n"); + printf(" (initial ip = 0x0003)\n"); + if (have_devfn) { + printf(" However, the device you have specified is 0x00\n"); + printf(" It is very unlikely that your device is at this address\n"); + printf(" Please check your -d option\n"); + } + else { + printf(" Please specify a device with -d\n"); + printf(" The default is not likely to work\n"); + } + } + } + if (absegname) { abseg = mapitin(absegname, (off_t) 0xa0000, 0x20000); if (!abseg) @@ -255,7 +276,7 @@ int main(int argc, char **argv) current = &p; X86EMU_setMemBase(biosmem, sizeof(biosmem)); - X86EMU_setabseg(abseg); + M.abseg = (unsigned long)abseg; X86EMU_setupPioFuncs(&myfuncs); ioperm(0, 0x400, 1); @@ -278,6 +299,10 @@ int main(int argc, char **argv) X86EMU_setupIntrFuncs(intFuncs); cp = mapitin(filename, (off_t) 0, size); + if (devfn) { + printf("Loading ax with BusDevFn = %x\n",devfn); + } + current->ax = devfn ? devfn : 0xff; current->dx = 0x80; // current->ip = 0; @@ -317,10 +342,10 @@ int main(int argc, char **argv) if (trace) { printf("Switching to single step mode.\n"); - X86EMU_trace_on(); + //X86EMU_trace_on(); } if (debugflag) { - X86EMU_set_debug(debugflag); + //X86EMU_set_debug(debugflag); } X86EMU_exec(); /* Cleaning up */ @@ -328,3 +353,42 @@ int main(int argc, char **argv) return 0; } + +unsigned short get_device(char *arg_val) +{ + unsigned short devfn=0; + long bus=0,dev=0,fn=0,need_pack=0; + char *tok; + + tok = strsep(&arg_val,":"); + if (arg_val != NULL) { + bus = strtol(tok,0,16); + need_pack = 1; + } + else { + arg_val = tok; + } + + tok = strsep(&arg_val,"."); + if (arg_val != NULL) { + dev = strtol(tok,0,16); + fn = strtol(arg_val,0,16); + need_pack = 1; + } + else { + if (need_pack ==1 && (strlen(tok))) { + dev = strtol(tok,0,16); + } + } + + if ( need_pack == 1) { + devfn = bus<<8 | (dev<<3) | fn; + } + else { + devfn = strtol(tok, 0, 0); + } + + + return devfn; +} +