Skip to content

Commit

Permalink
[i386] Add data32 prefixes to all lgdt/lidt instructions
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Michael Brown committed Nov 7, 2008
1 parent aa95744 commit 29e6f98
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 7 deletions.
4 changes: 2 additions & 2 deletions src/arch/i386/prefix/libprefix.S
Expand Up @@ -341,7 +341,7 @@ pm_call:
/* Switch CPU to protected mode and load up segment registers */
pushl %eax
cli
lgdt PM_CALL_VAR(gdt)(%bp)
data32 lgdt PM_CALL_VAR(gdt)(%bp)
movl %cr0, %eax
orb $CR0_PE, %al
movl %eax, %cr0
Expand Down Expand Up @@ -377,7 +377,7 @@ pm_call:
popw %es
popw %fs
popw %gs
lgdt PM_CALL_VAR(pm_saved_gdt)(%bp)
data32 lgdt PM_CALL_VAR(pm_saved_gdt)(%bp)
popfl
movw %bp, %sp
popw %bp
Expand Down
10 changes: 5 additions & 5 deletions src/arch/i386/transitions/librm.S
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 29e6f98

Please sign in to comment.