[PATCH 0/6] riscv: Relocatable NOMMU kernels

Samuel Holland posted 6 patches 1 year, 3 months ago
arch/riscv/Kconfig               | 10 +---
arch/riscv/Makefile              |  1 -
arch/riscv/include/asm/page.h    | 27 ++++-----
arch/riscv/include/asm/pgtable.h |  6 +-
arch/riscv/mm/init.c             | 97 ++++++++++++++++----------------
include/asm-generic/module.h     |  8 ---
6 files changed, 68 insertions(+), 81 deletions(-)
[PATCH 0/6] riscv: Relocatable NOMMU kernels
Posted by Samuel Holland 1 year, 3 months ago
Currently, RISC-V NOMMU kernels are linked at CONFIG_PAGE_OFFSET, and
since they are not relocatable, must be loaded at this address as well.
CONFIG_PAGE_OFFSET is not a user-visible Kconfig option, so its value is
not obvious, and users must patch the kernel source if they want to load
it at a different address.

Make NOMMU kernels more portable by making them relocatable by default.
This allows a single kernel binary to work when loaded at any address.


Samuel Holland (6):
  riscv: Remove duplicate CONFIG_PAGE_OFFSET definition
  riscv: Allow NOMMU kernels to access all of RAM
  riscv: Support CONFIG_RELOCATABLE on NOMMU
  asm-generic: Always define Elf_Rel and Elf_Rela
  riscv: Support CONFIG_RELOCATABLE on riscv32
  riscv: Remove CONFIG_PAGE_OFFSET

 arch/riscv/Kconfig               | 10 +---
 arch/riscv/Makefile              |  1 -
 arch/riscv/include/asm/page.h    | 27 ++++-----
 arch/riscv/include/asm/pgtable.h |  6 +-
 arch/riscv/mm/init.c             | 97 ++++++++++++++++----------------
 include/asm-generic/module.h     |  8 ---
 6 files changed, 68 insertions(+), 81 deletions(-)

-- 
2.45.1
Re: [PATCH 0/6] riscv: Relocatable NOMMU kernels
Posted by Jesse T 1 year, 1 month ago
On Sat, Oct 26, 2024 at 1:16 PM Samuel Holland
<samuel.holland@sifive.com> wrote:
>
> Currently, RISC-V NOMMU kernels are linked at CONFIG_PAGE_OFFSET, and
> since they are not relocatable, must be loaded at this address as well.
> CONFIG_PAGE_OFFSET is not a user-visible Kconfig option, so its value is
> not obvious, and users must patch the kernel source if they want to load
> it at a different address.
>
> Make NOMMU kernels more portable by making them relocatable by default.
> This allows a single kernel binary to work when loaded at any address.
>
>
> Samuel Holland (6):
>   riscv: Remove duplicate CONFIG_PAGE_OFFSET definition
>   riscv: Allow NOMMU kernels to access all of RAM
>   riscv: Support CONFIG_RELOCATABLE on NOMMU
>   asm-generic: Always define Elf_Rel and Elf_Rela
>   riscv: Support CONFIG_RELOCATABLE on riscv32
>   riscv: Remove CONFIG_PAGE_OFFSET
>
>  arch/riscv/Kconfig               | 10 +---
>  arch/riscv/Makefile              |  1 -
>  arch/riscv/include/asm/page.h    | 27 ++++-----
>  arch/riscv/include/asm/pgtable.h |  6 +-
>  arch/riscv/mm/init.c             | 97 ++++++++++++++++----------------
>  include/asm-generic/module.h     |  8 ---
>  6 files changed, 68 insertions(+), 81 deletions(-)
>
> --
> 2.45.1
>
>
> _______________________________________________
> linux-riscv mailing list
> linux-riscv@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-riscv

Any update on this?
Re: [PATCH 0/6] riscv: Relocatable NOMMU kernels
Posted by Palmer Dabbelt 11 months, 4 weeks ago
On Sat, 26 Oct 2024 10:13:52 PDT (-0700), samuel.holland@sifive.com wrote:
> Currently, RISC-V NOMMU kernels are linked at CONFIG_PAGE_OFFSET, and
> since they are not relocatable, must be loaded at this address as well.
> CONFIG_PAGE_OFFSET is not a user-visible Kconfig option, so its value is
> not obvious, and users must patch the kernel source if they want to load
> it at a different address.
>
> Make NOMMU kernels more portable by making them relocatable by default.
> This allows a single kernel binary to work when loaded at any address.
>
>
> Samuel Holland (6):
>   riscv: Remove duplicate CONFIG_PAGE_OFFSET definition
>   riscv: Allow NOMMU kernels to access all of RAM
>   riscv: Support CONFIG_RELOCATABLE on NOMMU
>   asm-generic: Always define Elf_Rel and Elf_Rela
>   riscv: Support CONFIG_RELOCATABLE on riscv32
>   riscv: Remove CONFIG_PAGE_OFFSET
>
>  arch/riscv/Kconfig               | 10 +---
>  arch/riscv/Makefile              |  1 -
>  arch/riscv/include/asm/page.h    | 27 ++++-----
>  arch/riscv/include/asm/pgtable.h |  6 +-
>  arch/riscv/mm/init.c             | 97 ++++++++++++++++----------------
>  include/asm-generic/module.h     |  8 ---
>  6 files changed, 68 insertions(+), 81 deletions(-)

I'm getting some build failures

riscv64-unknown-linux-gnu-ld: arch/riscv/errata/sifive/errata.o: relocation R_RISCV_HI20 against `tlb_flush_all_threshold' can not be used when making a shared object; recompile with -fPIC
riscv64-unknown-linux-gnu-ld: arch/riscv/errata/thead/errata.o: relocation R_RISCV_HI20 against `riscv_cbom_block_size' can not be used when making a shared object; recompile with -fPIC
Re: [PATCH 0/6] riscv: Relocatable NOMMU kernels
Posted by Samuel Holland 11 months, 2 weeks ago
Hi Palmer,

On 2025-02-13 8:17 AM, Palmer Dabbelt wrote:
> On Sat, 26 Oct 2024 10:13:52 PDT (-0700), samuel.holland@sifive.com wrote:
>> Currently, RISC-V NOMMU kernels are linked at CONFIG_PAGE_OFFSET, and
>> since they are not relocatable, must be loaded at this address as well.
>> CONFIG_PAGE_OFFSET is not a user-visible Kconfig option, so its value is
>> not obvious, and users must patch the kernel source if they want to load
>> it at a different address.
>>
>> Make NOMMU kernels more portable by making them relocatable by default.
>> This allows a single kernel binary to work when loaded at any address.
>>
>>
>> Samuel Holland (6):
>>   riscv: Remove duplicate CONFIG_PAGE_OFFSET definition
>>   riscv: Allow NOMMU kernels to access all of RAM
>>   riscv: Support CONFIG_RELOCATABLE on NOMMU
>>   asm-generic: Always define Elf_Rel and Elf_Rela
>>   riscv: Support CONFIG_RELOCATABLE on riscv32
>>   riscv: Remove CONFIG_PAGE_OFFSET
>>
>>  arch/riscv/Kconfig               | 10 +---
>>  arch/riscv/Makefile              |  1 -
>>  arch/riscv/include/asm/page.h    | 27 ++++-----
>>  arch/riscv/include/asm/pgtable.h |  6 +-
>>  arch/riscv/mm/init.c             | 97 ++++++++++++++++----------------
>>  include/asm-generic/module.h     |  8 ---
>>  6 files changed, 68 insertions(+), 81 deletions(-)
> 
> I'm getting some build failures
> 
> riscv64-unknown-linux-gnu-ld: arch/riscv/errata/sifive/errata.o: relocation
> R_RISCV_HI20 against `tlb_flush_all_threshold' can not be used when making a
> shared object; recompile with -fPIC
> riscv64-unknown-linux-gnu-ld: arch/riscv/errata/thead/errata.o: relocation
> R_RISCV_HI20 against `riscv_cbom_block_size' can not be used when making a
> shared object; recompile with -fPIC

What toolchain and config do you see failures with? I have tried building this
series on top of v6.14-rc4 with GCC 14.2.1 and
 * defconfig
 * defconfig + NOMMU + S-mode
 * defconfig + NOMMU + M-mode
 * defconfig + 32-bit
 * defconfig + 32-bit + NOMMU + S-mode
 * defconfig + 32-bit + NOMMU + M-Mode
 * nommu_k210_defconfig
 * nommu_k210_sdcard_defconfig
 * nommu_virt_defconfig
and all succeed.

Regards,
Samuel

Re: [PATCH 0/6] riscv: Relocatable NOMMU kernels
Posted by Palmer Dabbelt 10 months, 2 weeks ago
On Wed, 26 Feb 2025 07:22:51 PST (-0800), samuel.holland@sifive.com wrote:
> Hi Palmer,
>
> On 2025-02-13 8:17 AM, Palmer Dabbelt wrote:
>> On Sat, 26 Oct 2024 10:13:52 PDT (-0700), samuel.holland@sifive.com wrote:
>>> Currently, RISC-V NOMMU kernels are linked at CONFIG_PAGE_OFFSET, and
>>> since they are not relocatable, must be loaded at this address as well.
>>> CONFIG_PAGE_OFFSET is not a user-visible Kconfig option, so its value is
>>> not obvious, and users must patch the kernel source if they want to load
>>> it at a different address.
>>>
>>> Make NOMMU kernels more portable by making them relocatable by default.
>>> This allows a single kernel binary to work when loaded at any address.
>>>
>>>
>>> Samuel Holland (6):
>>>   riscv: Remove duplicate CONFIG_PAGE_OFFSET definition
>>>   riscv: Allow NOMMU kernels to access all of RAM
>>>   riscv: Support CONFIG_RELOCATABLE on NOMMU
>>>   asm-generic: Always define Elf_Rel and Elf_Rela
>>>   riscv: Support CONFIG_RELOCATABLE on riscv32
>>>   riscv: Remove CONFIG_PAGE_OFFSET
>>>
>>>  arch/riscv/Kconfig               | 10 +---
>>>  arch/riscv/Makefile              |  1 -
>>>  arch/riscv/include/asm/page.h    | 27 ++++-----
>>>  arch/riscv/include/asm/pgtable.h |  6 +-
>>>  arch/riscv/mm/init.c             | 97 ++++++++++++++++----------------
>>>  include/asm-generic/module.h     |  8 ---
>>>  6 files changed, 68 insertions(+), 81 deletions(-)
>>
>> I'm getting some build failures
>>
>> riscv64-unknown-linux-gnu-ld: arch/riscv/errata/sifive/errata.o: relocation
>> R_RISCV_HI20 against `tlb_flush_all_threshold' can not be used when making a
>> shared object; recompile with -fPIC
>> riscv64-unknown-linux-gnu-ld: arch/riscv/errata/thead/errata.o: relocation
>> R_RISCV_HI20 against `riscv_cbom_block_size' can not be used when making a
>> shared object; recompile with -fPIC
>
> What toolchain and config do you see failures with? I have tried building this
> series on top of v6.14-rc4 with GCC 14.2.1 and
>  * defconfig
>  * defconfig + NOMMU + S-mode
>  * defconfig + NOMMU + M-mode
>  * defconfig + 32-bit
>  * defconfig + 32-bit + NOMMU + S-mode
>  * defconfig + 32-bit + NOMMU + M-Mode
>  * nommu_k210_defconfig
>  * nommu_k210_sdcard_defconfig
>  * nommu_virt_defconfig
> and all succeed.

rv32 allmodconfig does it.

I don't actually know what's going on, but it seems that something in 
Kconfig land has flipped over and ended up building medlow with these.  
The erata handling can't be proper PIC (see 8dc2a7e8027f ("riscv: Fix 
relocatable kernels with early alternatives using -fno-pie")), but that 
one was just wrong -- they need to be medany, otherwise they're 
very-non-relocatable.

I feel like it's possible to construct Kconfigs that break this without 
your patch set, but not 100% sure there.  Either way I sent a patch
<https://lore.kernel.org/all/20250326224506.27165-2-palmer@rivosinc.com/>

>
> Regards,
> Samuel