Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 88089519 authored by H. Peter Anvin's avatar H. Peter Anvin Committed by Ingo Molnar
Browse files

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: default avatarH. Peter Anvin <hpa@zytor.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent c4d9ba6d
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -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
+7 −0
Original line number Original line Diff line number Diff line
@@ -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
+3 −0
Original line number Original line Diff line number Diff line
@@ -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: