mirror of
				https://github.com/riscv-software-src/opensbi
				synced 2025-11-03 21:48:45 +00:00 
			
		
		
		
	When OpenSBI is compiled as fPIE mode, the assembler will translate "la" to GOT reference pattern. It will cause to cost an additional load instruction when obtaining the symbol address. However, if the symbol locates within the positive or negative 2GB region, we can use "lla" instead of "la" to avoid unneeded GOT references. This patch assumes that the OpenSBI image excluding the payload does not exceed 2GB. Based on this assumption, all "la" instructions are replaced by "lla" to avoid performance degradation when compiling as fPIE mode. Signed-off-by: Vincent Chen <vincent.chen@sifive.com> Reviewed-by: Anup Patel <anup.patel@wdc.com>
		
			
				
	
	
		
			89 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
/*
 | 
						|
 * SPDX-License-Identifier: BSD-2-Clause
 | 
						|
 *
 | 
						|
 * Copyright (c) 2019 Western Digital Corporation or its affiliates.
 | 
						|
 *
 | 
						|
 * Authors:
 | 
						|
 *   Anup Patel <anup.patel@wdc.com>
 | 
						|
 */
 | 
						|
 | 
						|
#include <sbi/riscv_encoding.h>
 | 
						|
#define __ASM_STR(x)	x
 | 
						|
 | 
						|
#if __riscv_xlen == 64
 | 
						|
#define __REG_SEL(a, b)		__ASM_STR(a)
 | 
						|
#define RISCV_PTR		.dword
 | 
						|
#elif __riscv_xlen == 32
 | 
						|
#define __REG_SEL(a, b)		__ASM_STR(b)
 | 
						|
#define RISCV_PTR		.word
 | 
						|
#else
 | 
						|
#error "Unexpected __riscv_xlen"
 | 
						|
#endif
 | 
						|
 | 
						|
#define REG_L		__REG_SEL(ld, lw)
 | 
						|
#define REG_S		__REG_SEL(sd, sw)
 | 
						|
 | 
						|
	.section .entry, "ax", %progbits
 | 
						|
	.align 3
 | 
						|
	.globl _start
 | 
						|
_start:
 | 
						|
	/* Pick one hart to run the main boot sequence */
 | 
						|
	lla	a3, _hart_lottery
 | 
						|
	li	a2, 1
 | 
						|
	amoadd.w a3, a2, (a3)
 | 
						|
	bnez	a3, _start_hang
 | 
						|
 | 
						|
	/* Save a0 and a1 */
 | 
						|
	lla	a3, _boot_a0
 | 
						|
	REG_S	a0, 0(a3)
 | 
						|
	lla	a3, _boot_a1
 | 
						|
	REG_S	a1, 0(a3)
 | 
						|
 | 
						|
	/* Zero-out BSS */
 | 
						|
	lla	a4, _bss_start
 | 
						|
	lla	a5, _bss_end
 | 
						|
_bss_zero:
 | 
						|
	REG_S	zero, (a4)
 | 
						|
	add	a4, a4, __SIZEOF_POINTER__
 | 
						|
	blt	a4, a5, _bss_zero
 | 
						|
 | 
						|
_start_warm:
 | 
						|
	/* Disable and clear all interrupts */
 | 
						|
	csrw	CSR_SIE, zero
 | 
						|
	csrw	CSR_SIP, zero
 | 
						|
 | 
						|
	/* Setup exception vectors */
 | 
						|
	lla	a3, _start_hang
 | 
						|
	csrw	CSR_STVEC, a3
 | 
						|
 | 
						|
	/* Setup stack */
 | 
						|
	lla	a3, _payload_end
 | 
						|
	li	a4, 0x2000
 | 
						|
	add	sp, a3, a4
 | 
						|
 | 
						|
	/* Jump to C main */
 | 
						|
	lla	a3, _boot_a0
 | 
						|
	REG_L	a0, 0(a3)
 | 
						|
	lla	a3, _boot_a1
 | 
						|
	REG_L	a1, 0(a3)
 | 
						|
	call	test_main
 | 
						|
 | 
						|
	/* We don't expect to reach here hence just hang */
 | 
						|
	j	_start_hang
 | 
						|
 | 
						|
	.section .entry, "ax", %progbits
 | 
						|
	.align 3
 | 
						|
	.globl _start_hang
 | 
						|
_start_hang:
 | 
						|
	wfi
 | 
						|
	j	_start_hang
 | 
						|
 | 
						|
	.section .entry, "ax", %progbits
 | 
						|
	.align	3
 | 
						|
_hart_lottery:
 | 
						|
	RISCV_PTR	0
 | 
						|
_boot_a0:
 | 
						|
	RISCV_PTR	0
 | 
						|
_boot_a1:
 | 
						|
	RISCV_PTR	0
 |