|
@@ -0,0 +1,62 @@
|
|
|
|
+/*
|
|
|
|
+ * Copyright (c) 2015, Linaro Limited
|
|
|
|
+ *
|
|
|
|
+ * This software is licensed under the terms of the GNU General Public
|
|
|
|
+ * License version 2, as published by the Free Software Foundation, and
|
|
|
|
+ * may be copied, distributed, and modified under those terms.
|
|
|
|
+ *
|
|
|
|
+ * This program is distributed in the hope that it will be useful,
|
|
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
+ * GNU General Public License for more details.
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+#include <linux/linkage.h>
|
|
|
|
+
|
|
|
|
+#include <asm/opcodes-sec.h>
|
|
|
|
+#include <asm/opcodes-virt.h>
|
|
|
|
+#include <asm/unwind.h>
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Wrap c macros in asm macros to delay expansion until after the
|
|
|
|
+ * SMCCC asm macro is expanded.
|
|
|
|
+ */
|
|
|
|
+ .macro SMCCC_SMC
|
|
|
|
+ __SMC(0)
|
|
|
|
+ .endm
|
|
|
|
+
|
|
|
|
+ .macro SMCCC_HVC
|
|
|
|
+ __HVC(0)
|
|
|
|
+ .endm
|
|
|
|
+
|
|
|
|
+ .macro SMCCC instr
|
|
|
|
+UNWIND( .fnstart)
|
|
|
|
+ mov r12, sp
|
|
|
|
+ push {r4-r7}
|
|
|
|
+UNWIND( .save {r4-r7})
|
|
|
|
+ ldm r12, {r4-r7}
|
|
|
|
+ \instr
|
|
|
|
+ pop {r4-r7}
|
|
|
|
+ ldr r12, [sp, #(4 * 4)]
|
|
|
|
+ stm r12, {r0-r3}
|
|
|
|
+ bx lr
|
|
|
|
+UNWIND( .fnend)
|
|
|
|
+ .endm
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * void smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2,
|
|
|
|
+ * unsigned long a3, unsigned long a4, unsigned long a5,
|
|
|
|
+ * unsigned long a6, unsigned long a7, struct arm_smccc_res *res)
|
|
|
|
+ */
|
|
|
|
+ENTRY(arm_smccc_smc)
|
|
|
|
+ SMCCC SMCCC_SMC
|
|
|
|
+ENDPROC(arm_smccc_smc)
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * void smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2,
|
|
|
|
+ * unsigned long a3, unsigned long a4, unsigned long a5,
|
|
|
|
+ * unsigned long a6, unsigned long a7, struct arm_smccc_res *res)
|
|
|
|
+ */
|
|
|
|
+ENTRY(arm_smccc_hvc)
|
|
|
|
+ SMCCC SMCCC_HVC
|
|
|
|
+ENDPROC(arm_smccc_hvc)
|