Home | History | Annotate | Download | only in x86_64
      1 /* ----------------------------------------------------------------------- *
      2  *
      3  *   Copyright 2013 Intel Corporation; author: Matt Fleming
      4  *
      5  *   This program is free software; you can redistribute it and/or modify
      6  *   it under the terms of the GNU General Public License as published by
      7  *   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
      8  *   Boston MA 02110-1301, USA; either version 2 of the License, or
      9  *   (at your option) any later version; incorporated herein by reference.
     10  *
     11  * ----------------------------------------------------------------------- */
     12 
     13 #define CR0_PG_FLAG	0x80000000
     14 #define MSR_EFER	0xc0000080
     15 
     16 	.globl kernel_jump
     17 	.type kernel_jump,@function
     18 	.code64
     19 kernel_jump:
     20 	cli
     21 
     22 	/*
     23 	 * Setup our segment selector (0x10) and return address (%rdi)
     24 	 * on the stack in preparation for the far return below.
     25 	 */
     26 	mov	$0x1000000000, %rcx
     27 	addq	%rcx, %rdi
     28 	pushq	%rdi
     29 
     30 	.code32
     31 pm_code:
     32 
     33 	/* Disable IA-32e mode by clearing IA32_EFER.LME */
     34 	xorl	%eax, %eax
     35 	xorl	%edx, %edx
     36 	movl	$MSR_EFER, %ecx
     37 	wrmsr
     38 
     39 	/* Turn off paging to disable long mode */
     40 	movl	%cr0, %eax
     41 	andl	$~CR0_PG_FLAG, %eax
     42 	movl	%eax, %cr0
     43 
     44 	/* Far return */
     45 	lret
     46 
     47 	.code64
     48 	.align 4
     49 	.globl efi_handover_32
     50 	.type  efi_handover_32,@function
     51 efi_handover_32:
     52 	movl	$38, errno(%rip)	/* ENOSYS */
     53 	ret
     54 
     55 	.globl efi_handover_64
     56 	.globl efi_handover
     57 	.type  efi_handover_64,@function
     58 	.type  efi_handover,@function
     59 efi_handover_64:
     60 efi_handover:
     61 	add	$512, %rcx
     62 	cli
     63 	jmp	*%rcx
     64