]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
riscv: Remove support for XIP kernel
authorNam Cao <namcao@linutronix.de>
Sat, 4 Apr 2026 01:28:48 +0000 (19:28 -0600)
committerPaul Walmsley <pjw@kernel.org>
Sun, 5 Apr 2026 00:42:44 +0000 (18:42 -0600)
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 a44fb5722199 ("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/
Link: https://lore.kernel.org/linux-riscv/20240526110104.470429-1-namcao@linutronix.de/
Signed-off-by: Nam Cao <namcao@linutronix.de>
Cc: Frederik Haxel <haxel@fzi.de>
Cc: Vitaly Wool <vitaly.wool@konsulko.com>
Reviewed-by: Jisheng Zhang <jszhang@kernel.org>
Acked-by: Conor 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: Paul Walmsley <pjw@kernel.org>
17 files changed:
arch/riscv/Kconfig
arch/riscv/Kconfig.socs
arch/riscv/Makefile
arch/riscv/boot/Makefile
arch/riscv/include/asm/page.h
arch/riscv/include/asm/pgtable.h
arch/riscv/include/asm/scs.h
arch/riscv/include/asm/set_memory.h
arch/riscv/include/asm/xip_fixup.h [deleted file]
arch/riscv/kernel/head.S
arch/riscv/kernel/head.h
arch/riscv/kernel/setup.c
arch/riscv/kernel/suspend_entry.S
arch/riscv/kernel/traps.c
arch/riscv/kernel/vmcore_info.c
arch/riscv/kernel/vmlinux.lds.S
arch/riscv/mm/init.c

index 32b6aa8dece75d931d7bb68e0e156a777349c71a..ef93bd66d27484c809f18e617058214e3a07f8e1 100644 (file)
@@ -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
index d621b85dd63bd01bae2800131288af311d653dc9..c174ac0ec46b47c27c5b3cd8c9fbf75dd1161a91 100644 (file)
@@ -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
index 87102314103c234f5f5d9fa0145679b0de3f611e..ce0cc737f870966f63caa5f03a56b88c5a3b1e95 100644 (file)
@@ -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)'
index 5301adf5f3f5d2894b7f7de19e85ca109909d099..fcfbe3f814d664a4400ecaf6ad846962f6cd25ac 100644 (file)
@@ -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)
 
index 813b6da57399001ab45778dc1a3a78c68b7894ee..f9f8b1654fb918e1f371e2360870249ae84ca97d 100644 (file)
 #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;                                                   \
index 08d1ca04710464811df25cc0984f9790e10d7d84..a984ac08758ebcc97ab3922fa4bcc0fa1d648570 100644 (file)
 
 #include <linux/page_table_check.h>
 
-#ifdef CONFIG_XIP_KERNEL
-#define XIP_FIXUP(addr) ({                                                     \
-       extern char _sdata[], _start[], _end[];                                 \
-       uintptr_t __rom_start_data = CONFIG_XIP_PHYS_ADDR                       \
-                               + (uintptr_t)&_sdata - (uintptr_t)&_start;      \
-       uintptr_t __rom_end_data = CONFIG_XIP_PHYS_ADDR                         \
-                               + (uintptr_t)&_end - (uintptr_t)&_start;        \
-       uintptr_t __a = (uintptr_t)(addr);                                      \
-       (__a >= __rom_start_data && __a < __rom_end_data) ?                     \
-               __a - __rom_start_data + CONFIG_PHYS_RAM_BASE : __a;            \
-       })
-#else
-#define XIP_FIXUP(addr)                (addr)
-#endif /* CONFIG_XIP_KERNEL */
-
 struct pt_alloc_ops {
        pte_t *(*get_pte_virt)(phys_addr_t pa);
        phys_addr_t (*alloc_pte)(uintptr_t va);
@@ -1272,13 +1257,8 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)
 extern char _start[];
 extern void *_dtb_early_va;
 extern uintptr_t _dtb_early_pa;
-#if defined(CONFIG_XIP_KERNEL) && defined(CONFIG_MMU)
-#define dtb_early_va   (*(void **)XIP_FIXUP(&_dtb_early_va))
-#define dtb_early_pa   (*(uintptr_t *)XIP_FIXUP(&_dtb_early_pa))
-#else
 #define dtb_early_va   _dtb_early_va
 #define dtb_early_pa   _dtb_early_pa
-#endif /* CONFIG_XIP_KERNEL */
 extern u64 satp_mode;
 
 void paging_init(void);
index ab7714aa93bdc4218077e8b905870b0099094694..023a412fe38d37cfe5968c0fc17bf4c3d1854d36 100644 (file)
@@ -10,7 +10,6 @@
 /* Load init_shadow_call_stack to gp. */
 .macro scs_load_init_stack
        la      gp, init_shadow_call_stack
-       XIP_FIXUP_OFFSET gp
 .endm
 
 /* Load the per-CPU IRQ shadow call stack to gp. */
index 87389e93325a3b357a195f9f1fc5742ad7f36a14..ef59e1716a2cfd24c028a1ec44c949fcaaebed86 100644 (file)
@@ -47,7 +47,7 @@ bool kernel_page_present(struct page *page);
 
 #endif /* __ASSEMBLER__ */
 
-#if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_XIP_KERNEL)
+#if defined(CONFIG_STRICT_KERNEL_RWX)
 #ifdef CONFIG_64BIT
 #define SECTION_ALIGN (1 << 21)
 #else
diff --git a/arch/riscv/include/asm/xip_fixup.h b/arch/riscv/include/asm/xip_fixup.h
deleted file mode 100644 (file)
index f3d5629..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * XIP fixup macros, only useful in assembly.
- */
-#ifndef _ASM_RISCV_XIP_FIXUP_H
-#define _ASM_RISCV_XIP_FIXUP_H
-
-#include <linux/pgtable.h>
-
-#ifdef CONFIG_XIP_KERNEL
-.macro XIP_FIXUP_OFFSET reg
-       /* Fix-up address in Flash into address in RAM early during boot before
-        * MMU is up. Because generated code "thinks" data is in Flash, but it
-        * is actually in RAM (actually data is also in Flash, but Flash is
-        * read-only, thus we need to use the data residing in RAM).
-        *
-        * The start of data in Flash is _sdata and the start of data in RAM is
-        * CONFIG_PHYS_RAM_BASE. So this fix-up essentially does this:
-        * reg += CONFIG_PHYS_RAM_BASE - _start
-        */
-       li t0, CONFIG_PHYS_RAM_BASE
-        add \reg, \reg, t0
-       la t0, _sdata
-       sub \reg, \reg, t0
-.endm
-.macro XIP_FIXUP_FLASH_OFFSET reg
-       /* In linker script, at the transition from read-only section to
-        * writable section, the VMA is increased while LMA remains the same.
-        * (See in linker script how _sdata, __data_loc and LOAD_OFFSET is
-        * changed)
-        *
-        * Consequently, early during boot before MMU is up, the generated code
-        * reads the "writable" section at wrong addresses, because VMA is used
-        * by compiler to generate code, but the data is located in Flash using
-        * LMA.
-        */
-       la t0, _sdata
-       sub \reg, \reg, t0
-       la t0, __data_loc
-       add \reg, \reg, t0
-.endm
-#else
-.macro XIP_FIXUP_OFFSET reg
-.endm
-.macro XIP_FIXUP_FLASH_OFFSET reg
-.endm
-#endif /* CONFIG_XIP_KERNEL */
-
-#endif
index e7ea7eb532a8f3032888fdc9ef039c59343064ab..f6a8ca49e6277c39b634b3b7d5c248ffa1a0b310 100644 (file)
@@ -14,7 +14,6 @@
 #include <asm/hwcap.h>
 #include <asm/image.h>
 #include <asm/scs.h>
-#include <asm/xip_fixup.h>
 #include <asm/usercfi.h>
 #include "efi-header.S"
 
@@ -75,7 +74,6 @@ pe_head_start:
 relocate_enable_mmu:
        /* Relocate return address */
        la a1, kernel_map
-       XIP_FIXUP_OFFSET a1
        REG_L a1, KERNEL_MAP_VIRT_ADDR(a1)
        la a2, _start
        sub a1, a1, a2
@@ -89,7 +87,6 @@ relocate_enable_mmu:
        /* Compute satp for kernel page tables, but don't load it yet */
        srl a2, a0, PAGE_SHIFT
        la a1, satp_mode
-       XIP_FIXUP_OFFSET a1
        REG_L a1, 0(a1)
        or a2, a2, a1
 
@@ -100,7 +97,6 @@ relocate_enable_mmu:
         * to ensure the new translations are in use.
         */
        la a0, trampoline_pg_dir
-       XIP_FIXUP_OFFSET a0
        srl a0, a0, PAGE_SHIFT
        or a0, a0, a1
        sfence.vma
@@ -154,11 +150,9 @@ secondary_start_sbi:
 
        /* a0 contains the hartid & a1 contains boot data */
        li a2, SBI_HART_BOOT_TASK_PTR_OFFSET
-       XIP_FIXUP_OFFSET a2
        add a2, a2, a1
        REG_L tp, (a2)
        li a3, SBI_HART_BOOT_STACK_PTR_OFFSET
-       XIP_FIXUP_OFFSET a3
        add a3, a3, a1
        REG_L sp, (a3)
 
@@ -167,7 +161,6 @@ secondary_start_sbi:
 #ifdef CONFIG_MMU
        /* Enable virtual memory and relocate to virtual address */
        la a0, swapper_pg_dir
-       XIP_FIXUP_OFFSET a0
        call relocate_enable_mmu
 #endif
        call .Lsetup_trap_vector
@@ -269,40 +262,13 @@ SYM_CODE_START(_start_kernel)
 .Lgood_cores:
 
        /* The lottery system is only required for spinwait booting method */
-#ifndef CONFIG_XIP_KERNEL
        /* Pick one hart to run the main boot sequence */
        la a3, hart_lottery
        li a2, 1
        amoadd.w a3, a2, (a3)
        bnez a3, .Lsecondary_start
-
-#else
-       /* hart_lottery in flash contains a magic number */
-       la a3, hart_lottery
-       mv a2, a3
-       XIP_FIXUP_OFFSET a2
-       XIP_FIXUP_FLASH_OFFSET a3
-       lw t1, (a3)
-       amoswap.w t0, t1, (a2)
-       /* first time here if hart_lottery in RAM is not set */
-       beq t0, t1, .Lsecondary_start
-
-#endif /* CONFIG_XIP */
 #endif /* CONFIG_RISCV_BOOT_SPINWAIT */
 
-#ifdef CONFIG_XIP_KERNEL
-       la sp, _end + THREAD_SIZE
-       XIP_FIXUP_OFFSET sp
-       mv s0, a0
-       mv s1, a1
-       call __copy_data
-
-       /* Restore a0 & a1 copy */
-       mv a0, s0
-       mv a1, s1
-#endif
-
-#ifndef CONFIG_XIP_KERNEL
        /* Clear BSS for flat non-ELF images */
        la a3, __bss_start
        la a4, __bss_stop
@@ -312,20 +278,16 @@ SYM_CODE_START(_start_kernel)
        add a3, a3, RISCV_SZPTR
        blt a3, a4, .Lclear_bss
 .Lclear_bss_done:
-#endif
        la a2, boot_cpu_hartid
-       XIP_FIXUP_OFFSET a2
        REG_S a0, (a2)
 
        /* Initialize page tables and relocate to virtual addresses */
        la tp, init_task
        la sp, init_thread_union + THREAD_SIZE
-       XIP_FIXUP_OFFSET sp
        addi sp, sp, -PT_SIZE_ON_STACK
        scs_load_init_stack
 #ifdef CONFIG_BUILTIN_DTB
        la a0, __dtb_start
-       XIP_FIXUP_OFFSET a0
 #else
        mv a0, a1
 #endif /* CONFIG_BUILTIN_DTB */
@@ -335,7 +297,6 @@ SYM_CODE_START(_start_kernel)
        call setup_vm
 #ifdef CONFIG_MMU
        la a0, early_pg_dir
-       XIP_FIXUP_OFFSET a0
        call relocate_enable_mmu
 #endif /* CONFIG_MMU */
 
@@ -374,9 +335,7 @@ SYM_CODE_START(_start_kernel)
 
        slli a3, a0, LGREG
        la a1, __cpu_spinwait_stack_pointer
-       XIP_FIXUP_OFFSET a1
        la a2, __cpu_spinwait_task_pointer
-       XIP_FIXUP_OFFSET a2
        add a1, a3, a1
        add a2, a3, a2
 
index a556fdaafed94339d08d6305519883755f776504..05a04bef442b1ba52bd5a227e12a2c3fd76ac581 100644 (file)
@@ -11,9 +11,6 @@
 extern atomic_t hart_lottery;
 
 asmlinkage void __init setup_vm(uintptr_t dtb_pa);
-#ifdef CONFIG_XIP_KERNEL
-asmlinkage void __init __copy_data(void);
-#endif
 
 #ifdef CONFIG_RISCV_BOOT_SPINWAIT
 extern void *__cpu_spinwait_stack_pointer[];
index b5bc5fc65cea65bbc5a487416ec4f29e5fa5a04b..c89cc272440b9fbe6c9ba38805237dafa3d6b0c3 100644 (file)
  * This is used before the kernel initializes the BSS so it can't be in the
  * BSS.
  */
-atomic_t hart_lottery __section(".sdata")
-#ifdef CONFIG_XIP_KERNEL
-= ATOMIC_INIT(0xC001BEEF)
-#endif
-;
+atomic_t hart_lottery __section(".sdata");
 unsigned long boot_cpu_hartid;
 EXPORT_SYMBOL_GPL(boot_cpu_hartid);
 
index 2d54f309c14059ad901f80448df2ff257f047388..d71b55fd6259f355d0162594a6856fb502320e93 100644 (file)
@@ -10,7 +10,6 @@
 #include <asm/asm-offsets.h>
 #include <asm/assembler.h>
 #include <asm/csr.h>
-#include <asm/xip_fixup.h>
 
        .text
        .altmacro
@@ -70,7 +69,6 @@ SYM_TYPED_FUNC_START(__cpu_resume_enter)
 
        /* Enable MMU */
        la      a0, swapper_pg_dir
-       XIP_FIXUP_OFFSET a0
        call    relocate_enable_mmu
 
        /* Restore A0 and A1 */
index 7cdb5b26d03dff577c4eb68adf6cf8e63dda9ff4..39bef280fc23725f42e274640a205b754f9c285d 100644 (file)
@@ -142,11 +142,7 @@ static void do_trap_error(struct pt_regs *regs, int signo, int code,
        }
 }
 
-#if defined(CONFIG_XIP_KERNEL) && defined(CONFIG_RISCV_ALTERNATIVE)
-#define __trap_section __noinstr_section(".xip.traps")
-#else
 #define __trap_section noinstr
-#endif
 #define DO_ERROR_INFO(name, signo, code, str)                                  \
 asmlinkage __visible __trap_section void name(struct pt_regs *regs)            \
 {                                                                              \
index 682ba423cf203da302efffe87f65defb8aee08a5..c27efceec3cc3a25af2d60c8bc7d5d0674f6c9c8 100644 (file)
@@ -24,15 +24,8 @@ void arch_crash_save_vmcoreinfo(void)
 #endif
 #endif
        vmcoreinfo_append_str("NUMBER(KERNEL_LINK_ADDR)=0x%lx\n", KERNEL_LINK_ADDR);
-#ifdef CONFIG_XIP_KERNEL
-       /* TODO: Communicate with crash-utility developers on the information to
-        * export. The XIP case is more complicated, because the virtual-physical
-        * address offset depends on whether the address is in ROM or in RAM.
-        */
-#else
        vmcoreinfo_append_str("NUMBER(va_kernel_pa_offset)=0x%lx\n",
                                                kernel_map.va_kernel_pa_offset);
        vmcoreinfo_append_str("KERNELOFFSET=%lx\n", kaslr_offset());
        vmcoreinfo_append_str("NUMBER(satp)=0x%llx\n", get_satp_value());
-#endif
 }
index 997f9eb3b22b139e7262417cd72bb5e5b6979e86..1f4f8496941aef2371db7e6dd9d0dab4e0fe11e4 100644 (file)
@@ -7,10 +7,6 @@
 #define RO_EXCEPTION_TABLE_ALIGN       4
 #define RUNTIME_DISCARD_EXIT
 
-#ifdef CONFIG_XIP_KERNEL
-#include "vmlinux-xip.lds.S"
-#else
-
 #include <asm/pgtable.h>
 #define LOAD_OFFSET KERNEL_LINK_ADDR
 
@@ -176,4 +172,3 @@ SECTIONS
 
        DISCARDS
 }
-#endif /* CONFIG_XIP_KERNEL */
index 2a34906b85df14ddc1fb3546fedf77a930f769a2..23cc1b81fa9c1f3220e0561498dd8283a541b276 100644 (file)
@@ -41,20 +41,17 @@ u64 new_vmalloc[NR_CPUS / sizeof(u64) + 1];
 
 struct kernel_mapping kernel_map __ro_after_init;
 EXPORT_SYMBOL(kernel_map);
-#ifdef CONFIG_XIP_KERNEL
-#define kernel_map     (*(struct kernel_mapping *)XIP_FIXUP(&kernel_map))
-#endif
 
 #ifdef CONFIG_64BIT
-u64 satp_mode __ro_after_init = !IS_ENABLED(CONFIG_XIP_KERNEL) ? SATP_MODE_57 : SATP_MODE_39;
+u64 satp_mode __ro_after_init = SATP_MODE_57;
 #else
 u64 satp_mode __ro_after_init = SATP_MODE_32;
 #endif
 EXPORT_SYMBOL(satp_mode);
 
 #ifdef CONFIG_64BIT
-bool pgtable_l4_enabled __ro_after_init = !IS_ENABLED(CONFIG_XIP_KERNEL);
-bool pgtable_l5_enabled __ro_after_init = !IS_ENABLED(CONFIG_XIP_KERNEL);
+bool pgtable_l4_enabled __ro_after_init = true;
+bool pgtable_l5_enabled __ro_after_init = true;
 EXPORT_SYMBOL(pgtable_l4_enabled);
 EXPORT_SYMBOL(pgtable_l5_enabled);
 #endif
@@ -193,9 +190,6 @@ void __init arch_mm_preinit(void)
 
 /* Limit the memory size via mem. */
 static phys_addr_t memory_limit;
-#ifdef CONFIG_XIP_KERNEL
-#define memory_limit   (*(phys_addr_t *)XIP_FIXUP(&memory_limit))
-#endif /* CONFIG_XIP_KERNEL */
 
 static int __init early_mem(char *p)
 {
@@ -219,10 +213,7 @@ static void __init setup_bootmem(void)
        phys_addr_t max_mapped_addr;
        phys_addr_t phys_ram_end, vmlinux_start;
 
-       if (IS_ENABLED(CONFIG_XIP_KERNEL))
-               vmlinux_start = __pa_symbol(&_sdata);
-       else
-               vmlinux_start = __pa_symbol(&_start);
+       vmlinux_start = __pa_symbol(&_start);
 
        memblock_enforce_memory_limit(memory_limit);
 
@@ -242,12 +233,10 @@ static void __init setup_bootmem(void)
         * Make sure we align the start of the memory on a PMD boundary so that
         * at worst, we map the linear mapping with PMD mappings.
         */
-       if (!IS_ENABLED(CONFIG_XIP_KERNEL)) {
-               phys_ram_base = memblock_start_of_DRAM() & PMD_MASK;
+       phys_ram_base = memblock_start_of_DRAM() & PMD_MASK;
 #ifdef CONFIG_SPARSEMEM_VMEMMAP
-               vmemmap_start_pfn = round_down(phys_ram_base, VMEMMAP_ADDR_ALIGN) >> PAGE_SHIFT;
+       vmemmap_start_pfn = round_down(phys_ram_base, VMEMMAP_ADDR_ALIGN) >> PAGE_SHIFT;
 #endif
-       }
 
        /*
         * In 64-bit, any use of __va/__pa before this point is wrong as we
@@ -360,13 +349,6 @@ static pte_t fixmap_pte[PTRS_PER_PTE] __page_aligned_bss;
 
 pgd_t early_pg_dir[PTRS_PER_PGD] __initdata __aligned(PAGE_SIZE);
 
-#ifdef CONFIG_XIP_KERNEL
-#define pt_ops                 (*(struct pt_alloc_ops *)XIP_FIXUP(&pt_ops))
-#define trampoline_pg_dir      ((pgd_t *)XIP_FIXUP(trampoline_pg_dir))
-#define fixmap_pte             ((pte_t *)XIP_FIXUP(fixmap_pte))
-#define early_pg_dir           ((pgd_t *)XIP_FIXUP(early_pg_dir))
-#endif /* CONFIG_XIP_KERNEL */
-
 static const pgprot_t protection_map[16] = {
        [VM_NONE]                                       = PAGE_NONE,
        [VM_READ]                                       = PAGE_READ,
@@ -463,32 +445,14 @@ static pmd_t trampoline_pmd[PTRS_PER_PMD] __page_aligned_bss;
 static pmd_t fixmap_pmd[PTRS_PER_PMD] __page_aligned_bss;
 static pmd_t early_pmd[PTRS_PER_PMD] __initdata __aligned(PAGE_SIZE);
 
-#ifdef CONFIG_XIP_KERNEL
-#define trampoline_pmd ((pmd_t *)XIP_FIXUP(trampoline_pmd))
-#define fixmap_pmd     ((pmd_t *)XIP_FIXUP(fixmap_pmd))
-#define early_pmd      ((pmd_t *)XIP_FIXUP(early_pmd))
-#endif /* CONFIG_XIP_KERNEL */
-
 static p4d_t trampoline_p4d[PTRS_PER_P4D] __page_aligned_bss;
 static p4d_t fixmap_p4d[PTRS_PER_P4D] __page_aligned_bss;
 static p4d_t early_p4d[PTRS_PER_P4D] __initdata __aligned(PAGE_SIZE);
 
-#ifdef CONFIG_XIP_KERNEL
-#define trampoline_p4d ((p4d_t *)XIP_FIXUP(trampoline_p4d))
-#define fixmap_p4d     ((p4d_t *)XIP_FIXUP(fixmap_p4d))
-#define early_p4d      ((p4d_t *)XIP_FIXUP(early_p4d))
-#endif /* CONFIG_XIP_KERNEL */
-
 static pud_t trampoline_pud[PTRS_PER_PUD] __page_aligned_bss;
 static pud_t fixmap_pud[PTRS_PER_PUD] __page_aligned_bss;
 static pud_t early_pud[PTRS_PER_PUD] __initdata __aligned(PAGE_SIZE);
 
-#ifdef CONFIG_XIP_KERNEL
-#define trampoline_pud ((pud_t *)XIP_FIXUP(trampoline_pud))
-#define fixmap_pud     ((pud_t *)XIP_FIXUP(fixmap_pud))
-#define early_pud      ((pud_t *)XIP_FIXUP(early_pud))
-#endif /* CONFIG_XIP_KERNEL */
-
 static pmd_t *__init get_pmd_virt_early(phys_addr_t pa)
 {
        /* Before MMU is enabled */
@@ -759,21 +723,6 @@ static uintptr_t __meminit best_map_size(phys_addr_t pa, uintptr_t va, phys_addr
        return PAGE_SIZE;
 }
 
-#ifdef CONFIG_XIP_KERNEL
-#define phys_ram_base  (*(phys_addr_t *)XIP_FIXUP(&phys_ram_base))
-extern char _xiprom[], _exiprom[], __data_loc;
-
-/* called from head.S with MMU off */
-asmlinkage void __init __copy_data(void)
-{
-       void *from = (void *)(&__data_loc);
-       void *to = (void *)CONFIG_PHYS_RAM_BASE;
-       size_t sz = (size_t)((uintptr_t)(&_end) - (uintptr_t)(&_sdata));
-
-       memcpy(to, from, sz);
-}
-#endif
-
 #ifdef CONFIG_STRICT_KERNEL_RWX
 static __meminit pgprot_t pgprot_from_va(uintptr_t va)
 {
@@ -809,7 +758,7 @@ static __meminit pgprot_t pgprot_from_va(uintptr_t va)
 }
 #endif /* CONFIG_STRICT_KERNEL_RWX */
 
-#if defined(CONFIG_64BIT) && !defined(CONFIG_XIP_KERNEL)
+#if defined(CONFIG_64BIT)
 u64 __pi_set_satp_mode_from_cmdline(uintptr_t dtb_pa);
 u64 __pi_set_satp_mode_from_fdt(uintptr_t dtb_pa);
 
@@ -934,28 +883,6 @@ retry:
 #error "setup_vm() is called from head.S before relocate so it should not use absolute addressing."
 #endif
 
-#ifdef CONFIG_XIP_KERNEL
-static void __init create_kernel_page_table(pgd_t *pgdir,
-                                           __always_unused bool early)
-{
-       uintptr_t va, start_va, end_va;
-
-       /* Map the flash resident part */
-       end_va = kernel_map.virt_addr + kernel_map.xiprom_sz;
-       for (va = kernel_map.virt_addr; va < end_va; va += PMD_SIZE)
-               create_pgd_mapping(pgdir, va,
-                                  kernel_map.xiprom + (va - kernel_map.virt_addr),
-                                  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 = start_va; va < end_va; va += PMD_SIZE)
-               create_pgd_mapping(pgdir, va,
-                                  kernel_map.phys_addr + (va - start_va),
-                                  PMD_SIZE, PAGE_KERNEL);
-}
-#else
 static void __init create_kernel_page_table(pgd_t *pgdir, bool early)
 {
        uintptr_t va, end_va;
@@ -968,7 +895,6 @@ static void __init create_kernel_page_table(pgd_t *pgdir, bool early)
                                   early ?
                                        PAGE_KERNEL_EXEC : pgprot_from_va(va));
 }
-#endif
 
 /*
  * Setup a 4MB mapping that encompasses the device tree: for 64-bit kernel,
@@ -1105,27 +1031,11 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa)
 
        kernel_map.virt_addr = KERNEL_LINK_ADDR + kernel_map.virt_offset;
 
-#ifdef CONFIG_XIP_KERNEL
-       kernel_map.xiprom = (uintptr_t)CONFIG_XIP_PHYS_ADDR;
-       kernel_map.xiprom_sz = (uintptr_t)(&_exiprom) - (uintptr_t)(&_xiprom);
-
-       phys_ram_base = CONFIG_PHYS_RAM_BASE;
-#ifdef CONFIG_SPARSEMEM_VMEMMAP
-       vmemmap_start_pfn = round_down(phys_ram_base, VMEMMAP_ADDR_ALIGN) >> PAGE_SHIFT;
-#endif
-       kernel_map.phys_addr = (uintptr_t)CONFIG_PHYS_RAM_BASE;
-       kernel_map.size = (uintptr_t)(&_end) - (uintptr_t)(&_start);
-
-       kernel_map.va_kernel_xip_text_pa_offset = kernel_map.virt_addr - kernel_map.xiprom;
-       kernel_map.va_kernel_xip_data_pa_offset = kernel_map.virt_addr - kernel_map.phys_addr
-                                               + (uintptr_t)&_sdata - (uintptr_t)&_start;
-#else
        kernel_map.phys_addr = (uintptr_t)(&_start);
        kernel_map.size = (uintptr_t)(&_end) - kernel_map.phys_addr;
        kernel_map.va_kernel_pa_offset = kernel_map.virt_addr - kernel_map.phys_addr;
-#endif
 
-#if defined(CONFIG_64BIT) && !defined(CONFIG_XIP_KERNEL)
+#if defined(CONFIG_64BIT)
        set_satp_mode(dtb_pa);
        set_mmap_rnd_bits_max();
 #endif
@@ -1198,13 +1108,8 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa)
        if (pgtable_l4_enabled)
                create_pud_mapping(trampoline_pud, kernel_map.virt_addr,
                                   (uintptr_t)trampoline_pmd, PUD_SIZE, PAGE_TABLE);
-#ifdef CONFIG_XIP_KERNEL
-       create_pmd_mapping(trampoline_pmd, kernel_map.virt_addr,
-                          kernel_map.xiprom, PMD_SIZE, PAGE_KERNEL_EXEC);
-#else
        create_pmd_mapping(trampoline_pmd, kernel_map.virt_addr,
                           kernel_map.phys_addr, PMD_SIZE, PAGE_KERNEL_EXEC);
-#endif
 #else
        /* Setup trampoline PGD */
        create_pgd_mapping(trampoline_pg_dir, kernel_map.virt_addr,