[SeaBIOS] [PATCH v2 00/19] SeaBIOS as Compatibility Support Module for UEFI/OVMF
David Woodhouse
dwmw2 at infradead.org
Wed Feb 6 17:53:29 CET 2013
On Tue, 2013-02-05 at 23:14 -0500, Kevin O'Connor wrote:
> I think the reloc_init() change that I wrote (patch 1) may have been a
> mistake because of the VISIBLE32INIT proliferation that it causes. I
> put together an alternate approach which requires csm_return().
Hm, there is strangeness here.
I disabled CONFIG_RELOCATE_INIT, and I made the Lock call in OVMF's
LegacyRegion code a no-op so it's never actually locking it; just to
eliminate certain classes of problem.
I also fixed your code as follows:
commit debcd72c34a6b8eba91c9157b15422d418fe8868
Author: David Woodhouse <David.Woodhouse at intel.com>
Date: Wed Feb 6 13:25:34 2013 +0000
Fix handle_csm invocation to compensate for BUILD_BIOS_ADDR
Signed-off-by: David Woodhouse <David.Woodhouse at intel.com>
diff --git a/src/csm.c b/src/csm.c
index 473d322..91a1a57 100644
--- a/src/csm.c
+++ b/src/csm.c
@@ -49,7 +49,8 @@ csm_maininit(struct bregs *regs)
regs->ax = 0;
// Return directly to UEFI instead of unwinding stack.
- csm_return(regs);
+ if (CONFIG_RELOCATE_INIT)
+ csm_return(regs);
}
/* Legacy16InitializeYourself */
diff --git a/src/romlayout.S b/src/romlayout.S
index 07d1645..cbe6b1c 100644
--- a/src/romlayout.S
+++ b/src/romlayout.S
@@ -385,7 +385,6 @@ entry_elf:
.code16gcc
EXPORTFUNC entry_csm
- .global csm_return
entry_csm:
// Backup register state
pushfw
@@ -405,15 +404,16 @@ entry_csm:
movw %ax, %ss
movl $BUILD_STACK_ADDR, %esp
- // Jump to 32bit mode and call handle_csm32(bregs)
+ // Jump to 32bit mode and call handle_csm(bregs)
movl $(1f + BUILD_BIOS_ADDR), %edx
jmp transition32
.code32
1: movl %ebx, %eax
- calll _cfunc32flat_handle_csm
+ calll _cfunc32flat_handle_csm - BUILD_BIOS_ADDR
movl $2f, %edx
jmp transition16big
+ .global csm_return
csm_return:
movl %eax, %ebx
movl $2f, %edx
It kind of works. Sometimes. But other times it just locks up in OVMF code at...
handle_csm16 regs 0x0004ffd4 AX=0001
Legacy16UpdateBbs table 480a:0008
MajorVersion 0000
MinorVersion 0000
AcpiTable 00000000
SmbiosTable 00000000
SmbiosTableLength 00000000
DevicePathType 0000
PciIrqMask 0000
NumberE820Entries 0000000c
NumberBbsEntries 00000100
BBsTable 0004a1ea
SmmTable 00000000
OsMemoryAbove1Mb 07a15000
UnconventionalDeviceTable 00000000
handle_csm16 returning AX=0000
enter handle_15:
a=00002401 b=00000008 c=00000000 d=00000003 ds=0000 es=480a ss=4000
si=00000000 di=00000000 bp=00000000 sp=0000ffc6 cs=4f00 ip=0030 f=3002
Buffer: EFI DVD/CDROM
Select Item: 0x19
This is most easily reproduced by pressing a key to enter the boot menu.
And if I add '-d in_asm' or '-enable-kvm' to the qemu command line it's
a lot *less* likely to trigger. I don't think I've *ever* seen it with
KVM enabled in fact... but remember, the whole region should be
*unlocked* so I don't know why.
If I then revert romlayout.S to the version I had in my tree (which
obviously won't work with CONFIG_RELOCATE_INIT but as I said, I turned
that off), everything works fine.
I'm using qemu-system-x86_64 v1.3.0 (the Fedora package).
--
dwmw2
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 6171 bytes
Desc: not available
URL: <http://www.seabios.org/pipermail/seabios/attachments/20130206/8b6c9814/attachment.bin>
More information about the SeaBIOS
mailing list