Messages in this thread | | | Date | Wed, 8 May 2024 21:43:11 +0200 | Subject | Re: [PATCH] riscv: change XIP's kernel_map.size to be size of the entire kernel | From | Alexandre Ghiti <> |
| |
Hi Nam,
On 08/05/2024 21:19, Nam Cao wrote: > With XIP kernel, kernel_map.size is set to be only the size of data part of > the kernel. This is inconsistent with "normal" kernel, who sets it to be > the size of the entire kernel. > > More importantly, XIP kernel fails to boot if CONFIG_DEBUG_VIRTUAL is > enabled, because there are checks on virtual addresses with the assumption > that kernel_map.size is the size of the entire kernel (these checks are in > arch/riscv/mm/physaddr.c). > > Change XIP's kernel_map.size to be the size of the entire kernel. > > Signed-off-by: Nam Cao <namcao@linutronix.de> > Cc: <stable@vger.kernel.org> # v6.1+ > --- > I wouldn't consider this inconsistency to be a bug. It only became a > a problem after kernel_map.size is used to check virtual addresses in > 5f763b3b5960 ("riscv: Fix DEBUG_VIRTUAL false warnings"). So I will only > backport this to stable versions that contain this commit: v6.1+ > > arch/riscv/mm/init.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c > index c081e7d349b1..0c0562839899 100644 > --- a/arch/riscv/mm/init.c > +++ b/arch/riscv/mm/init.c > @@ -903,7 +903,7 @@ static void __init create_kernel_page_table(pgd_t *pgdir, > PMD_SIZE, PAGE_KERNEL_EXEC); > > /* Map the data in RAM */ > - end_va = kernel_map.virt_addr + XIP_OFFSET + kernel_map.size; > + end_va = kernel_map.virt_addr + kernel_map.size; > for (va = kernel_map.virt_addr + XIP_OFFSET; va < end_va; va += PMD_SIZE) > create_pgd_mapping(pgdir, va, > kernel_map.phys_addr + (va - (kernel_map.virt_addr + XIP_OFFSET)), > @@ -1072,7 +1072,7 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa) > > phys_ram_base = CONFIG_PHYS_RAM_BASE; > kernel_map.phys_addr = (uintptr_t)CONFIG_PHYS_RAM_BASE; > - kernel_map.size = (uintptr_t)(&_end) - (uintptr_t)(&_sdata); > + kernel_map.size = (uintptr_t)(&_end) - (uintptr_t)(&_start); > > kernel_map.va_kernel_xip_pa_offset = kernel_map.virt_addr - kernel_map.xiprom; > #else
You can add:
Reviewed-by: Alexandre Ghiti <alexghiti@rivosinc.com>
Thanks,
Alex
| |