diff options
author | Stuart Bennett <stuart@freedesktop.org> | 2009-03-01 18:43:56 +0000 |
---|---|---|
committer | Stuart Bennett <stuart@freedesktop.org> | 2009-03-01 18:48:54 +0000 |
commit | 48fac6ec26280f146ea7a0a70b3fe0a96f8e9874 (patch) | |
tree | 64a782340d805aa09f54c39b059ebdfa957d0a13 | |
parent | 77ca140b5e85ad1b675723daa703e2d3f8708402 (diff) |
-rw-r--r-- | README | 3 | ||||
-rw-r--r-- | nvbiosemu.c | 27 | ||||
-rw-r--r-- | vbtracetool.c | 20 |
3 files changed, 44 insertions, 6 deletions
@@ -12,11 +12,12 @@ Building: Run make Running: -./vbtracetool [-d] [-l] [-r] [-g | -p | -s MODENUMBER | -w] +./vbtracetool [-d] [-l] [-r | -x ROMFILE] [-g | -p | -s MODENUMBER | -w] -d gives trace output *to stderr*. you'll want to redirect that. -l gives IO logging *to stderr*. you'll want to redirect that. -r forces use of the shadow ram bios image + -x forces use of given bios image (inadvisable) -g gets the current display mode number (default) -p posts the card. could induce several seconds of pants cacking with -d. diff --git a/nvbiosemu.c b/nvbiosemu.c index 79c92f0..2278730 100644 --- a/nvbiosemu.c +++ b/nvbiosemu.c @@ -170,7 +170,7 @@ int reload_nv_bios(uintptr_t pcimemaddr) if ((fd = open("/dev/mem", O_RDWR)) == -1) { printf("Can't open /dev/mem\n"); - return 0; + return 1; } printf("Using card memory region at %p\n", (void *)pcimemaddr); @@ -195,3 +195,28 @@ int reload_nv_bios(uintptr_t pcimemaddr) return ret; } + +int reload_bios_from_file(char *romfile) +{ + uint8_t bios[NV_PROM_SIZE]; + FILE *romf; + + if (!(romf = fopen(romfile, "r"))) { + printf("File open failed\n"); + return 1; + } + + fread(bios, NV_PROM_SIZE, 1, romf); + fclose(romf); + + if (!NVValidVBIOS(NULL, bios)) + return 1; + + printf("Loading contents of %s as bios image to be used, unless ^C is hit in next 5s\n", romfile); + sleep(5); + + if (mmap_in_bios(bios)) + return 1; + + return 0; +} diff --git a/vbtracetool.c b/vbtracetool.c index d810f99..b16e03c 100644 --- a/vbtracetool.c +++ b/vbtracetool.c @@ -20,6 +20,7 @@ #include "x86emu.h" extern int reload_nv_bios(uintptr_t pcimemaddr); +extern int reload_bios_from_file(char *romfile); extern void log_nv_io(); int do_set_mode(unsigned mode) @@ -104,9 +105,10 @@ int main(int argc, char *argv[]) struct pci_dev *p; unsigned int c; unsigned int pci_id = 0, pci_vendor; - int opt, debug = 0, mode, op = 'g', opset = 0, nvlog = 0, shadow = 0; + int opt, debug = 0, mode = 3, op = 'g', opset = 0, nvlog = 0, romoverride = 0, shadow = 0; + char *romfile = NULL; - while ((opt = getopt(argc, argv, "dglprs:w")) != -1) { + while ((opt = getopt(argc, argv, "dglprs:wx:")) != -1) { switch (opt) { case 'd': debug = 1; @@ -118,6 +120,7 @@ int main(int argc, char *argv[]) nvlog = 1; break; case 'r': + romoverride++; shadow = 1; break; case 'p': @@ -133,12 +136,16 @@ int main(int argc, char *argv[]) op = 'w'; opset++; break; + case 'x': + romoverride++; + romfile = optarg; + break; default: opset = 2; } } - if (optind < argc || opset > 1) { + if (optind < argc || opset > 1 || romoverride > 1) { printf("eh?\n"); exit(EXIT_FAILURE); } @@ -184,7 +191,12 @@ int main(int argc, char *argv[]) printf("Using card %04x:%04x on %04x\n", pci_vendor, pci_read_word(p, PCI_DEVICE_ID), pci_id); - if (pci_vendor == 0x10de && !shadow) { + if (romfile) { + if (reload_bios_from_file(romfile)) { + printf("Failed to load alternate image, bailing out\n"); + exit(EXIT_FAILURE); + } + } else if (pci_vendor == 0x10de && !shadow) { printf("Nvidia card -- using PROM/PRAMIN BIOS\n"); if (reload_nv_bios(p->base_addr[0])) printf("Failed to load alternate image, proceeding to use PCI ROM\n"); |