Load an IDT with NULL limit

Load an IDT with NULL limit to prevent the 16bit IDT being used
in protected mode before c_start.S sets up a 32bit IDT when entering
ram stage.

Signed-off-by: Stefan Reinauer <reinauer@google.com>
Change-Id: I8d048c894c863ac4971fcef8f065be6b899e1d3e
Reviewed-on: http://review.coreboot.org/259
Tested-by: build bot (Jenkins)
Reviewed-by: Marc Jones <marcj303@gmail.com>
This commit is contained in:
Stefan Reinauer 2011-06-01 14:01:46 -07:00 committed by Stefan Reinauer
parent d17fe51d9a
commit 71496bea9b
2 changed files with 15 additions and 1 deletions

View File

@ -45,7 +45,6 @@ _start:
xorl %eax, %eax
movl %eax, %cr3 /* Invalidate TLB*/
/* Invalidating the cache here seems to be a bad idea on
* modern processors. Don't.
* If we are hyperthreaded or we have multiple cores it is bad,
@ -55,6 +54,13 @@ _start:
* entry16.inc.
*/
/* Load an IDT with NULL limit to prevent the 16bit IDT being used
* in protected mode before c_start.S sets up a 32bit IDT when entering
* ram stage.
*/
movw $nullidt_offset, %bx
lidt %cs:(%bx)
/* Note: gas handles memory addresses in 16 bit code very poorly.
* In particular it doesn't appear to have a directive allowing you
* associate a section or even an absolute offset with a segment register.
@ -118,6 +124,13 @@ gdtptr16:
.word gdt_end - gdt -1 /* compute the table limit */
.long gdt /* we know the offset */
.align 4
.globl nullidt
nullidt:
.word 0 /* limit */
.long 0
.word 0
.globl _estart
_estart:
.code32

View File

@ -1 +1,2 @@
gdtptr16_offset = gdtptr16 & 0xffff;
nullidt_offset = nullidt & 0xffff;