[SeaBIOS] [PATCH 0/7] vgabios improvements

Kevin O'Connor kevin at koconnor.net
Wed Apr 16 18:37:56 CEST 2014

On Mon, Apr 14, 2014 at 02:22:51PM +0200, Gerd Hoffmann wrote:
> So you can try this:
> qemu -vga std -bios /usr/share/coreboot.git/coreboot-i440fx-seabios.rom
> to see it live in action.
> Two problems spotted so far:
>   (1) ipxe hangs at rom load time.
>       can be worked around by adding '-net none' to the qemu cmd line.

I've reproduced this.  It only fails for me with -enable-kvm.  It was
(as I feared) the result of segment limits getting trashed from the
int 1587 call.  (Presumably, qemu tcg doesn't fail because it doesn't
implement segment limits?)  The (incorrect) patch below enables the
boot to proceed past the ipxe prompt.

This is unfortunate.  I can put a hack into seabios (not seavgabios)
to use bigreal mode for int 1587 calls during option rom execution.
But, it does raise the question of how many other callers expect the
bios to not mess with the segment limits.  (Though, to be honest, the
only goal I have with coreboot native seavgabios is support for grub,
lilo, syslinux, and maybe ntldr.)


--- a/src/system.c
+++ b/src/system.c
@@ -115,11 +115,11 @@ handle_1587(struct bregs *regs)
     SET_FARVAR(gdt_seg, gdt_far[1], GDT_DATA | GDT_LIMIT((6*sizeof(u64))-1)
                | GDT_BASE(loc));
     // Initialize CS descriptor
-    SET_FARVAR(gdt_seg, gdt_far[4], GDT_CODE | GDT_LIMIT(BUILD_BIOS_SIZE-1)
+    SET_FARVAR(gdt_seg, gdt_far[4], GDT_CODE | GDT_GRANLIMIT(0xffffffff)
                | GDT_BASE(BUILD_BIOS_ADDR));
     // Initialize SS descriptor
     loc = (u32)MAKE_FLATPTR(GET_SEG(SS), 0);
-    SET_FARVAR(gdt_seg, gdt_far[5], GDT_DATA | GDT_LIMIT(0x0ffff)
+    SET_FARVAR(gdt_seg, gdt_far[5], GDT_DATA | GDT_GRANLIMIT(0xffffffff)
                | GDT_BASE(loc));
     u16 count = regs->cx;

More information about the SeaBIOS mailing list