[SeaBIOS] Running out of space in e/f-segments

Avi Kivity avi at redhat.com
Sun Aug 22 12:37:48 CEST 2010

  On 08/21/2010 09:41 PM, Kevin O'Connor wrote:
> SeaBIOS is coming close to exceeding 128K in size.  Right now, it's
> approximately 107K on qemu with default options and 120K with
> full debugging and all options enabled.
> SeaBIOS currently contends with option roms for space.  Every byte
> that SeaBIOS uses is one less byte available for option roms.  It's
> technically possible for SeaBIOS to exceed 128K, but it's likely that
> we'll start seeing option roms not fitting around that point.
> It would also be nice to be able to do malloc_low allocations from the
> e-segment.  This too requires freeing up space that SeaBIOS is
> currently using to store code.
> I've been thinking of a few different ways to free up space.  The most
> promising approach seems to be to relocate all or part of SeaBIOS'
> 32bit "flat" code.  This 32bit code is larger than the segmented code
> (67K vs 40K) and it's the area that has been growing the most.
> To relocate the code, the build can store a list of code that depends
> on a fixed address and then at runtime SeaBIOS can modify the code
> with the new address.
> Some different permutations of this idea that I've come up with are:
> 1 - On boot, have SeaBIOS relocate all of it's 32bit code to permanent
>      high ram.
>      CONS: Reserves memory that then can't be used by the OS (67K
>      today).
>      CONS: SeaBIOS code is still limited to 256K size (c+d+e+f
>      segments)
> 2 - Have the build separate out the POST code from other 32bit code
>      (eg, boot&  resume) and store the POST code in a separate
>      CBFS/fw_cfg "file".  During boot SeaBIOS would extract the
>      separate POST code blob into temporary high ram and run it.
>      Currently, the POST code is the bulk of the 32bit "flat" code (57K
>      vs 10K).
>      CONS: It adds complexity during deployment as both the main
>      SeaBIOS blob and the CBFS/fw_cfg POST blob would need to be
>      copied.
> 3 - On boot, relocate only POST code to temporary high ram, and have
>      SeaBIOS reset the machine if the POST code is ever rerun.
>      CONS: Requires a reliable way of resetting the machine.
>      CONS: SeaBIOS code is still limited to 256K size (c+d+e+f
>      segments)

4 - Have the entry points switch immediately to 32-bit mode and call 
32-bit unpaged code in 4G-2M+.  Everything, for example the INT 13 code, 
would run in 32-bit mode from high memory.

PRO - unlimited memory
PRO - less restrictions from .code16gcc, can easily handle far pointers 
(a single function will covert a far pointer to a real pointer)
PRO - smaller code (since .code16gcc uses 32-bit code with lots of prefixes)
PRO - easier to debug, since the tools are geared towards flat memory 
models (except for the thunk code)
CON - slightly slower due to mode switching
CON - a lot of work (but can make it incremental)

error compiling committee.c: too many arguments to function

More information about the SeaBIOS mailing list