I'm CC'ing the mailing list.
On Wed, Nov 24, 2010 at 11:45:17AM -0500, Stefan Berger wrote:
while I am porting the BIOS code for TCG support to SeaBIOS, I am
wondering about the following:
'When' is it recommendable to switch from 16 bit to 32bit.
To be honest, this has never really been done before in SeaBIOS, so I
think we'll have to figure this out as we go. Since you need to
access full memory, it looks like it will be required to jump into
asking because the interface I am implementing allows callers to
pass input and output data structures using es:di and ds:si, with es
and ds allowed to be loaded with anything possible. So my strategy
in the Bochs BIOS was to switch to 32 bit even before calling the
interrupt handler, there doing the case statement for branching into
the actual functions (switch (regs->al)) and passing 32 bit pointers
converted from es:di and ds:si to the functions doing the work and
reading from those memory locations.
This sounds okay to me - it should be possible to implement
handle_1abb(regs) which does a call32(tcg32_1abb, regs). It's
possible to do all the pointer conversion while in 32bit mode.
The 'thing' is also that
several ones of the functions that can be called through the
interrupt interface are also called from the implemented functions.
Functions A,B,C can be called via the interrupt handler.
Function B also calls A.
Function C also calls B.
This shouldn't really be an issue. The build should take care of
This is due to the hierarchical nature of the functions. Also, while
for example B calls A, B fills a data structure (on the stack) that
it passes to A. A of course can get the same data structure from the
user calling the interrupt interface. So, by switching to 32 bit
mode and converting to 32 bit pointers early I could previously
avoid a lot of headaches with the segment registers in 16 bit mode
and reading the data from wherever they may be. Would you have any
concerns about switching to 32 bit mode early, so that the interrupt
handler and anything subsequent runs in 32 bit mode?
I can't say for sure what will make sense without seeing the code
first, but it sounds okay to me.