Linux-libre 5.4.47-gnu
[librecmc/linux-libre.git] / arch / arm / kernel / smccc-call.S
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (c) 2015, Linaro Limited
4  */
5 #include <linux/linkage.h>
6
7 #include <asm/opcodes-sec.h>
8 #include <asm/opcodes-virt.h>
9 #include <asm/unwind.h>
10
11         /*
12          * Wrap c macros in asm macros to delay expansion until after the
13          * SMCCC asm macro is expanded.
14          */
15         .macro SMCCC_SMC
16         __SMC(0)
17         .endm
18
19         .macro SMCCC_HVC
20         __HVC(0)
21         .endm
22
23         .macro SMCCC instr
24 UNWIND( .fnstart)
25         mov     r12, sp
26         push    {r4-r7}
27 UNWIND( .save   {r4-r7})
28         ldm     r12, {r4-r7}
29         \instr
30         pop     {r4-r7}
31         ldr     r12, [sp, #(4 * 4)]
32         stm     r12, {r0-r3}
33         bx      lr
34 UNWIND( .fnend)
35         .endm
36
37 /*
38  * void smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2,
39  *                unsigned long a3, unsigned long a4, unsigned long a5,
40  *                unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
41  *                struct arm_smccc_quirk *quirk)
42  */
43 ENTRY(__arm_smccc_smc)
44         SMCCC SMCCC_SMC
45 ENDPROC(__arm_smccc_smc)
46
47 /*
48  * void smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2,
49  *                unsigned long a3, unsigned long a4, unsigned long a5,
50  *                unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
51  *                struct arm_smccc_quirk *quirk)
52  */
53 ENTRY(__arm_smccc_hvc)
54         SMCCC SMCCC_HVC
55 ENDPROC(__arm_smccc_hvc)