183d290c5STom Rini/* SPDX-License-Identifier: GPL-2.0 */ 2c2da86f3SMasahiro Yamada/* 3c2da86f3SMasahiro Yamada * Copyright (c) 2015, Linaro Limited 4c2da86f3SMasahiro Yamada */ 5c2da86f3SMasahiro Yamada#include <linux/linkage.h> 6c2da86f3SMasahiro Yamada 7c2da86f3SMasahiro Yamada#include <asm/opcodes-sec.h> 8c2da86f3SMasahiro Yamada#include <asm/opcodes-virt.h> 9c2da86f3SMasahiro Yamada 10*2f8ab121SAlexander Graf#ifdef CONFIG_EFI_LOADER 1181ea0083SHeinrich Schuchardt .section .text.efi_runtime 12*2f8ab121SAlexander Graf#endif 1381ea0083SHeinrich Schuchardt 14c54bcf68SMasahiro Yamada#define UNWIND(x...) 15c2da86f3SMasahiro Yamada /* 16c2da86f3SMasahiro Yamada * Wrap c macros in asm macros to delay expansion until after the 17c2da86f3SMasahiro Yamada * SMCCC asm macro is expanded. 18c2da86f3SMasahiro Yamada */ 19c2da86f3SMasahiro Yamada .macro SMCCC_SMC 20c2da86f3SMasahiro Yamada __SMC(0) 21c2da86f3SMasahiro Yamada .endm 22c2da86f3SMasahiro Yamada 23c2da86f3SMasahiro Yamada .macro SMCCC_HVC 24c2da86f3SMasahiro Yamada __HVC(0) 25c2da86f3SMasahiro Yamada .endm 26c2da86f3SMasahiro Yamada 27c2da86f3SMasahiro Yamada .macro SMCCC instr 28c2da86f3SMasahiro YamadaUNWIND( .fnstart) 29c2da86f3SMasahiro Yamada mov r12, sp 30c2da86f3SMasahiro Yamada push {r4-r7} 31c2da86f3SMasahiro YamadaUNWIND( .save {r4-r7}) 32c2da86f3SMasahiro Yamada ldm r12, {r4-r7} 33c2da86f3SMasahiro Yamada \instr 34c2da86f3SMasahiro Yamada pop {r4-r7} 35c2da86f3SMasahiro Yamada ldr r12, [sp, #(4 * 4)] 36c2da86f3SMasahiro Yamada stm r12, {r0-r3} 37c2da86f3SMasahiro Yamada bx lr 38c2da86f3SMasahiro YamadaUNWIND( .fnend) 39c2da86f3SMasahiro Yamada .endm 40c2da86f3SMasahiro Yamada 41c2da86f3SMasahiro Yamada/* 42c2da86f3SMasahiro Yamada * void smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2, 43c2da86f3SMasahiro Yamada * unsigned long a3, unsigned long a4, unsigned long a5, 44c2da86f3SMasahiro Yamada * unsigned long a6, unsigned long a7, struct arm_smccc_res *res, 45c2da86f3SMasahiro Yamada * struct arm_smccc_quirk *quirk) 46c2da86f3SMasahiro Yamada */ 47c2da86f3SMasahiro YamadaENTRY(__arm_smccc_smc) 48c2da86f3SMasahiro Yamada SMCCC SMCCC_SMC 49c2da86f3SMasahiro YamadaENDPROC(__arm_smccc_smc) 50c2da86f3SMasahiro Yamada 51c2da86f3SMasahiro Yamada/* 52c2da86f3SMasahiro Yamada * void smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2, 53c2da86f3SMasahiro Yamada * unsigned long a3, unsigned long a4, unsigned long a5, 54c2da86f3SMasahiro Yamada * unsigned long a6, unsigned long a7, struct arm_smccc_res *res, 55c2da86f3SMasahiro Yamada * struct arm_smccc_quirk *quirk) 56c2da86f3SMasahiro Yamada */ 57c2da86f3SMasahiro YamadaENTRY(__arm_smccc_hvc) 58c2da86f3SMasahiro Yamada SMCCC SMCCC_HVC 59c2da86f3SMasahiro YamadaENDPROC(__arm_smccc_hvc) 60