firmware: Use lla to access all global symbols

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>
This commit is contained in:
Vincent Chen
2021-03-17 09:16:37 +08:00
committed by Anup Patel
parent ff5bd949d5
commit 22d8ee9758
5 changed files with 64 additions and 64 deletions

View File

@@ -54,7 +54,7 @@ fw_boot_hart:
*/
fw_save_info:
/* Save next arg1 in 'a1' */
la a4, _dynamic_next_arg1
lla a4, _dynamic_next_arg1
REG_S a1, (a4)
/* Sanity checks */
@@ -66,13 +66,13 @@ fw_save_info:
bgt a3, a4, _bad_dynamic_info
/* Save version == 0x1 fields */
la a4, _dynamic_next_addr
lla a4, _dynamic_next_addr
REG_L a3, FW_DYNAMIC_INFO_NEXT_ADDR_OFFSET(a2)
REG_S a3, (a4)
la a4, _dynamic_next_mode
lla a4, _dynamic_next_mode
REG_L a3, FW_DYNAMIC_INFO_NEXT_MODE_OFFSET(a2)
REG_S a3, (a4)
la a4, _dynamic_options
lla a4, _dynamic_options
REG_L a3, FW_DYNAMIC_INFO_OPTIONS_OFFSET(a2)
REG_S a3, (a4)
@@ -80,7 +80,7 @@ fw_save_info:
li a4, 0x2
REG_L a3, FW_DYNAMIC_INFO_VERSION_OFFSET(a2)
blt a3, a4, 2f
la a4, _dynamic_boot_hart
lla a4, _dynamic_boot_hart
REG_L a3, FW_DYNAMIC_INFO_BOOT_HART_OFFSET(a2)
REG_S a3, (a4)
2:
@@ -96,7 +96,7 @@ fw_save_info:
* The next arg1 should be returned in 'a0'.
*/
fw_next_arg1:
la a0, _dynamic_next_arg1
lla a0, _dynamic_next_arg1
REG_L a0, (a0)
ret
@@ -108,7 +108,7 @@ fw_next_arg1:
* The next address should be returned in 'a0'.
*/
fw_next_addr:
la a0, _dynamic_next_addr
lla a0, _dynamic_next_addr
REG_L a0, (a0)
ret
@@ -120,7 +120,7 @@ fw_next_addr:
* The next address should be returned in 'a0'
*/
fw_next_mode:
la a0, _dynamic_next_mode
lla a0, _dynamic_next_mode
REG_L a0, (a0)
ret
@@ -133,7 +133,7 @@ fw_next_mode:
* The next address should be returned in 'a0'.
*/
fw_options:
la a0, _dynamic_options
lla a0, _dynamic_options
REG_L a0, (a0)
ret