| H. Peter Anvin | 7052fdd | 2007-07-11 12:18:53 -0700 | [diff] [blame] | 1 | /* ----------------------------------------------------------------------- * | 
 | 2 |  * | 
 | 3 |  *   Copyright (C) 1991, 1992 Linus Torvalds | 
 | 4 |  *   Copyright 2007 rPath, Inc. - All Rights Reserved | 
 | 5 |  * | 
 | 6 |  *   This file is part of the Linux kernel, and is made available under | 
 | 7 |  *   the terms of the GNU General Public License version 2. | 
 | 8 |  * | 
 | 9 |  * ----------------------------------------------------------------------- */ | 
 | 10 |  | 
 | 11 | /* | 
| H. Peter Anvin | 7052fdd | 2007-07-11 12:18:53 -0700 | [diff] [blame] | 12 |  * The actual transition into protected mode | 
 | 13 |  */ | 
 | 14 |  | 
 | 15 | #include <asm/boot.h> | 
| H. Peter Anvin | 02a7b42 | 2008-01-30 13:33:02 +0100 | [diff] [blame] | 16 | #include <asm/processor-flags.h> | 
| H. Peter Anvin | 7052fdd | 2007-07-11 12:18:53 -0700 | [diff] [blame] | 17 | #include <asm/segment.h> | 
 | 18 |  | 
 | 19 | 	.text | 
 | 20 |  | 
 | 21 | 	.globl	protected_mode_jump | 
 | 22 | 	.type	protected_mode_jump, @function | 
 | 23 |  | 
 | 24 | 	.code16 | 
 | 25 |  | 
 | 26 | /* | 
 | 27 |  * void protected_mode_jump(u32 entrypoint, u32 bootparams); | 
 | 28 |  */ | 
 | 29 | protected_mode_jump: | 
| H. Peter Anvin | 7052fdd | 2007-07-11 12:18:53 -0700 | [diff] [blame] | 30 | 	movl	%edx, %esi		# Pointer to boot_params table | 
| H. Peter Anvin | c4d9ba6 | 2008-01-30 13:33:01 +0100 | [diff] [blame] | 31 |  | 
 | 32 | 	xorl	%ebx, %ebx | 
 | 33 | 	movw	%cs, %bx | 
 | 34 | 	shll	$4, %ebx | 
 | 35 | 	addl	%ebx, 2f | 
| H. Peter Anvin | 2ee2394 | 2008-06-30 15:42:47 -0700 | [diff] [blame] | 36 | 	jmp	1f			# Short jump to serialize on 386/486 | 
 | 37 | 1: | 
| H. Peter Anvin | 7052fdd | 2007-07-11 12:18:53 -0700 | [diff] [blame] | 38 |  | 
| H. Peter Anvin | 7052fdd | 2007-07-11 12:18:53 -0700 | [diff] [blame] | 39 | 	movw	$__BOOT_DS, %cx | 
| H. Peter Anvin | 8808951 | 2008-01-30 13:33:02 +0100 | [diff] [blame] | 40 | 	movw	$__BOOT_TSS, %di | 
| H. Peter Anvin | 7052fdd | 2007-07-11 12:18:53 -0700 | [diff] [blame] | 41 |  | 
 | 42 | 	movl	%cr0, %edx | 
| H. Peter Anvin | 02a7b42 | 2008-01-30 13:33:02 +0100 | [diff] [blame] | 43 | 	orb	$X86_CR0_PE, %dl	# Protected mode | 
| H. Peter Anvin | 7052fdd | 2007-07-11 12:18:53 -0700 | [diff] [blame] | 44 | 	movl	%edx, %cr0 | 
| H. Peter Anvin | 7052fdd | 2007-07-11 12:18:53 -0700 | [diff] [blame] | 45 |  | 
| H. Peter Anvin | c4d9ba6 | 2008-01-30 13:33:01 +0100 | [diff] [blame] | 46 | 	# Transition to 32-bit mode | 
| H. Peter Anvin | 7052fdd | 2007-07-11 12:18:53 -0700 | [diff] [blame] | 47 | 	.byte	0x66, 0xea		# ljmpl opcode | 
| H. Peter Anvin | c4d9ba6 | 2008-01-30 13:33:01 +0100 | [diff] [blame] | 48 | 2:	.long	in_pm32			# offset | 
| H. Peter Anvin | 7052fdd | 2007-07-11 12:18:53 -0700 | [diff] [blame] | 49 | 	.word	__BOOT_CS		# segment | 
 | 50 |  | 
 | 51 | 	.size	protected_mode_jump, .-protected_mode_jump | 
| H. Peter Anvin | c4d9ba6 | 2008-01-30 13:33:01 +0100 | [diff] [blame] | 52 |  | 
 | 53 | 	.code32 | 
 | 54 | 	.type	in_pm32, @function | 
 | 55 | in_pm32: | 
 | 56 | 	# Set up data segments for flat 32-bit mode | 
 | 57 | 	movl	%ecx, %ds | 
 | 58 | 	movl	%ecx, %es | 
 | 59 | 	movl	%ecx, %fs | 
 | 60 | 	movl	%ecx, %gs | 
 | 61 | 	movl	%ecx, %ss | 
 | 62 | 	# The 32-bit code sets up its own stack, but this way we do have | 
 | 63 | 	# a valid stack if some debugging hack wants to use it. | 
 | 64 | 	addl	%ebx, %esp | 
 | 65 |  | 
| H. Peter Anvin | 8808951 | 2008-01-30 13:33:02 +0100 | [diff] [blame] | 66 | 	# Set up TR to make Intel VT happy | 
 | 67 | 	ltr	%di | 
 | 68 |  | 
| H. Peter Anvin | c4d9ba6 | 2008-01-30 13:33:01 +0100 | [diff] [blame] | 69 | 	# Clear registers to allow for future extensions to the | 
 | 70 | 	# 32-bit boot protocol | 
 | 71 | 	xorl	%ecx, %ecx | 
 | 72 | 	xorl	%edx, %edx | 
 | 73 | 	xorl	%ebx, %ebx | 
 | 74 | 	xorl	%ebp, %ebp | 
 | 75 | 	xorl	%edi, %edi | 
 | 76 |  | 
| H. Peter Anvin | 8808951 | 2008-01-30 13:33:02 +0100 | [diff] [blame] | 77 | 	# Set up LDTR to make Intel VT happy | 
 | 78 | 	lldt	%cx | 
 | 79 |  | 
| H. Peter Anvin | c4d9ba6 | 2008-01-30 13:33:01 +0100 | [diff] [blame] | 80 | 	jmpl	*%eax			# Jump to the 32-bit entrypoint | 
 | 81 |  | 
 | 82 | 	.size	in_pm32, .-in_pm32 |