| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * EFI call stub for IA32.
- *
- * This stub allows us to make EFI calls in physical mode with interrupts
- * turned off.
- */
- #include <linux/linkage.h>
- #include <linux/init.h>
- #include <asm/asm-offsets.h>
- #include <asm/page_types.h>
- __INIT
- SYM_FUNC_START(efi_call_svam)
- push %ebp
- movl %esp, %ebp
- push %ebx
- push 16(%esp)
- push 16(%esp)
- push %ecx
- push %edx
- movl %eax, %ebx // &systab_phys->runtime
- /*
- * Switch to the flat mapped alias of this routine, by jumping to the
- * address of label '1' after subtracting PAGE_OFFSET from it.
- */
- movl $1f, %edx
- subl $__PAGE_OFFSET, %edx
- jmp *%edx
- 1:
- /* disable paging */
- movl %cr0, %edx
- andl $0x7fffffff, %edx
- movl %edx, %cr0
- /* convert the stack pointer to a flat mapped address */
- subl $__PAGE_OFFSET, %esp
- /* call the EFI routine */
- movl (%eax), %eax
- call *EFI_svam(%eax)
- /* grab the virtually remapped EFI runtime services table pointer */
- movl (%ebx), %ecx
- movl 36(%esp), %edx // &efi.runtime
- movl %ecx, (%edx)
- /* re-enable paging */
- movl %cr0, %edx
- orl $0x80000000, %edx
- movl %edx, %cr0
- movl 16(%esp), %ebx
- leave
- RET
- SYM_FUNC_END(efi_call_svam)
|