Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[pcbios] Guard against register corruption in INT 15,e820 implementat…
…ions

Someone at Dell must have a full-time job designing ways to screw up
implementations of INT 15,e820.  This latest gem is courtesy of a Dell
Xanadu system, which arbitrarily decides to obliterate the contents of
%esi.

Preserve %esi, %edi and %ebp across calls to INT 15,e820, in case
someone tries a variation on this trick in future.
  • Loading branch information
Michael Brown committed Oct 23, 2008
1 parent 612f4e7 commit bcc70d6
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 3 deletions.
8 changes: 6 additions & 2 deletions src/arch/i386/firmware/pcbios/e820mangler.S
Expand Up @@ -268,8 +268,10 @@ get_underlying_e820:
pushl %ebx
pushl %ecx
pushl %edx
pushl %esi /* Some implementations corrupt %esi, so we */
pushl %edi /* preserve %esi, %edi and %ebp to be paranoid */
pushl %ebp
pushw %es
pushw %di
pushw %ds
popw %es
movw $underlying_e820_cache, %di
Expand All @@ -280,8 +282,10 @@ get_underlying_e820:
stc
pushfw
lcall *%cs:int15_vector
popw %di
popw %es
popl %ebp
popl %edi
popl %esi
/* Check for error return from underlying e820 call */
jc 2f /* CF set: error */
cmpl $SMAP, %eax
Expand Down
6 changes: 5 additions & 1 deletion src/arch/i386/firmware/pcbios/memmap.c
Expand Up @@ -167,6 +167,10 @@ static int meme820 ( struct memory_map *memmap ) {
memset ( &e820buf, 0, sizeof ( e820buf ) );

do {
/* Some BIOSes corrupt %esi for fun. Guard against
* this by telling gcc that all non-output registers
* may be corrupted.
*/
__asm__ __volatile__ ( REAL_CODE ( "stc\n\t"
"int $0x15\n\t"
"pushfw\n\t"
Expand All @@ -178,7 +182,7 @@ static int meme820 ( struct memory_map *memmap ) {
"D" ( __from_data16 ( &e820buf ) ),
"c" ( sizeof ( e820buf ) ),
"d" ( SMAP )
: "memory" );
: "esi", "memory" );

if ( smap != SMAP ) {
DBG ( "INT 15,e820 failed SMAP signature check\n" );
Expand Down

0 comments on commit bcc70d6

Please sign in to comment.