vmrunkernel: just pull the whole 128K smbios in at e0000
authorRonald G. Minnich <rminnich@gmail.com>
Mon, 23 Jan 2017 21:59:58 +0000 (13:59 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 23 Jan 2017 22:43:52 +0000 (17:43 -0500)
I love PCs. The SMBIOS spec certainly seems clear that it
lives at Fxxxx. But some have pointers to Exxxx. Now, we can
get all smart and try to read and rewrite SMBIOS tables and all
but ....

For now, let's be dumb. To get a flash image, on a working machine,
dd if=/dev/mem of=smbios bs=65536 count=2 skip=14

To run it:
vmrunkernel -t smbios etc. etc.etc

vmrunkernel will, given a -t argument, read the whole thing in
starting at e0000. We do not check for it being short: maybe
you have an SMBIOS that's just fine being 0x14000 bytes in size.
We should not presume to consider that an error.

Change-Id: I0626389b5f2f0bf407433c2dd0ccd5fa65888a43
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tests/vmm/vmrunkernel.c

index 3150087..27bb989 100644 (file)
@@ -737,11 +737,28 @@ int main(int argc, char **argv)
        // The low 1m so we can fill in bullshit like ACPI. */
        // And, sorry, due to the STUPID format of the RSDP for now we need the low 1M.
        low1m = mmap((int*)4096, MiB-4096, PROT_READ | PROT_WRITE,
-                    MAP_ANONYMOUS, -1, 0);
+                    MAP_POPULATE | MAP_ANONYMOUS, -1, 0);
        if (low1m != (void *)4096) {
                perror("Unable to mmap low 1m");
                exit(1);
        }
+
+       /* As I understood it, the spec was that SMBIOS
+        * tables live at f0000. We've been finding that
+        * they can have pointers to exxxx. So, for now,
+        * we assume you will take a 128K snapshot of flash
+        * and we'll just splat the whole mess in at
+        * 0xe0000. We can get more sophisticated about
+        * this later if needed. TODO: parse the table,
+        * and make sure that ACPI doesn't trash it.
+        * Although you'll know instantly if that happens
+        * as you'll get dmidecode errors. But it still needs
+        * to be better. */
+       if (smbiostable) {
+               fprintf(stderr, "Using SMBIOS table %s\n", smbiostable);
+               smbios(smbiostable, (void *)0xe0000);
+       }
+
        r = a;
        fprintf(stderr, "install rsdp to %p\n", r);
        *r = rsdp;
@@ -904,17 +921,6 @@ int main(int argc, char **argv)
        cmdline = a;
        a += 4096;
 
-       if (smbiostable) {
-               if (a > (void *)0xf0000) {
-                       fprintf(stderr, "No room for SMBIOS table: current table pointer is %p\n",
-                               a);
-                       exit(1);
-               }
-               a = (void *)0xf0000;
-               fprintf(stderr, "Using SMBIOS table %s\n", smbiostable);
-               a += smbios(smbiostable, a);
-       }
-
        bp->hdr.cmd_line_ptr = (uintptr_t) cmdline;
 
        tsc_freq_khz = get_tsc_freq()/1000;