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