mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 05:02:12 +00:00
x86 setup: initialize LDTR and TR to make life easier to Intel VT
Intel VT doesn't like to engage when the protected-mode state isn't fully initialized. Make life easier for it by initializing LDTR (to null) and TR (to a dummy hunk of low memory which will never actually be touched.) Signed-off-by: H. Peter Anvin <hpa@zytor.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
c4d9ba6da9
commit
88089519f3
@ -121,6 +121,10 @@ static void setup_gdt(void)
|
|||||||
[GDT_ENTRY_BOOT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
|
[GDT_ENTRY_BOOT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
|
||||||
/* DS: data, read/write, 4 GB, base 0 */
|
/* DS: data, read/write, 4 GB, base 0 */
|
||||||
[GDT_ENTRY_BOOT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
|
[GDT_ENTRY_BOOT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
|
||||||
|
/* TSS: 32-bit tss, 104 bytes, base 4096 */
|
||||||
|
/* We only have a TSS here to keep Intel VT happy;
|
||||||
|
we don't actually use it for anything. */
|
||||||
|
[GDT_ENTRY_BOOT_TSS] = GDT_ENTRY(0x0089, 4096, 103),
|
||||||
};
|
};
|
||||||
/* Xen HVM incorrectly stores a pointer to the gdt_ptr, instead
|
/* Xen HVM incorrectly stores a pointer to the gdt_ptr, instead
|
||||||
of the gdt_ptr contents. Thus, make it static so it will
|
of the gdt_ptr contents. Thus, make it static so it will
|
||||||
|
@ -36,6 +36,7 @@ protected_mode_jump:
|
|||||||
addl %ebx, 2f
|
addl %ebx, 2f
|
||||||
|
|
||||||
movw $__BOOT_DS, %cx
|
movw $__BOOT_DS, %cx
|
||||||
|
movw $__BOOT_TSS, %di
|
||||||
|
|
||||||
movl %cr0, %edx
|
movl %cr0, %edx
|
||||||
orb $1, %dl # Protected mode (PE) bit
|
orb $1, %dl # Protected mode (PE) bit
|
||||||
@ -63,6 +64,9 @@ in_pm32:
|
|||||||
# a valid stack if some debugging hack wants to use it.
|
# a valid stack if some debugging hack wants to use it.
|
||||||
addl %ebx, %esp
|
addl %ebx, %esp
|
||||||
|
|
||||||
|
# Set up TR to make Intel VT happy
|
||||||
|
ltr %di
|
||||||
|
|
||||||
# Clear registers to allow for future extensions to the
|
# Clear registers to allow for future extensions to the
|
||||||
# 32-bit boot protocol
|
# 32-bit boot protocol
|
||||||
xorl %ecx, %ecx
|
xorl %ecx, %ecx
|
||||||
@ -71,6 +75,9 @@ in_pm32:
|
|||||||
xorl %ebp, %ebp
|
xorl %ebp, %ebp
|
||||||
xorl %edi, %edi
|
xorl %edi, %edi
|
||||||
|
|
||||||
|
# Set up LDTR to make Intel VT happy
|
||||||
|
lldt %cx
|
||||||
|
|
||||||
jmpl *%eax # Jump to the 32-bit entrypoint
|
jmpl *%eax # Jump to the 32-bit entrypoint
|
||||||
|
|
||||||
.size in_pm32, .-in_pm32
|
.size in_pm32, .-in_pm32
|
||||||
|
@ -9,6 +9,9 @@
|
|||||||
#define GDT_ENTRY_BOOT_DS (GDT_ENTRY_BOOT_CS + 1)
|
#define GDT_ENTRY_BOOT_DS (GDT_ENTRY_BOOT_CS + 1)
|
||||||
#define __BOOT_DS (GDT_ENTRY_BOOT_DS * 8)
|
#define __BOOT_DS (GDT_ENTRY_BOOT_DS * 8)
|
||||||
|
|
||||||
|
#define GDT_ENTRY_BOOT_TSS (GDT_ENTRY_BOOT_CS + 2)
|
||||||
|
#define __BOOT_TSS (GDT_ENTRY_BOOT_TSS * 8)
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
/*
|
/*
|
||||||
* The layout of the per-CPU GDT under Linux:
|
* The layout of the per-CPU GDT under Linux:
|
||||||
|
Loading…
Reference in New Issue
Block a user