From: H. Peter Anvin Date: Wed, 18 Feb 2009 06:28:46 +0000 (-0800) Subject: [pxe] Initialize EDX on PXE NBP entry and INT 1Ah X-Git-Tag: v0.9.7~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aaa26f3bd355e20554d142eaded0657e7c351dac;p=thirdparty%2Fipxe.git [pxe] Initialize EDX on PXE NBP entry and INT 1Ah The PXE 1.x spec specifies that on NBP entry or on return from INT 1Ah AX=5650h, EDX shall point to the physical address of the PXENV+ structure. The PXE 2.x spec drops this requirement, simply stating that EDX is clobbered. Given the principle "be conservative in what you send, liberal in what you accept", however, we should implement this anyway. --- diff --git a/src/arch/i386/interface/pxe/pxe_call.c b/src/arch/i386/interface/pxe/pxe_call.c index 04aaf3b20..320ae1255 100644 --- a/src/arch/i386/interface/pxe/pxe_call.c +++ b/src/arch/i386/interface/pxe/pxe_call.c @@ -433,7 +433,7 @@ void pxe_init_structures ( void ) { * @ret rc Return status code */ int pxe_start_nbp ( void ) { - int discard_b, discard_c; + int discard_b, discard_c, discard_d; uint16_t rc; /* Far call to PXE NBP */ @@ -444,11 +444,12 @@ int pxe_start_nbp ( void ) { "lcall $0, $0x7c00\n\t" "addw $4, %%sp\n\t" ) : "=a" ( rc ), "=b" ( discard_b ), - "=c" ( discard_c ) - : "a" ( __from_text16 ( &ppxe ) ), - "b" ( __from_text16 ( &pxenv ) ), - "c" ( rm_cs ) - : "edx", "esi", "edi", "ebp", "memory" ); + "=c" ( discard_c ), "=d" ( discard_d ) + : "a" ( __from_text16 ( &ppxe ) ), + "b" ( __from_text16 ( &pxenv ) ), + "c" ( rm_cs ), + "d" ( virt_to_phys ( &pxenv ) ) + : "esi", "edi", "ebp", "memory" ); return rc; } diff --git a/src/arch/i386/interface/pxe/pxe_entry.S b/src/arch/i386/interface/pxe/pxe_entry.S index 68b7374f6..22ef41814 100644 --- a/src/arch/i386/interface/pxe/pxe_entry.S +++ b/src/arch/i386/interface/pxe/pxe_entry.S @@ -178,6 +178,7 @@ pxe_entry_common: * Returns: * %ax : 0x564e * %es:bx : Far pointer to the PXENV+ structure + * %edx : Physical address of the PXENV+ structure * CF cleared * Corrupts: * none @@ -191,9 +192,12 @@ pxe_int_1a: cmpw $0x5650, %ax jne 1f /* INT 1A,5650 - PXE installation check */ - pushw %cs - popw %es + xorl %edx, %edx + movw %cs, %dx + movw %dx, %es movw $pxenv, %bx + shll $4, %edx + addl $pxenv, %edx movw $0x564e, %ax popfw clc