Merge branch 'drm-fixes-5.2' of git://people.freedesktop.org/~agd5f/linux into drm...
[sfrench/cifs-2.6.git] / arch / arm64 / kernel / efi-rt-wrapper.S
1 /*
2  * Copyright (C) 2018 Linaro Ltd <ard.biesheuvel@linaro.org>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  */
8
9 #include <linux/linkage.h>
10
11 ENTRY(__efi_rt_asm_wrapper)
12         stp     x29, x30, [sp, #-32]!
13         mov     x29, sp
14
15         /*
16          * Register x18 is designated as the 'platform' register by the AAPCS,
17          * which means firmware running at the same exception level as the OS
18          * (such as UEFI) should never touch it.
19          */
20         stp     x1, x18, [sp, #16]
21
22         /*
23          * We are lucky enough that no EFI runtime services take more than
24          * 5 arguments, so all are passed in registers rather than via the
25          * stack.
26          */
27         mov     x8, x0
28         mov     x0, x2
29         mov     x1, x3
30         mov     x2, x4
31         mov     x3, x5
32         mov     x4, x6
33         blr     x8
34
35         ldp     x1, x2, [sp, #16]
36         cmp     x2, x18
37         ldp     x29, x30, [sp], #32
38         b.ne    0f
39         ret
40 0:      b       efi_handle_corrupted_x18        // tail call
41 ENDPROC(__efi_rt_asm_wrapper)