[SeaBIOS] [PATCH 0/3] SeaVGABIOS serial console test
Kevin O'Connor
kevin at koconnor.net
Wed Jan 18 16:03:10 CET 2017
On Wed, Jan 18, 2017 at 12:40:24PM +0100, Gerd Hoffmann wrote:
> > After I posted the seavgabios stuff above, it occurred to me that
> > another way to tackle this would be to keep the code in seabios and
> > harden the sercon assembler entry point. Specifically, the assembler
> > code could check that the last mode set wasn't from a vesa mode set
> > call and it could check that calll (vs callw) works.
>
> Additionally we need to hook the sercon code only into a few subcalls,
> and with the exception of 00h (aka set-mode) none of them are useful for
> software which wants program vesa modes. So, yes, I think that could
> work.
One of the BSDs (I think freebsd) uses the x86emu code to emulate the
vgabios at kernel startup. I'm not sure if it only makes vesa calls.
I was thinking a few instructions to test if calll worked would be
sufficient to catch the x86emu case - something like:
pushl $0xffffffff
calll 1f
1:popl %eax
cmpl %eax, $1b
jne running_on_broken_x86emu
> I'll go have a look, starting with old linux xorg+x86emu.
> Do you remember which windows versions have problems too?
The notes at the top of scripts/vgafixup.py have:
# The x86emu code widely used in Linux distributions when running Xorg
# in vesamode is known to have issues with "retl", "leavel", "entryl",
# "leal", and some variants of "calll". This code modifies those
# instructions that are known to be generated by gcc to avoid
# triggering the x86emu bugs.
# It is also known that the Windows vgabios emulator has issues with
# addressing negative offsets to the %esp register. That has been
# worked around by not using the gcc parameter "-fomit-frame-pointer"
# when compiling.
I believe at least WinXP had the esp problem. In addition to the
above at least Vista has the skifree bug (stack can't be in high
memory).
-Kevin
More information about the SeaBIOS
mailing list