Skip to content

Enabling CONFIG_ISR_TABLES_LOCAL_DECLARATION for nrf54l15 flpr CPU outputs non-working image #97846

@thedjnK

Description

@thedjnK

Describe the bug

This option can be selected, indicating that it should be supported, but seemingly it does not appear to be. Partial output of map file with this Kconfig disabled (this is being tested with the hello_world sample application, the vpr_launcher image is included to allow it to boot):

.rel.plt        0x0000000000000000        0x0
 *(SORT_BY_ALIGNMENT(.rel.plt))
                [!provide]                        PROVIDE (__rel_iplt_start = .)
 *(SORT_BY_ALIGNMENT(.rel.iplt))
                [!provide]                        PROVIDE (__rel_iplt_end = .)

.rela.plt       0x0000000000000000        0x0
 *(SORT_BY_ALIGNMENT(.rela.plt))
                [!provide]                        PROVIDE (__rela_iplt_start = .)
 *(SORT_BY_ALIGNMENT(.rela.iplt))
                [!provide]                        PROVIDE (__rela_iplt_end = .)

.rel.dyn
 *(SORT_BY_ALIGNMENT(.rel.*))

.rela.dyn       0x0000000020028000        0x0
 *(SORT_BY_ALIGNMENT(.rela.*))
 .rela.sdata._char_out
                0x0000000020028000        0x0 zephyr/CMakeFiles/zephyr_final.dir/isr_tables.c.obj
 .rela.vectors.__start
                0x0000000020028000        0x0 zephyr/CMakeFiles/zephyr_final.dir/isr_tables.c.obj
...
 .rela.rodata.levels.0
                0x0000000020028000        0x0 zephyr/CMakeFiles/zephyr_final.dir/isr_tables.c.obj

.plt
 *(SORT_BY_ALIGNMENT(.plt))

.iplt
 *(SORT_BY_ALIGNMENT(.iplt))
                0x0000000020028000                __rom_region_start = 0x20028000

rom_start       0x0000000020028000      0x57c
                0x0000000020028000                . = ALIGN (0x10)
                0x0000000020028000                __rom_start_address = .
 FILL mask 0x00
                0x0000000020028000                . = (. + (0x0 - (. - __rom_start_address)))
                0x0000000020028000                . = ALIGN (0x4)
 *(SORT_BY_ALIGNMENT(.vectors.*))
 .vectors.__start
                0x0000000020028000       0x2c zephyr/libzephyr.a(vector.S.obj)
                0x0000000020028000                __start
                0x0000000020028100                . = ALIGN (0x100)
 *fill*         0x000000002002802c       0xd4 00
 *(SORT_BY_ALIGNMENT(.gnu.linkonce.irq_vector_table*))
 .gnu.linkonce.irq_vector_table
                0x0000000020028100      0x47c zephyr/CMakeFiles/zephyr_final.dir/isr_tables.c.obj
                0x0000000020028100                _irq_vector_table
                0x000000002002857c                _vector_end = .

reset           0x000000002002857c        0x4
 *(SORT_BY_ALIGNMENT(.reset.*))

And with the option enabled:

.rel.plt        0x0000000000000000        0x0
 *(SORT_BY_ALIGNMENT(.rel.plt))
                [!provide]                        PROVIDE (__rel_iplt_start = .)
 *(SORT_BY_ALIGNMENT(.rel.iplt))
                [!provide]                        PROVIDE (__rel_iplt_end = .)

.rela.plt       0x0000000000000000        0x0
 *(SORT_BY_ALIGNMENT(.rela.plt))
                [!provide]                        PROVIDE (__rela_iplt_start = .)
 *(SORT_BY_ALIGNMENT(.rela.iplt))
                [!provide]                        PROVIDE (__rela_iplt_end = .)

.rel.dyn
 *(SORT_BY_ALIGNMENT(.rel.*))

.rela.dyn       0x0000000020028000        0x0
 *(SORT_BY_ALIGNMENT(.rela.*))
 .rela.text.cbvprintf_package
                0x0000000020028000        0x0 zephyr/CMakeFiles/zephyr_final.dir/isr_tables.c.obj
 .rela.text.cbprintf_package_convert
                0x0000000020028000        0x0 zephyr/CMakeFiles/zephyr_final.dir/isr_tables.c.obj
.....
.iplt
 *(SORT_BY_ALIGNMENT(.iplt))
                0x0000000020028000                __rom_region_start = 0x20028000

rom_start       0x0000000020028000      0x4a8
                0x0000000020028000                . = ALIGN (0x10)
                0x0000000020028000                __rom_start_address = .
 FILL mask 0x00
                0x0000000020028000                . = (. + (0x0 - (. - __rom_start_address)))
                0x0000000020028000                . = ALIGN (0x4)
                0x0000000020028000                _irq_vector_table = .
 *(SORT_BY_ALIGNMENT(.irq_spurious.0x0))
 .irq_spurious.0x0
                0x0000000020028000        0x4 zephyr/CMakeFiles/zephyr_final.dir/isr_tables.c.obj
 *(SORT_BY_ALIGNMENT(.irq_spurious.0x1))
 .irq_spurious.0x1
                0x0000000020028004        0x4 zephyr/CMakeFiles/zephyr_final.dir/isr_tables.c.obj
 *(SORT_BY_ALIGNMENT(.irq_spurious.0x2))
 .irq_spurious.0x2
                0x0000000020028008        0x4 zephyr/CMakeFiles/zephyr_final.dir/isr_tables.c.obj
 *(SORT_BY_ALIGNMENT(.irq_spurious.0x3))
 .irq_spurious.0x3
                0x000000002002800c        0x4 zephyr/CMakeFiles/zephyr_final.dir/isr_tables.c.obj
... (these spurious go on for ages...)
 .irq_spurious.0x11e
                0x0000000020028478        0x4 zephyr/CMakeFiles/zephyr_final.dir/isr_tables.c.obj
 *(SORT_BY_ALIGNMENT(.vectors.__start))
 .vectors.__start
                0x000000002002847c       0x2c zephyr/libzephyr.a(vector.S.obj)
                0x000000002002847c                __start
                0x00000000200284a8                _vector_end = .

reset           0x00000000200284a8        0x4
 *(SORT_BY_ALIGNMENT(.reset.*))
 .reset.__reset
                0x00000000200284a8        0x4 zephyr/arch/arch/riscv/core/libarch__riscv__core.a(reset.S.obj)
                0x00000000200284a8                __reset

I'm not a RISCV architectural person but to me the __start vector looks to be placed at a wholly garbage address for some reason when it should be right at the start?

Regression

  • This is a regression.

Steps to reproduce

Build hello_world for nrf54l15dk/nrf54l15/cpuflpr with CONFIG_ISR_TABLES_LOCAL_DECLARATION enabled

Relevant log output

Impact

Major – Severely degrades functionality; workaround is difficult or unavailable.

Environment

Commit: fd51dde

Additional Context

No response

Metadata

Metadata

Labels

area: RISCVRISCV Architecture (32-bit & 64-bit)bugThe issue is a bug, or the PR is fixing a bugplatform: nRFNordic nRFxpriority: lowLow impact/importance bug

Type

Projects

Status

To triage

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions