summaryrefslogtreecommitdiffstats
path: root/src/arch/i386/transitions/librm.S
diff options
context:
space:
mode:
authorMichael Brown2008-11-07 00:08:10 +0100
committerMichael Brown2008-11-07 04:48:25 +0100
commit29e6f9835ea0277c262b1ab2c4acee1d69cb7099 (patch)
treeba53b2dcc7d2fd841ede1773a4cc3ac186a26524 /src/arch/i386/transitions/librm.S
parent[phantom] Allow for PXE boot to be enabled/disabled on a per-port basis (diff)
downloadipxe-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-xsrc/arch/i386/transitions/librm.S10
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