[PATCH v3 5/5] Add two entries:

Jessica Clarke jrtc27 at jrtc27.com
Wed Jan 25 12:36:32 PST 2023


On 25 Jan 2023, at 20:14, Jessica Clarke <jrtc27 at jrtc27.com> wrote:
> 
> On 25 Jan 2023, at 19:42, Lad, Prabhakar <prabhakar.csengg at gmail.com> wrote:
>> 
>> Hi Himanshu,
>> 
>> On Thu, Jan 19, 2023 at 3:19 PM Himanshu Chauhan
>> <hchauhan at ventanamicro.com> wrote:
>>> 
>>> 1. TEXT: fw_start to _fw_rw_offset with RX permissions
>>> 2. DATA: _fw_rw_offset to fw_size with RW permissions
>>> 
>>> These permissions are still not enforced from M-mode but lay
>>> the ground work for enforcing them for M-mode. SU-mode don't
>>> have any access to these regions.
>>> 
>>> Sample output:
>>> Domain0 Region01  : 0x0000000080000000-0x000000008001ffff M: (R,X) S/U: ()
>>> Domain0 Region02  : 0x0000000080020000-0x000000008003ffff M: (R,W) S/U: ()
>>> 
>>> Signed-off-by: Himanshu Chauhan <hchauhan at ventanamicro.com>
>>> ---
>>> lib/sbi/sbi_domain.c | 24 ++++++++++++++++++++++--
>>> 1 file changed, 22 insertions(+), 2 deletions(-)
>>> 
>> After updating to the latest master, RZ/Five SoC doesn't boot up.
>> Bisecting pointed me to this commit 230278d "lib: sbi: Add separate
>> entries for firmware RX and RW regions"
>> 
>> I get no prints from OpenSBI ; the only prints I get are from SPL.
>> After reverting this patch I get RZ/Five working as expected (log
>> below). Do you see any reason why this fails on RZ/Five ?
>> 
>> U-Boot SPL 2023.01-00206-g1026336bc6 (Jan 25 2023 - 19:36:23 +0000)
>> Trying to boot from NOR
>> 
>> OpenSBI v1.2-40-g031b6db
>>  ____                    _____ ____ _____
>> / __ \                  / ____|  _ \_   _|
>> | |  | |_ __   ___ _ __ | (___ | |_) || |
>> | |  | | '_ \ / _ \ '_ \ \___ \|  _ < | |
>> | |__| | |_) |  __/ | | |____) | |_) || |_
>> \____/| .__/ \___|_| |_|_____/|____/_____|
>>       | |
>>       |_|
>> 
>> Platform Name             : Renesas SMARC EVK based on r9a07g043f01
>> Platform Features         : medeleg
>> Platform HART Count       : 1
>> Platform IPI Device       : andes_plicsw
>> Platform Timer Device     : andes_plmt @ 12000000Hz
>> Platform Console Device   : renesas_scif
>> Platform HSM Device       : ---
>> Platform PMU Device       : ---
>> Platform Reboot Device    : ---
>> Platform Shutdown Device  : ---
>> Firmware Base             : 0x44000000
>> Firmware Size             : 228 KB
>> Firmware RW Offset        : 0xffffffffc4020000
> 
> This is clearly nonsense. What does readelf -Ws show for _fw_rw_offset?
> 
> Worth noting that 0x44000000 + 0xffffffffc4020000 = 0x8020000, so it
> sounds like relocation inconsistency to me somehow…

Ok, figured it out, this is an LLD vs BFD linker script difference. For
whatever reason, BFD decides that . - _fw_start is not an absolute
address, whereas LLD gives you the more sensible (or at least what we
want here) behaviour, probably because . = in the various output
section statements makes it a relative address, but _fw_start remains
absolute, and so it thinks you’re trying to compute relative -
absolute, which gives a relative address. This then means that the
value located at __fw_rw_offset is subject to relocation and so loading
at an address other than 0x80000000 breaks things like you see (your
observed _fw_rw_offset value is out by 0x44000000 - 0x80000000). The
following diff should fix it (I’ve verified it with a toy example with
BFD that reproduced the symbol not being absolute); let me know if it
does and I’ll make a proper patch out of it.

Jess

diff --git a/firmware/fw_base.ldS b/firmware/fw_base.ldS
index 9a1304e..918357d 100644
--- a/firmware/fw_base.ldS
+++ b/firmware/fw_base.ldS
@@ -64,7 +64,7 @@
 	. = ALIGN(1 << LOG2CEIL((SIZEOF(.rodata) + SIZEOF(.text)
 				+ SIZEOF(.dynsym) + SIZEOF(.rela.dyn))));
 
-	PROVIDE(_fw_rw_offset = (.  - _fw_start));
+	PROVIDE(_fw_rw_offset = ABSOLUTE(. - _fw_start));
 
 	/* Beginning of the read-write data sections */
 

Jess


More information about the opensbi mailing list