Message ID | 8748eab99d76e466a44a0bb81d836ff1c9ad9879.1715286093.git.namcao@linutronix.de (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | remove size limit on XIP kernel | expand |
Context | Check | Description |
---|---|---|
conchuod/vmtest-fixes-PR | fail | merge-conflict |
On 10/05/2024 08:28, Nam Cao wrote: > XIP_OFFSET is the hard-coded offset of writable data section within the > kernel. > > By hard-coding this value, the read-only section of the kernel (which is > placed before the writable data section) is restricted in size. > > As a preparation to remove this hard-coded value entirely, stop using > XIP_OFFSET in create_kernel_page_table(). Instead use _sdata and _start to > do the same thing. > > Signed-off-by: Nam Cao <namcao@linutronix.de> > --- > arch/riscv/mm/init.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c > index 9846c6924509..62ff4aa2be96 100644 > --- a/arch/riscv/mm/init.c > +++ b/arch/riscv/mm/init.c > @@ -907,7 +907,7 @@ static void __init relocate_kernel(void) > static void __init create_kernel_page_table(pgd_t *pgdir, > __always_unused bool early) > { > - uintptr_t va, end_va; > + uintptr_t va, start_va, end_va; > > /* Map the flash resident part */ > end_va = kernel_map.virt_addr + kernel_map.xiprom_sz; > @@ -917,10 +917,11 @@ static void __init create_kernel_page_table(pgd_t *pgdir, > PMD_SIZE, PAGE_KERNEL_EXEC); > > /* Map the data in RAM */ > + start_va = kernel_map.virt_addr + (uintptr_t)&_sdata - (uintptr_t)&_start; > end_va = kernel_map.virt_addr + kernel_map.size; > - for (va = kernel_map.virt_addr + XIP_OFFSET; va < end_va; va += PMD_SIZE) > + for (va = start_va; va < end_va; va += PMD_SIZE) > create_pgd_mapping(pgdir, va, > - kernel_map.phys_addr + (va - (kernel_map.virt_addr + XIP_OFFSET)), > + kernel_map.phys_addr + (va - start_va), > PMD_SIZE, PAGE_KERNEL); > } > #else Reviewed-by: Alexandre Ghiti <alexghiti@rivosinc.com> Thanks, Alex
diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c index 9846c6924509..62ff4aa2be96 100644 --- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c @@ -907,7 +907,7 @@ static void __init relocate_kernel(void) static void __init create_kernel_page_table(pgd_t *pgdir, __always_unused bool early) { - uintptr_t va, end_va; + uintptr_t va, start_va, end_va; /* Map the flash resident part */ end_va = kernel_map.virt_addr + kernel_map.xiprom_sz; @@ -917,10 +917,11 @@ static void __init create_kernel_page_table(pgd_t *pgdir, PMD_SIZE, PAGE_KERNEL_EXEC); /* Map the data in RAM */ + start_va = kernel_map.virt_addr + (uintptr_t)&_sdata - (uintptr_t)&_start; end_va = kernel_map.virt_addr + kernel_map.size; - for (va = kernel_map.virt_addr + XIP_OFFSET; va < end_va; va += PMD_SIZE) + for (va = start_va; va < end_va; va += PMD_SIZE) create_pgd_mapping(pgdir, va, - kernel_map.phys_addr + (va - (kernel_map.virt_addr + XIP_OFFSET)), + kernel_map.phys_addr + (va - start_va), PMD_SIZE, PAGE_KERNEL); } #else
XIP_OFFSET is the hard-coded offset of writable data section within the kernel. By hard-coding this value, the read-only section of the kernel (which is placed before the writable data section) is restricted in size. As a preparation to remove this hard-coded value entirely, stop using XIP_OFFSET in create_kernel_page_table(). Instead use _sdata and _start to do the same thing. Signed-off-by: Nam Cao <namcao@linutronix.de> --- arch/riscv/mm/init.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)