riscv: remove limit on the size of read-only section for XIP kernel
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. This causes build failures if the kernel gets too big [1]. Remove this limit. Reported-by: kernel test robot <lkp@intel.com> Closes: https://lore.kernel.org/oe-kbuild-all/202404211031.J6l2AfJk-lkp@intel.com [1] Signed-off-by: Nam Cao <namcao@linutronix.de> Reviewed-by: Alexandre Ghiti <alexghiti@rivosinc.com> Link: https://lore.kernel.org/r/3bf3a77be10ebb0d8086c028500baa16e7a8e648.1717789719.git.namcao@linutronix.de Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
This commit is contained in:
parent
a7cfb99943
commit
b635a84bde
@ -107,13 +107,6 @@
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_XIP_KERNEL
|
|
||||||
#define XIP_OFFSET SZ_32M
|
|
||||||
#define XIP_OFFSET_MASK (SZ_32M - 1)
|
|
||||||
#else
|
|
||||||
#define XIP_OFFSET 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
@ -46,7 +46,7 @@ bool kernel_page_present(struct page *page);
|
|||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
#ifdef CONFIG_STRICT_KERNEL_RWX
|
#if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_XIP_KERNEL)
|
||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
#define SECTION_ALIGN (1 << 21)
|
#define SECTION_ALIGN (1 << 21)
|
||||||
#else
|
#else
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
#include <asm/thread_info.h>
|
#include <asm/thread_info.h>
|
||||||
|
#include <asm/set_memory.h>
|
||||||
|
|
||||||
OUTPUT_ARCH(riscv)
|
OUTPUT_ARCH(riscv)
|
||||||
ENTRY(_start)
|
ENTRY(_start)
|
||||||
@ -65,10 +66,10 @@ SECTIONS
|
|||||||
* From this point, stuff is considered writable and will be copied to RAM
|
* From this point, stuff is considered writable and will be copied to RAM
|
||||||
*/
|
*/
|
||||||
__data_loc = ALIGN(PAGE_SIZE); /* location in file */
|
__data_loc = ALIGN(PAGE_SIZE); /* location in file */
|
||||||
. = KERNEL_LINK_ADDR + XIP_OFFSET; /* location in memory */
|
. = ALIGN(SECTION_ALIGN); /* location in memory */
|
||||||
|
|
||||||
#undef LOAD_OFFSET
|
#undef LOAD_OFFSET
|
||||||
#define LOAD_OFFSET (KERNEL_LINK_ADDR + XIP_OFFSET - (__data_loc & XIP_OFFSET_MASK))
|
#define LOAD_OFFSET (KERNEL_LINK_ADDR + _sdata - __data_loc)
|
||||||
|
|
||||||
_sdata = .; /* Start of data section */
|
_sdata = .; /* Start of data section */
|
||||||
_data = .;
|
_data = .;
|
||||||
|
Loading…
Reference in New Issue
Block a user