On Sat, Apr 25, 2009 at 04:01:09PM +0200, Rudolf Marek wrote:
I managed to catch all I/O for init of K8M890 IGP. Attached patch is for http://www.nongnu.org/vgabios/. With a patch one can have a console and some VGA resolutions also might work.
It is just a interesting result.
So, you got the open source vgabios to boot on real hardware. Very nice!
I used libx86 library to catch all IO. It was quite painful until I realize that the emulator cannot handle properly opcodes like
0x66 0xe8 .. .. 0xff 0xff and also mov al,cs:[ebx] which I get caught in Sebios int 15 routine.
Most of SeaBIOS is compiled with gcc. gcc generates regular 32bit code. Then a gnu assembler (gas) hack is used to make that 32bit code run while the processor is in 16bit mode.
As such, I can't think of any way to stop the 0x66/0x67 prefixes - they are inherent to the process.
Those were just directly transformed with bash script to IO calls in patch. The BIOS works, it even sets the memory speed grade, but not the mem size to scratch registers (it uses SeaBIOS VIA vga hooks for this)
It would be nice to port the open source vgabios from bcc to gcc. (Much like what was done with bochs bios/SeaBIOS.) Doing so will make understanding and manipulating the code much easier.
I actually started this 5 months ago - I ported all the assembler to pseudo C code. I realized it was more work than I originally anticipated, and so it stalled.
+mov al, #0x1 +mov dx, #0x3c3 +out dx,al +mov ax, #0x32 +mov dx, #0x3c4 +out dx,ax +mov al, #0x10 +mov dx, #0x3c4 +out dx,al
[...]
I suspect some of these IO accesses would be done by the vgabios anyway - some things like screen clearing and palette selection are standard. Which parts are standard and which parts are via specific is an open question though.
-Kevin