1/* SPDX-License-Identifier: GPL-2.0 */ 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 10#ifdef CONFIG_EFI_LOADER 11 .section .text.efi_runtime 12#endif 13 14#define UNWIND(x...) 15 /* 16 * Wrap c macros in asm macros to delay expansion until after the 17 * SMCCC asm macro is expanded. 18 */ 19 .macro SMCCC_SMC 20 __SMC(0) 21 .endm 22 23 .macro SMCCC_HVC 24 __HVC(0) 25 .endm 26 27 .macro SMCCC instr 28UNWIND( .fnstart) 29 mov r12, sp 30 push {r4-r7} 31UNWIND( .save {r4-r7}) 32 ldm r12, {r4-r7} 33 \instr 34 pop {r4-r7} 35 ldr r12, [sp, #(4 * 4)] 36 stm r12, {r0-r3} 37 bx lr 38UNWIND( .fnend) 39 .endm 40 41/* 42 * void smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2, 43 * unsigned long a3, unsigned long a4, unsigned long a5, 44 * unsigned long a6, unsigned long a7, struct arm_smccc_res *res, 45 * struct arm_smccc_quirk *quirk) 46 */ 47ENTRY(__arm_smccc_smc) 48 SMCCC SMCCC_SMC 49ENDPROC(__arm_smccc_smc) 50 51/* 52 * void smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2, 53 * unsigned long a3, unsigned long a4, unsigned long a5, 54 * unsigned long a6, unsigned long a7, struct arm_smccc_res *res, 55 * struct arm_smccc_quirk *quirk) 56 */ 57ENTRY(__arm_smccc_hvc) 58 SMCCC SMCCC_HVC 59ENDPROC(__arm_smccc_hvc) 60