60 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| /*
 | |
|  * Copyright (c) 2015, Linaro Limited
 | |
|  */
 | |
| #include <linux/linkage.h>
 | |
| 
 | |
| #include <asm/opcodes-sec.h>
 | |
| #include <asm/opcodes-virt.h>
 | |
| 
 | |
| #ifdef CONFIG_EFI_LOADER
 | |
| 	.section	.text.efi_runtime
 | |
| #endif
 | |
| 
 | |
| #define UNWIND(x...)
 | |
| 	/*
 | |
| 	 * 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,
 | |
|  *		  struct arm_smccc_quirk *quirk)
 | |
|  */
 | |
| 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,
 | |
|  *		  struct arm_smccc_quirk *quirk)
 | |
|  */
 | |
| ENTRY(__arm_smccc_hvc)
 | |
| 	SMCCC SMCCC_HVC
 | |
| ENDPROC(__arm_smccc_hvc)
 |