| 
									
										
										
										
											2007-07-11 12:18:53 -07:00
										 |  |  | /* ----------------------------------------------------------------------- * | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *   Copyright (C) 1991, 1992 Linus Torvalds | 
					
						
							|  |  |  |  *   Copyright 2007 rPath, Inc. - All Rights Reserved | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *   This file is part of the Linux kernel, and is made available under | 
					
						
							|  |  |  |  *   the terms of the GNU General Public License version 2. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ----------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * The actual transition into protected mode | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <asm/boot.h> | 
					
						
							| 
									
										
										
										
											2008-01-30 13:33:02 +01:00
										 |  |  | #include <asm/processor-flags.h> | 
					
						
							| 
									
										
										
										
											2007-07-11 12:18:53 -07:00
										 |  |  | #include <asm/segment.h> | 
					
						
							| 
									
										
										
										
											2009-02-14 00:50:21 +03:00
										 |  |  | #include <linux/linkage.h> | 
					
						
							| 
									
										
										
										
											2007-07-11 12:18:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	.text | 
					
						
							|  |  |  | 	.code16 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * void protected_mode_jump(u32 entrypoint, u32 bootparams);
 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2009-02-14 00:50:21 +03:00
										 |  |  | GLOBAL(protected_mode_jump) | 
					
						
							| 
									
										
										
										
											2007-07-11 12:18:53 -07:00
										 |  |  | 	movl	%edx, %esi		# Pointer to boot_params table | 
					
						
							| 
									
										
										
										
											2008-01-30 13:33:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	xorl	%ebx, %ebx | 
					
						
							|  |  |  | 	movw	%cs, %bx | 
					
						
							|  |  |  | 	shll	$4, %ebx | 
					
						
							|  |  |  | 	addl	%ebx, 2f | 
					
						
							| 
									
										
										
										
											2008-06-30 15:42:47 -07:00
										 |  |  | 	jmp	1f			# Short jump to serialize on 386/486 | 
					
						
							|  |  |  | 1: | 
					
						
							| 
									
										
										
										
											2007-07-11 12:18:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	movw	$__BOOT_DS, %cx | 
					
						
							| 
									
										
										
										
											2008-01-30 13:33:02 +01:00
										 |  |  | 	movw	$__BOOT_TSS, %di | 
					
						
							| 
									
										
										
										
											2007-07-11 12:18:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	movl	%cr0, %edx | 
					
						
							| 
									
										
										
										
											2008-01-30 13:33:02 +01:00
										 |  |  | 	orb	$X86_CR0_PE, %dl	# Protected mode | 
					
						
							| 
									
										
										
										
											2007-07-11 12:18:53 -07:00
										 |  |  | 	movl	%edx, %cr0 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-30 13:33:01 +01:00
										 |  |  | 	# Transition to 32-bit mode | 
					
						
							| 
									
										
										
										
											2007-07-11 12:18:53 -07:00
										 |  |  | 	.byte	0x66, 0xea		# ljmpl opcode | 
					
						
							| 
									
										
										
										
											2008-01-30 13:33:01 +01:00
										 |  |  | 2:	.long	in_pm32			# offset | 
					
						
							| 
									
										
										
										
											2007-07-11 12:18:53 -07:00
										 |  |  | 	.word	__BOOT_CS		# segment | 
					
						
							| 
									
										
										
										
											2009-02-14 00:50:21 +03:00
										 |  |  | ENDPROC(protected_mode_jump) | 
					
						
							| 
									
										
										
										
											2008-01-30 13:33:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	.code32 | 
					
						
							| 
									
										
										
										
											2009-03-17 15:26:06 -07:00
										 |  |  | 	.section ".text32","ax" | 
					
						
							| 
									
										
										
										
											2009-02-14 00:50:21 +03:00
										 |  |  | GLOBAL(in_pm32) | 
					
						
							| 
									
										
										
										
											2008-01-30 13:33:01 +01:00
										 |  |  | 	# Set up data segments for flat 32-bit mode | 
					
						
							|  |  |  | 	movl	%ecx, %ds | 
					
						
							|  |  |  | 	movl	%ecx, %es | 
					
						
							|  |  |  | 	movl	%ecx, %fs | 
					
						
							|  |  |  | 	movl	%ecx, %gs | 
					
						
							|  |  |  | 	movl	%ecx, %ss | 
					
						
							|  |  |  | 	# The 32-bit code sets up its own stack, but this way we do have | 
					
						
							|  |  |  | 	# a valid stack if some debugging hack wants to use it. | 
					
						
							|  |  |  | 	addl	%ebx, %esp | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-30 13:33:02 +01:00
										 |  |  | 	# Set up TR to make Intel VT happy | 
					
						
							|  |  |  | 	ltr	%di | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-30 13:33:01 +01:00
										 |  |  | 	# Clear registers to allow for future extensions to the | 
					
						
							|  |  |  | 	# 32-bit boot protocol | 
					
						
							|  |  |  | 	xorl	%ecx, %ecx | 
					
						
							|  |  |  | 	xorl	%edx, %edx | 
					
						
							|  |  |  | 	xorl	%ebx, %ebx | 
					
						
							|  |  |  | 	xorl	%ebp, %ebp | 
					
						
							|  |  |  | 	xorl	%edi, %edi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-30 13:33:02 +01:00
										 |  |  | 	# Set up LDTR to make Intel VT happy | 
					
						
							|  |  |  | 	lldt	%cx | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-30 13:33:01 +01:00
										 |  |  | 	jmpl	*%eax			# Jump to the 32-bit entrypoint | 
					
						
							| 
									
										
										
										
											2009-02-14 00:50:21 +03:00
										 |  |  | ENDPROC(in_pm32) |