david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[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.
This commit is contained in:
H. Peter Anvin 2009-02-17 22:28:46 -08:00 committed by Michael Brown
parent b5577553e5
commit aaa26f3bd3
2 changed files with 13 additions and 8 deletions

View File

@ -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;
}

View File

@ -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