mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-10-31 03:58:17 +00:00 
			
		
		
		
	Commit 81ea00838c6 ("efi_loader: PSCI reset and shutdown") put the SMCCC
assembly code into the efi specific code section. This is wrong when we
do not have EFI_LOADER enabled, as that strips efi runtime sections from
the output binary
Reported-by: Michal Simek <monstr@monstr.eu>
Reported-by: Siva Durga Prasad Paladugu <siva.durga.paladugu@xilinx.com>
Tested-by: Michal Simek <monstr@monstr.eu>
Fixes: 81ea00838c6 ("efi_loader: PSCI reset and shutdown")
Signed-off-by: Alexander Graf <agraf@suse.de>
		
	
			
		
			
				
	
	
		
			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)
 |