Just a brief update for those who are interested... the CSM is fairly functional now. I've tested with:
Various Linuxes including CentOS [56], Fedora 17. Windows 7 Windows 2008r2 (via EFI) OpenBSD 5.2 FreeBSD 9 FreeBSD 8 Debian/kFreeBSD (also FBSD 8 kernel I think) DragonflyBSD NetBSD Solaris 10 Solaris 11 OpenIndiana FreeDOS
I think everything is working except a few problems with the ACPI tables that OVMF produces. OpenBSD crashes in its AML interpreter unless I revert OVMF commit r14403.
FreeBSD 9 crashes when assigning PCI interrupts:
pcib0: allocated type 3 (0x82000000-0x8201ffff) for rid 10 of pci0:0:3:0 map[14]: type I/O Port, range 32, base 0xc000, size 6, enabled pcib0: allocated type 4 (0xc000-0xc03f) for rid 14 of pci0:0:3:0 pcib0: matched entry for 0.3.INTA (src _SB_.PCI0.LPC_.LNKC:0)
... and then it just sits there. If I boot with a normal SeaBIOS, it looks like this:
pcib0: allocated type 3 (0xfeba0000-0xfebbffff) for rid 10 of pci0:0:3:0 map[14]: type I/O Port, range 32, base 0xc000, size 6, enabled pcib0: allocated type 4 (0xc000-0xc03f) for rid 14 of pci0:0:3:0 pcib0: matched entry for 0.3.INTA (src _SB_.LNKC:0) pcib0: slot 3 INTA routed to irq 11 via _SB_.LNKC isab0: <PCI-ISA bridge> at device 1.0 on pci0 isa0: <ISA bus> on isab0
... and continues happily.
FreeBSD 8 (and Debian/kFreeBSD) seem to work but keep complaining of a storm of IRQ9, which is the ACPI interrupt.
At this point, I'm fairly much prepared to declare that all of those are Not My Fault™ and that the CSM is basically working.
I'm probably going to look at NV variable storage for OVMF next, using qemu's fw_cfg (which *is* writeable) directly instead of the evil thing it does now with storing a file on the EFI partition. And also fix up the device detection on the OVMF side, and fix the fact that OVMF won't even *ask* the CSM to boot from a virtio or SCSI disk if they exist.