[SeaBIOS] MINIX 3.1.6 works in QEMU-0.12.3 only with KVM disabled

Kevin O'Connor kevin at koconnor.net
Tue Mar 16 00:37:56 CET 2010


On Mon, Mar 15, 2010 at 04:28:02PM +0100, Antoine Leca wrote:
> http://bochs.sourceforge.net/cgi-bin/lxr/source/bios/rombios.c has:
[...]
> 3660       ;; make sure DS and ES limits are 64KB
> 3661       mov ax, #0x28
> 3662       mov ds, ax
> 3663       mov es, ax
[...]
> In SeaBIOS, the applicable code is in src/system.c, and looks like
[...]
> Note that while the basic scheme is the same, the "cleaning up" of lines
> 3660-3663 "make sure DS and ES limits are 64KB" is not present.

That does appear to be a SeaBIOS error.  I'll commit a fix (see
below).

[...]
> >> (qemu) info registers
> >> EIP=0000f4a7 EFL=00023002 [-------] CPL=3 II=0 A20=1 SMM=0 HLT=0
> >> ES =0000 00000000 0000ffff 0000f300
> >> CS =f000 000f0000 0000ffff 0000f300
> >> SS =9492 00094920 0000ffff 0000f300
> >> DS =97ce 00097cec 0000ffff 0000f300
> >
> > A ds.base of 0x97cec cannot be translated to a real mode segment.

However, it's not clear why it would make a difference.  The segment
limit is shown as 0xffff here - it's the segment base which is not
aligned.  On return to real mode, the segment base should have been
reloaded..

-Kevin


--- a/src/system.c
+++ b/src/system.c
@@ -143,6 +143,11 @@ handle_1587(struct bregs *regs)
         "  xorw %%di, %%di\n"
         "  rep movsw\n"
 
+        // Restore DS and ES segment limits to 0xffff
+        "  movw $(5<<3), %%ax\n" // 5th descriptor in table (SS)
+        "  movw %%ax, %%ds\n"
+        "  movw %%ax, %%es\n"
+
         // Disable protected mode
         "  movl %%cr0, %%eax\n"
         "  andl $~" __stringify(CR0_PE) ", %%eax\n"



More information about the SeaBIOS mailing list