[gPXE-devel] [PATCH][v2] Run com32 programs with a valid IDT
Stefan Hajnoczi
stefanha at gmail.com
Sun Aug 1 07:58:34 EDT 2010
On Wed, Jul 7, 2010 at 11:35 PM, Geoff Lywood <glywood at vmware.com> wrote:
> Here is an updated patch.
>
> Changes since the first version:
> - Instructions "retf" and "movzxb" have been replaced with "lret" and "movzbl"
> because that's the correct AT&T syntax
> - The three calls to prep_segment were merged into a single call
>
> $ util/diffsize.pl origin/master HEAD
> com32 +155
> com32_call +38
> com32_wrappe +33
> TOTAL: +226
>
> ---------------------
> COM32 binaries generally expect to run with interrupts enabled. Syslinux does
> so, and COM32 programs will execute cli/sti pairs when running a critical
> section, to provide mutual exclusion against BIOS interrupt handlers.
> Previously, under gPXE, the IDT was not valid, so any interrupt (e.g. a timer
> tick) would generally cause the machine to triple fault.
>
> This change introduces code to:
> - Create a valid IDT at the same location that syslinux uses
> - Create an "interrupt jump buffer", which contains small pieces of code that
> simply record the vector number and jump to a common handler
> - Thunk down to real mode and execute the BIOS's interrupt handler whenever
> an interrupt is received in a COM32 program
> - Switch IDTs and enable/disable interrupts when context switching to and from
> COM32 binaries
>
> Testing done:
> - Booted VMware ESX using a COM32 multiboot loader (mboot.c32)
> - Built with GDBSERIAL enabled, and tested breakpoints on int22 and com32_irq
> - Put the following code in a COM32 program:
> asm volatile ( "sti" );
> while ( 1 );
> Before this change, the machine would triple fault immediately. After this
> change, it hangs as expected. Under Bochs, it is possible to see the
> interrupt handler run, and the current time in the BIOS data area gets
> incremented.
> ---
> src/arch/i386/image/com32.c | 54 +++++++++++++++++++--
> src/arch/i386/include/comboot.h | 45 ++++++++++++++++++
> src/arch/i386/interface/syslinux/com32_call.c | 17 +++++++
> src/arch/i386/interface/syslinux/com32_wrapper.S | 28 +++++++++++
> 4 files changed, 138 insertions(+), 6 deletions(-)
Appled, thanks!
http://git.etherboot.org/?p=gpxe.git;a=commitdiff;h=b764464f04c5316e0f8188ef6bf3a74e8ebc1f00
Stefan
More information about the gPXE-devel
mailing list