RTEMS | Add RISCV libdl support (!312)

Pavel Pisa (@ppisa) gitlab at rtems.org
Sun Nov 17 17:19:22 UTC 2024




Pavel Pisa commented: https://gitlab.rtems.org/rtems/rtos/rtems/-/merge_requests/312#note_115090


I have applied your changes and tried to call `dlopen` on BeaglV-Fire from my test application

https://github.com/ppisa/rtems-devel/tree/master/rtems-omk-template/appdl

which calls `shell_dlopen` and tries to load simple ELF file

build from https://github.com/ppisa/rtems-devel/blob/master/rtems-omk-template/appdl/examples/appdl_print.c

And the result is exception

```
SHLL [/] # dlopen bin/appdl_print-riscv64.o

*** FATAL ***
fatal source: 9 (RTEMS_FATAL_SOURCE_EXCEPTION)
CPU: 0
mstatus 0x8000000a00007880
mcause  0x0000000000000004
mepc    0x00000010000271a8
ra      0x000000100002949c
sp      0x00000010000d9ef0
gp      0x0000001000093800
tp      0x00000010000dabc8
t0      0x0000000000000000
t1      0x0000000000000001
t2      0xffffffffffffffff
s0      0x00000010001b97e6
s1      0x00000010001b8660
a0      0xffffffffffe986c2
a1      0x0000001000089e48
a2      0x00000010001b8940
a3      0x0000006000000013
a4      0x00000010000271a8
a5      0x0000000000051ea8
a6      0x00000010001a67a6
a7      0x0000000000051ea8
s2      0x0000000000051ea8
s3      0x00000010000da008
s4      0x00000010001a67a6
s5      0x00000010001b88e0
s6      0x00000010001b0ea0
s7      0x0000000000000018
s8      0x0000000000000060
s9      0x0000000000000004
s10     0x0000000000000001
s11     0x00000010001b8d60
t3      0x0000000000000038
t4      0x0000000000000000
t5      0x000000580000003c
t6      0x0000000000000038
fcsr    0x00000000
RTEMS version: 6.0.0.e049757c58-modified
RTEMS tools: 13.3.0 20240521 (RTEMS 6, RSB e52d2288c8a0df64466010839ca1eb40c6d243ed, Newlib 1b3dcfd)
executing thread ID: 0x0a010004
executing thread name: SHLL
```

I do not have JTAG cable with special connector yet. So I have trued to decode problem from the reported mepc. GDB decodes location as

```
0x10000271a8 <rtems_rtl_elf_relocate_rela+270>:      lw      a4,0(s0)
```

If I try to decode to line `l * 0x10000271a8`

then it points to the function `rtems_rtl_elf_relocate_rela`

```
0x10000271a8 is in rtems_rtl_elf_relocate_rela (../../../../../git/rtems/cpukit/libdl/rtl-mdreloc-riscv.c:128).
```

But if I try next location then it points to

```
0x10000271aa is in rtems_rtl_elf_relocate_rela (../../../../../git/rtems/cpukit/libdl/rtl-mdreloc-riscv.c:364).

```

```
359       case R_TYPE(CALL): {
360         int64_t hi = SignExtend64(pcrel_val + 0x800, bits);
361         write32le(where, (read32le(where) & 0xFFF) | (hi & 0xFFFFF000));
362         int64_t hi20 = SignExtend64(pcrel_val + 0x800, bits);
363         int64_t lo = pcrel_val - (hi20 << 12);
364         write32le(((char *) where) + 4, (read32le(((char *) where) + 4) & 0xFFFFF) | ((lo & 0xFFF) << 20));
365       }
366       break;
```

I have found way how to convert RTEMS generate ELF to HSS payload relatively easily by direct call of `hss-payload-generator`.

I use `rtems-config.yaml`:
```
set-name: 'PolarFire-SoC-HSS::RTEMSImage'
hart-entry-points: {u54_1: '0x1000000000', u54_2: '0x1000000000', u54_3: '0x1000000000', u54_4: '0x1000000000'}
payloads:
  rtems-app.elf: {exec-addr: '0x1000000000', owner-hart: u54_1, secondary-hart: u54_2, secondary-hart: u54_3, secondary-hart: u54_4, priv-mode: prv_m, skip-opensbi: true, payload-name: "rtems-app"}
```
and then run in terminal
```
hss-payload-generator -c rtems-config.yaml rtems-payload.bin
```

-- 
View it on GitLab: https://gitlab.rtems.org/rtems/rtos/rtems/-/merge_requests/312#note_115090
You're receiving this email because of your account on gitlab.rtems.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/bugs/attachments/20241117/904be257/attachment-0001.htm>


More information about the bugs mailing list