summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin2009-02-18 07:28:46 +0100
committerMichael Brown2009-02-18 19:13:20 +0100
commitaaa26f3bd355e20554d142eaded0657e7c351dac (patch)
tree96948b62ad671d44a12e77d598a6fad4154f2250
parent[pxeprefix] Add .kkpxe image type and ability to return via PXE stack (diff)
downloadipxe-aaa26f3bd355e20554d142eaded0657e7c351dac.tar.gz
ipxe-aaa26f3bd355e20554d142eaded0657e7c351dac.tar.xz
ipxe-aaa26f3bd355e20554d142eaded0657e7c351dac.zip
[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.
-rw-r--r--src/arch/i386/interface/pxe/pxe_call.c13
-rw-r--r--src/arch/i386/interface/pxe/pxe_entry.S8
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