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