| /* |
| * Copyright (C) 2014 Intel Corporation; author Matt Fleming |
| */ |
| |
| #include <linux/linkage.h> |
| #include <asm/page_types.h> |
| |
| .text |
| .code64 |
| ENTRY(efi64_thunk) |
| push %rbp |
| push %rbx |
| |
| /* |
| * Switch to 1:1 mapped 32-bit stack pointer. |
| */ |
| movq %rsp, efi_saved_sp(%rip) |
| movq efi_scratch+25(%rip), %rsp |
| |
| /* |
| * Calculate the physical address of the kernel text. |
| */ |
| movq $__START_KERNEL_map, %rax |
| subq phys_base(%rip), %rax |
| |
| /* |
| * Push some physical addresses onto the stack. This is easier |
| * to do now in a code64 section while the assembler can address |
| * 64-bit values. Note that all the addresses on the stack are |
| * 32-bit. |
| */ |
| subq $16, %rsp |
| leaq efi_exit32(%rip), %rbx |
| subq %rax, %rbx |
| movl %ebx, 8(%rsp) |
| leaq efi_gdt64(%rip), %rbx |
| subq %rax, %rbx |
| movl %ebx, 2(%ebx) |
| movl %ebx, 4(%rsp) |
| leaq efi_gdt32(%rip), %rbx |
| subq %rax, %rbx |
| movl %ebx, 2(%ebx) |
| movl %ebx, (%rsp) |
| |
| leaq __efi64_thunk(%rip), %rbx |
| subq %rax, %rbx |
| call *%rbx |
| |
| movq efi_saved_sp(%rip), %rsp |
| pop %rbx |
| pop %rbp |
| retq |
| ENDPROC(efi64_thunk) |
| |
| .data |
| efi_gdt32: |
| .word efi_gdt32_end - efi_gdt32 |
| .long 0 /* Filled out above */ |
| .word 0 |
| .quad 0x0000000000000000 /* NULL descriptor */ |
| .quad 0x00cf9a000000ffff /* __KERNEL_CS */ |
| .quad 0x00cf93000000ffff /* __KERNEL_DS */ |
| efi_gdt32_end: |
| |
| efi_saved_sp: .quad 0 |