diff options
author | Michael Brown | 2008-11-07 00:08:10 +0100 |
---|---|---|
committer | Michael Brown | 2008-11-07 04:48:25 +0100 |
commit | 29e6f9835ea0277c262b1ab2c4acee1d69cb7099 (patch) | |
tree | ba53b2dcc7d2fd841ede1773a4cc3ac186a26524 /src/arch/i386/transitions/librm.S | |
parent | [phantom] Allow for PXE boot to be enabled/disabled on a per-port basis (diff) | |
download | ipxe-29e6f9835ea0277c262b1ab2c4acee1d69cb7099.tar.gz ipxe-29e6f9835ea0277c262b1ab2c4acee1d69cb7099.tar.xz ipxe-29e6f9835ea0277c262b1ab2c4acee1d69cb7099.zip |
[i386] Add data32 prefixes to all lgdt/lidt instructions
With a 16-bit operand, lgdt/lidt will load only a 24-bit base address,
ignoring the high-order bits. This meant that we could fail to fully
restore the GDT across a call into gPXE, if the GDT happened to be
located above the 16MB mark.
Not all of our lgdt/lidt instructions require a data32 prefix (for
example, reloading the real-mode IDT can never require a 32-bit base
address), but by adding them everywhere we will hopefully not forget
the necessary ones in future.
Diffstat (limited to 'src/arch/i386/transitions/librm.S')
-rwxr-xr-x | src/arch/i386/transitions/librm.S | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/arch/i386/transitions/librm.S b/src/arch/i386/transitions/librm.S index ff4b1d97..7e9fd45d 100755 --- a/src/arch/i386/transitions/librm.S +++ b/src/arch/i386/transitions/librm.S @@ -203,8 +203,8 @@ real_to_prot: /* Switch to protected mode */ cli - data32 lgdt gdtr - data32 lidt idtr + data32 lgdt gdtr + data32 lidt idtr movl %cr0, %eax orb $CR0_PE, %al movl %eax, %cr0 @@ -316,7 +316,7 @@ p2r_jump_target: movl %edx, %esp /* Reset IDTR to the real-mode defaults */ - lidt rm_idtr + data32 lidt rm_idtr /* Return to real-mode address */ data32 ret @@ -424,8 +424,8 @@ prot_call: 1: /* Reload GDT and IDT, restore registers and flags and return */ movw %sp, %bp - lgdt (%bp) - lidt 8(%bp) + data32 lgdt (%bp) + data32 lidt 8(%bp) addw $20, %sp /* also skip %cs and %ss */ popw %ds popw %es |