WIP FPC-III support
[linux/fpc-iii.git] / arch / arm64 / kernel / efi-rt-wrapper.S
blob75691a2641c1c0f8ec05604ae6b47345fcb93e75
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2018 Linaro Ltd <ard.biesheuvel@linaro.org>
4  */
6 #include <linux/linkage.h>
8 SYM_FUNC_START(__efi_rt_asm_wrapper)
9         stp     x29, x30, [sp, #-32]!
10         mov     x29, sp
12         /*
13          * Register x18 is designated as the 'platform' register by the AAPCS,
14          * which means firmware running at the same exception level as the OS
15          * (such as UEFI) should never touch it.
16          */
17         stp     x1, x18, [sp, #16]
19         /*
20          * We are lucky enough that no EFI runtime services take more than
21          * 5 arguments, so all are passed in registers rather than via the
22          * stack.
23          */
24         mov     x8, x0
25         mov     x0, x2
26         mov     x1, x3
27         mov     x2, x4
28         mov     x3, x5
29         mov     x4, x6
30         blr     x8
32         ldp     x1, x2, [sp, #16]
33         cmp     x2, x18
34         ldp     x29, x30, [sp], #32
35         b.ne    0f
36         ret
38         /*
39          * With CONFIG_SHADOW_CALL_STACK, the kernel uses x18 to store a
40          * shadow stack pointer, which we need to restore before returning to
41          * potentially instrumented code. This is safe because the wrapper is
42          * called with preemption disabled and a separate shadow stack is used
43          * for interrupts.
44          */
45         mov     x18, x2
46         b       efi_handle_corrupted_x18        // tail call
47 SYM_FUNC_END(__efi_rt_asm_wrapper)