nvramtool: 64bit safe CBFS handling
[coreboot.git] / util / vgabios / testbios.c
index 541f4605889b5b7771a53b33960b1972f13487d3..c12e72187e4289321714f0d30baddf31c0efc037 100644 (file)
@@ -5,11 +5,13 @@
 #include <sys/mman.h>
 #include <fcntl.h>
 #include <getopt.h>
+#include <string.h>
 
 #define die(x) { perror(x); exit(1); }
 #define warn(x) { perror(x);  }
 
-#include <x86emu.h>
+#include <x86emu/x86emu.h>
+#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;
+}
+