Commit 9b3a2be8 authored by Nam Cao's avatar Nam Cao Committed by Paul Walmsley
Browse files

riscv: Remove support for XIP kernel

XIP has a history of being broken for long periods of time. In 2023, it was
broken for 18 months before getting fixed [1]. In 2024 it was 4 months [2].

And now it is broken again since commit a44fb572 ("riscv: Add runtime
constant support"), 10 months ago.

These are clear signs that XIP feature is not being used.

I occasionally looked after XIP, but mostly because I was bored and had
nothing better to do.

Remove XIP support. Revert is possible if someone shows up complaining.

Link: https://lore.kernel.org/linux-riscv/20231212-customary-hardcover-e19462bf8e75@wendy/ [1]
Link: https://lore.kernel.org/linux-riscv/20240526110104.470429-1-namcao@linutronix.de/

 [2]
Signed-off-by: default avatarNam Cao <namcao@linutronix.de>
Cc: Frederik Haxel <haxel@fzi.de>
Cc: Vitaly Wool <vitaly.wool@konsulko.com>
Reviewed-by: default avatarJisheng Zhang <jszhang@kernel.org>
Acked-by: default avatarConor Dooley <conor.dooley@microchip.com>
Link: https://patch.msgid.link/20260202115403.2119218-1-namcao@linutronix.de


[pjw@kernel.org: updated to apply]
Signed-off-by: default avatarPaul Walmsley <pjw@kernel.org>
parent 74aefe13
Loading
Loading
Loading
Loading
+23 −63
Original line number Diff line number Diff line
@@ -48,8 +48,8 @@ config RISCV
	select ARCH_HAS_PTE_SPECIAL
	select ARCH_HAS_SET_DIRECT_MAP if MMU
	select ARCH_HAS_SET_MEMORY if MMU
	select ARCH_HAS_STRICT_KERNEL_RWX if MMU && !XIP_KERNEL
	select ARCH_HAS_STRICT_MODULE_RWX if MMU && !XIP_KERNEL
	select ARCH_HAS_STRICT_KERNEL_RWX if MMU
	select ARCH_HAS_STRICT_MODULE_RWX if MMU
	select ARCH_HAS_SYNC_CORE_BEFORE_USERMODE
	select ARCH_HAS_SYSCALL_WRAPPER
	select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
@@ -85,7 +85,7 @@ config RISCV
	select ARCH_WANT_FRAME_POINTERS
	select ARCH_WANT_GENERAL_HUGETLB if !RISCV_ISA_SVNAPOT
	select ARCH_WANT_HUGE_PMD_SHARE if 64BIT
	select ARCH_WANT_LD_ORPHAN_WARN if !XIP_KERNEL
	select ARCH_WANT_LD_ORPHAN_WARN
	select ARCH_WANT_OPTIMIZE_DAX_VMEMMAP
	select ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP
	select ARCH_WANTS_NO_INSTR
@@ -131,13 +131,13 @@ config RISCV
	select HAVE_ARCH_AUDITSYSCALL
	select HAVE_ARCH_HUGE_VMALLOC if HAVE_ARCH_HUGE_VMAP
	select HAVE_ARCH_HUGE_VMAP if MMU && 64BIT
	select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL
	select HAVE_ARCH_JUMP_LABEL_RELATIVE if !XIP_KERNEL
	select HAVE_ARCH_JUMP_LABEL
	select HAVE_ARCH_JUMP_LABEL_RELATIVE
	select HAVE_ARCH_KASAN if MMU && 64BIT
	select HAVE_ARCH_KASAN_VMALLOC if MMU && 64BIT
	select HAVE_ARCH_KFENCE if MMU && 64BIT
	select HAVE_ARCH_KSTACK_ERASE
	select HAVE_ARCH_KGDB if !XIP_KERNEL
	select HAVE_ARCH_KGDB
	select HAVE_ARCH_KGDB_QXFER_PKT
	select HAVE_ARCH_MMAP_RND_BITS if MMU
	select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT
@@ -155,7 +155,7 @@ config RISCV
	select HAVE_CONTEXT_TRACKING_USER
	select HAVE_DEBUG_KMEMLEAK
	select HAVE_DMA_CONTIGUOUS if MMU
	select HAVE_DYNAMIC_FTRACE if !XIP_KERNEL && MMU && (CLANG_SUPPORTS_DYNAMIC_FTRACE || GCC_SUPPORTS_DYNAMIC_FTRACE)
	select HAVE_DYNAMIC_FTRACE if MMU && (CLANG_SUPPORTS_DYNAMIC_FTRACE || GCC_SUPPORTS_DYNAMIC_FTRACE)
	select FUNCTION_ALIGNMENT_4B if HAVE_DYNAMIC_FTRACE && RISCV_ISA_C
	select HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS if HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS
	select HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS if (DYNAMIC_FTRACE_WITH_ARGS && !CFI)
@@ -163,7 +163,7 @@ config RISCV
	select HAVE_FTRACE_GRAPH_FUNC
	select HAVE_FUNCTION_GRAPH_TRACER if HAVE_DYNAMIC_FTRACE_WITH_ARGS
	select HAVE_FUNCTION_GRAPH_FREGS
	select HAVE_FUNCTION_TRACER if !XIP_KERNEL && HAVE_DYNAMIC_FTRACE
	select HAVE_FUNCTION_TRACER if HAVE_DYNAMIC_FTRACE
	select HAVE_EBPF_JIT if MMU
	select HAVE_GENERIC_TIF_BITS
	select HAVE_GUP_FAST if MMU
@@ -172,16 +172,16 @@ config RISCV
	select HAVE_GCC_PLUGINS
	select HAVE_GENERIC_VDSO if MMU
	select HAVE_IRQ_TIME_ACCOUNTING
	select HAVE_KERNEL_BZIP2 if !XIP_KERNEL && !EFI_ZBOOT
	select HAVE_KERNEL_GZIP if !XIP_KERNEL && !EFI_ZBOOT
	select HAVE_KERNEL_LZ4 if !XIP_KERNEL && !EFI_ZBOOT
	select HAVE_KERNEL_LZMA if !XIP_KERNEL && !EFI_ZBOOT
	select HAVE_KERNEL_LZO if !XIP_KERNEL && !EFI_ZBOOT
	select HAVE_KERNEL_UNCOMPRESSED if !XIP_KERNEL && !EFI_ZBOOT
	select HAVE_KERNEL_ZSTD if !XIP_KERNEL && !EFI_ZBOOT
	select HAVE_KERNEL_XZ if !XIP_KERNEL && !EFI_ZBOOT
	select HAVE_KPROBES if !XIP_KERNEL
	select HAVE_KRETPROBES if !XIP_KERNEL
	select HAVE_KERNEL_BZIP2 if !EFI_ZBOOT
	select HAVE_KERNEL_GZIP if !EFI_ZBOOT
	select HAVE_KERNEL_LZ4 if !EFI_ZBOOT
	select HAVE_KERNEL_LZMA if !EFI_ZBOOT
	select HAVE_KERNEL_LZO if !EFI_ZBOOT
	select HAVE_KERNEL_UNCOMPRESSED if !EFI_ZBOOT
	select HAVE_KERNEL_ZSTD if !EFI_ZBOOT
	select HAVE_KERNEL_XZ if !EFI_ZBOOT
	select HAVE_KPROBES
	select HAVE_KRETPROBES
	# https://github.com/ClangBuiltLinux/linux/issues/1881
	select HAVE_LD_DEAD_CODE_DATA_ELIMINATION if !LD_IS_LLD
	select HAVE_MOVE_PMD
@@ -192,9 +192,9 @@ config RISCV
	select HAVE_PERF_REGS
	select HAVE_PERF_USER_STACK_DUMP
	select HAVE_POSIX_CPU_TIMERS_TASK_WORK
	select HAVE_PREEMPT_DYNAMIC_KEY if !XIP_KERNEL
	select HAVE_PREEMPT_DYNAMIC_KEY
	select HAVE_REGS_AND_STACK_ACCESS_API
	select HAVE_RETHOOK if !XIP_KERNEL
	select HAVE_RETHOOK
	select HAVE_RSEQ
	select HAVE_RUST if RUSTC_SUPPORTS_RISCV && CC_IS_CLANG
	select HAVE_SAMPLE_FTRACE_DIRECT
@@ -215,7 +215,7 @@ config RISCV
	select PCI_ECAM if (ACPI && PCI)
	select PCI_MSI if PCI
	select RELOCATABLE if !MMU && !PHYS_RAM_BASE_FIXED
	select RISCV_ALTERNATIVE if !XIP_KERNEL
	select RISCV_ALTERNATIVE
	select RISCV_APLIC
	select RISCV_IMSIC
	select RISCV_INTC
@@ -542,7 +542,6 @@ endchoice

config RISCV_ALTERNATIVE
	bool
	depends on !XIP_KERNEL
	help
	  This Kconfig allows the kernel to automatically patch the
	  erratum or cpufeature required by the execution platform at run
@@ -1131,7 +1130,6 @@ config PARAVIRT_TIME_ACCOUNTING

config RELOCATABLE
	bool "Build a relocatable kernel"
	depends on !XIP_KERNEL
	select MODULE_SECTIONS if MODULES
	select ARCH_VMLINUX_NEEDS_RELOCS
	help
@@ -1148,7 +1146,7 @@ config RELOCATABLE
config RANDOMIZE_BASE
        bool "Randomize the address of the kernel image"
        select RELOCATABLE
        depends on MMU && 64BIT && !XIP_KERNEL
        depends on MMU && 64BIT
        help
          Randomizes the virtual address at which the kernel image is
          loaded, as a security feature that deters exploit attempts
@@ -1238,7 +1236,7 @@ config EFI_STUB

config EFI
	bool "UEFI runtime support"
	depends on OF && !XIP_KERNEL
	depends on OF
	depends on MMU
	default y
	select ARCH_SUPPORTS_ACPI if 64BIT
@@ -1289,44 +1287,6 @@ config PHYS_RAM_BASE
	  explicitly specified to run early relocations of read-write data
	  from flash to RAM.

config XIP_KERNEL
	bool "Kernel Execute-In-Place from ROM"
	depends on MMU && SPARSEMEM && NONPORTABLE
	# This prevents XIP from being enabled by all{yes,mod}config, which
	# fail to build since XIP doesn't support large kernels.
	depends on !COMPILE_TEST
	select PHYS_RAM_BASE_FIXED
	help
	  Execute-In-Place allows the kernel to run from non-volatile storage
	  directly addressable by the CPU, such as NOR flash. This saves RAM
	  space since the text section of the kernel is not loaded from flash
	  to RAM.  Read-write sections, such as the data section and stack,
	  are still copied to RAM.  The XIP kernel is not compressed since
	  it has to run directly from flash, so it will take more space to
	  store it.  The flash address used to link the kernel object files,
	  and for storing it, is configuration dependent. Therefore, if you
	  say Y here, you must know the proper physical address where to
	  store the kernel image depending on your own flash memory usage.

	  Also note that the make target becomes "make xipImage" rather than
	  "make zImage" or "make Image".  The final kernel binary to put in
	  ROM memory will be arch/riscv/boot/xipImage.

	  SPARSEMEM is required because the kernel text and rodata that are
	  flash resident are not backed by memmap, then any attempt to get
	  a struct page on those regions will trigger a fault.

	  If unsure, say N.

config XIP_PHYS_ADDR
	hex "XIP Kernel Physical Location"
	depends on XIP_KERNEL
	default "0x21000000"
	help
	  This is the physical address in your flash memory the kernel will
	  be linked for and stored to.  This address is dependent on your
	  own flash usage.

config RISCV_ISA_FALLBACK
	bool "Permit falling back to parsing riscv,isa for extension support by default"
	default y
+4 −4
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@ menu "SoC selection"

config ARCH_ANDES
	bool "Andes SoCs"
	depends on MMU && !XIP_KERNEL
	depends on MMU
	select ERRATA_ANDES
	help
	  This enables support for Andes SoC platform hardware.
@@ -33,7 +33,7 @@ config ARCH_RENESAS

config ARCH_SIFIVE
	bool "SiFive SoCs"
	select ERRATA_SIFIVE if !XIP_KERNEL
	select ERRATA_SIFIVE
	help
	  This enables support for SiFive SoC platform hardware.

@@ -61,7 +61,7 @@ config SOC_STARFIVE

config ARCH_SUNXI
	bool "Allwinner sun20i SoCs"
	depends on MMU && !XIP_KERNEL
	depends on MMU
	select ERRATA_THEAD
	select SUN4I_TIMER
	help
@@ -78,7 +78,7 @@ config ARCH_TENSTORRENT

config ARCH_THEAD
	bool "T-HEAD RISC-V SoCs"
	depends on MMU && !XIP_KERNEL
	depends on MMU
	select ERRATA_THEAD
	select PM_GENERIC_DOMAINS if PM
	help
+0 −3
Original line number Diff line number Diff line
@@ -150,7 +150,6 @@ ifdef CONFIG_RISCV_M_MODE
boot-image-$(CONFIG_SOC_CANAAN_K210)	:= loader.bin
endif
boot-image-$(CONFIG_EFI_ZBOOT)		:= vmlinuz.efi
boot-image-$(CONFIG_XIP_KERNEL)		:= xipImage
KBUILD_IMAGE				:= $(boot)/$(boot-image-y)

libs-y += arch/riscv/lib/
@@ -218,8 +217,6 @@ define archhelp
  echo  '  Image.xz	- Compressed kernel image (arch/riscv/boot/Image.xz)'
  echo  '  vmlinuz.efi	- Compressed EFI kernel image (arch/riscv/boot/vmlinuz.efi)'
  echo  '		  Default when CONFIG_EFI_ZBOOT=y'
  echo  '  xipImage	- Execute-in-place kernel image (arch/riscv/boot/xipImage)'
  echo  '		  Default when CONFIG_XIP_KERNEL=y'
  echo  '  install	- Install kernel using (your) ~/bin/$(INSTALLKERNEL) or'
  echo  '		  (distribution) /sbin/$(INSTALLKERNEL) or install to '
  echo  '		  $$(INSTALL_PATH)'
+0 −11
Original line number Diff line number Diff line
@@ -20,17 +20,6 @@ OBJCOPYFLAGS_xipImage :=-O binary -R .note -R .note.gnu.build-id -R .comment -S

targets := Image Image.* loader loader.o loader.lds loader.bin xipImage

ifeq ($(CONFIG_XIP_KERNEL),y)

quiet_cmd_mkxip = $(quiet_cmd_objcopy)
cmd_mkxip = $(cmd_objcopy)

$(obj)/xipImage: vmlinux FORCE
	$(call if_changed,mkxip)
	@$(kecho) '  Physical Address of xipImage: $(CONFIG_XIP_PHYS_ADDR)'

endif

$(obj)/Image: vmlinux FORCE
	$(call if_changed,objcopy)

+0 −29
Original line number Diff line number Diff line
@@ -29,11 +29,7 @@
#define PAGE_OFFSET_L5		_AC(0xff60000000000000, UL)
#define PAGE_OFFSET_L4		_AC(0xffffaf8000000000, UL)
#define PAGE_OFFSET_L3		_AC(0xffffffd600000000, UL)
#ifdef CONFIG_XIP_KERNEL
#define PAGE_OFFSET		PAGE_OFFSET_L3
#else
#define PAGE_OFFSET		kernel_map.page_offset
#endif /* CONFIG_XIP_KERNEL */
#else
#define PAGE_OFFSET		_AC(0xc0000000, UL)
#endif /* CONFIG_64BIT */
@@ -104,15 +100,8 @@ struct kernel_mapping {
	/* Offset between linear mapping virtual address and kernel load address */
	unsigned long va_pa_offset;
	/* Offset between kernel mapping virtual address and kernel load address */
#ifdef CONFIG_XIP_KERNEL
	unsigned long va_kernel_xip_text_pa_offset;
	unsigned long va_kernel_xip_data_pa_offset;
	uintptr_t xiprom;
	uintptr_t xiprom_sz;
#else
	unsigned long page_offset;
	unsigned long va_kernel_pa_offset;
#endif
};

extern struct kernel_mapping kernel_map;
@@ -131,16 +120,7 @@ extern unsigned long vmemmap_start_pfn;
void *linear_mapping_pa_to_va(unsigned long x);
#endif

#ifdef CONFIG_XIP_KERNEL
#define kernel_mapping_pa_to_va(y)	({					\
	unsigned long _y = (unsigned long)(y);					\
	(_y < phys_ram_base) ?							\
		(void *)(_y + kernel_map.va_kernel_xip_text_pa_offset) :	\
		(void *)(_y + kernel_map.va_kernel_xip_data_pa_offset);		\
	})
#else
#define kernel_mapping_pa_to_va(y) ((void *)((unsigned long)(y) + kernel_map.va_kernel_pa_offset))
#endif

#define __pa_to_va_nodebug(x)		linear_mapping_pa_to_va(x)

@@ -150,16 +130,7 @@ void *linear_mapping_pa_to_va(unsigned long x);
phys_addr_t linear_mapping_va_to_pa(unsigned long x);
#endif

#ifdef CONFIG_XIP_KERNEL
#define kernel_mapping_va_to_pa(y) ({						\
	unsigned long _y = (unsigned long)(y);					\
	(_y < kernel_map.virt_addr + kernel_map.xiprom_sz) ?			\
		(_y - kernel_map.va_kernel_xip_text_pa_offset) :		\
		(_y - kernel_map.va_kernel_xip_data_pa_offset);			\
	})
#else
#define kernel_mapping_va_to_pa(y) ((unsigned long)(y) - kernel_map.va_kernel_pa_offset)
#endif

#define __va_to_pa_nodebug(x)	({						\
	unsigned long _x = x;							\
Loading