1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- /*
- * 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
|