1/* 2 * Copyright (c) 2015, Linaro Limited 3 * 4 * This software is licensed under the terms of the GNU General Public 5 * License version 2, as published by the Free Software Foundation, and 6 * may be copied, distributed, and modified under those terms. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 */ 14#include <linux/linkage.h> 15 16#include <asm/opcodes-sec.h> 17#include <asm/opcodes-virt.h> 18#include <asm/unwind.h> 19#include <asm/export.h> 20 21 /* 22 * Wrap c macros in asm macros to delay expansion until after the 23 * SMCCC asm macro is expanded. 24 */ 25 .macro SMCCC_SMC 26 __SMC(0) 27 .endm 28 29 .macro SMCCC_HVC 30 __HVC(0) 31 .endm 32 33 .macro SMCCC instr 34UNWIND( .fnstart) 35 mov r12, sp 36 push {r4-r7} 37UNWIND( .save {r4-r7}) 38 ldm r12, {r4-r7} 39 \instr 40 pop {r4-r7} 41 ldr r12, [sp, #(4 * 4)] 42 stm r12, {r0-r3} 43 bx lr 44UNWIND( .fnend) 45 .endm 46 47/* 48 * void smccc_smc(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 */ 52ENTRY(arm_smccc_smc) 53 SMCCC SMCCC_SMC 54ENDPROC(arm_smccc_smc) 55EXPORT_SYMBOL(arm_smccc_smc) 56 57/* 58 * void smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2, 59 * unsigned long a3, unsigned long a4, unsigned long a5, 60 * unsigned long a6, unsigned long a7, struct arm_smccc_res *res) 61 */ 62ENTRY(arm_smccc_hvc) 63 SMCCC SMCCC_HVC 64ENDPROC(arm_smccc_hvc) 65EXPORT_SYMBOL(arm_smccc_hvc) 66