Re: [PATCH 0/7] remove size limit on XIP kernel

From: Alexandre Ghiti
Date: Sun May 12 2024 - 11:47:57 EST


Hi Nam,

On 10/05/2024 08:28, Nam Cao wrote:
Hi,

For XIP kernel, the writable data section is always at offset specified in
XIP_OFFSET, which is hard-coded to 32MB.

Unfortunately, this means the read-only section (placed before the
writable section) is restricted in size. This causes build failure if the
kernel gets too large.

This series remove the use of XIP_OFFSET one by one, then remove this
macro entirely at the end, with the goal of lifting this size restriction.

Also some cleanup and documentation along the way.

This series depends on
https://lore.kernel.org/linux-riscv/20240508191917.2892064-1-namcao@xxxxxxxxxxxxx/
to apply cleanly, and also depends on
https://lore.kernel.org/linux-riscv/20240508173116.2866192-1-namcao@xxxxxxxxxxxxx/
which fixes a boot issue.

Best regards,
Nam

Nam Cao (7):
riscv: cleanup XIP_FIXUP macro
riscv: replace va_kernel_pa_offset with va_kernel_data_pa_offset on
XIP
riscv: drop the use of XIP_OFFSET in XIP_FIXUP_OFFSET
riscv: drop the use of XIP_OFFSET in XIP_FIXUP_FLASH_OFFSET
riscv: drop the use of XIP_OFFSET in kernel_mapping_va_to_pa()
riscv: drop the use of XIP_OFFSET in create_kernel_page_table()
riscv: remove limit on the size of read-only section for XIP kernel

arch/riscv/include/asm/page.h | 25 ++++++++++++++++++------
arch/riscv/include/asm/pgtable.h | 18 +++++++----------
arch/riscv/include/asm/xip_fixup.h | 30 +++++++++++++++++++++++------
arch/riscv/kernel/vmlinux-xip.lds.S | 4 ++--
arch/riscv/mm/init.c | 11 +++++++----
5 files changed, 59 insertions(+), 29 deletions(-)


XIP kernels are intended for use with flash devices so the XIP_OFFSET restriction actually represents the size of the flash device: IIRC this 32MB was chosen because it would fit "most devices". I think it would be good to come up with a mechanism that allows to restrict the size at build time: a config? XIP kernels are custom kernels so the user could enter its flash size so that if kernel ends up being too large, it fails. And by default, we could a very large size to avoid kernel test robot build failures.

Thanks,

Alex