summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStuart Bennett <stuart@freedesktop.org>2009-03-01 18:43:56 +0000
committerStuart Bennett <stuart@freedesktop.org>2009-03-01 18:48:54 +0000
commit48fac6ec26280f146ea7a0a70b3fe0a96f8e9874 (patch)
tree64a782340d805aa09f54c39b059ebdfa957d0a13
parent77ca140b5e85ad1b675723daa703e2d3f8708402 (diff)
Add option to read image in from a fileHEADmaster
-rw-r--r--README3
-rw-r--r--nvbiosemu.c27
-rw-r--r--vbtracetool.c20
3 files changed, 44 insertions, 6 deletions
diff --git a/README b/README
index 22d5cd1..476a74a 100644
--- a/README
+++ b/README
@@ -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");