From aaa26f3bd355e20554d142eaded0657e7c351dac Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Tue, 17 Feb 2009 22:28:46 -0800 Subject: [PATCH] [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. --- src/arch/i386/interface/pxe/pxe_call.c | 13 +++++++------ src/arch/i386/interface/pxe/pxe_entry.S | 8 ++++++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/arch/i386/interface/pxe/pxe_call.c b/src/arch/i386/interface/pxe/pxe_call.c index 04aaf3b2..320ae125 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 68b7374f..22ef4181 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