[SeaBIOS] SeaBIOS and Bochs?

Kevin O'Connor kevin at koconnor.net
Wed Feb 15 03:21:20 CET 2012


On Tue, Feb 14, 2012 at 08:44:59PM +0100, Bernd Blaauw wrote:
> I'm stuck with a few questions about applying SeaBIOS to Bochs
> (Windows), hoping someone is willing to give out some helpful hints.
> 
> 1) Can the downloadable v1.6.3 binary directly be used in Bochs, or
> is a recompile needed? Thought I read some docs about MTRR config
> options.

I think you may need to change some config options.  Try enabling
CONFIG_OPTIONROMS_DEPLOYED and disabling CONFIG_MTRR_INIT.  I think
the latest version of Bochs may no longer need one or both of these,
but I'm not sure.  Sebastian may know.

> 2) What minimal system requirements does SeaBIOS put on a virtual
> machine? 80586, 2MB, PCI ? 80386, 1MB, ISA ?

SeaBIOS should work okay with 1MB.  This seems to fail in recent QEMU
versions, but I think that is specific to QEMU.

Retesting seabios with qemu-0.13 - it looks like some regressions made
it into seabios - see attached patch for a fix.  (With patch below, it
works okay for me with qemu-0.13 with "-m 1" option.)

The latest SeaBIOS tip will work on 80386 - the 1.6.3 version requires
a 80586.  I think PCI may be required (to unlock ram).

> 3) Is there an opensource BIOS, usable in Bochs and QEMU, that does
> work with only 1MB RAM assigned to the VM? SeaBIOS fails this.

SeaBIOS should work.  If there are SeaBIOS issues, they should be
fixed.

-Kevin


diff --git a/src/acpi.c b/src/acpi.c
index 107469f..7bc662d 100644
--- a/src/acpi.c
+++ b/src/acpi.c
@@ -496,6 +496,10 @@ static void* build_pcihp(void)
     int i;
 
     u8 *ssdt = malloc_high(sizeof ssdp_pcihp_aml);
+    if (!ssdt) {
+        warn_noalloc();
+        return NULL;
+    }
     memcpy(ssdt, ssdp_pcihp_aml, sizeof ssdp_pcihp_aml);
 
     /* Runtime patching of EJ0: to disable hotplug for a slot,
diff --git a/src/pmm.c b/src/pmm.c
index 82a0b1d..c649fd8 100644
--- a/src/pmm.c
+++ b/src/pmm.c
@@ -214,7 +214,8 @@ malloc_fixupreloc(void)
     int i;
     for (i=0; i<ARRAY_SIZE(Zones); i++) {
         struct zone_s *zone = Zones[i];
-        zone->info->pprev = &zone->info;
+        if (zone->info)
+            zone->info->pprev = &zone->info;
     }
 
     // Add space free'd during relocation in f-segment to ZoneFSeg



More information about the SeaBIOS mailing list