]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
LoongArch: Adjust build infrastructure for 32BIT/64BIT
authorHuacai Chen <chenhuacai@loongson.cn>
Wed, 22 Apr 2026 07:44:26 +0000 (15:44 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Wed, 22 Apr 2026 07:44:26 +0000 (15:44 +0800)
Adjust build infrastructure (Kconfig, Makefile and ld scripts) to let
us enable both 32BIT/64BIT kernel build.

Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/Kconfig
arch/loongarch/Makefile
arch/loongarch/boot/Makefile
arch/loongarch/kernel/vmlinux.lds.S
arch/loongarch/kvm/Kconfig
arch/loongarch/lib/Makefile
drivers/firmware/efi/libstub/Makefile
drivers/pci/controller/Kconfig
lib/crc/Kconfig

index 92068ff38685eb5a5b4bffe05357367bbfebcf70..01da52fb72f5b65daa3604bfeaf9a2b627dd8895 100644 (file)
@@ -21,11 +21,11 @@ config LOONGARCH
        select ARCH_HAS_FAST_MULTIPLIER
        select ARCH_HAS_FORTIFY_SOURCE
        select ARCH_HAS_KCOV
-       select ARCH_HAS_KERNEL_FPU_SUPPORT if CPU_HAS_FPU
+       select ARCH_HAS_KERNEL_FPU_SUPPORT if 64BIT && CPU_HAS_FPU
        select ARCH_HAS_NMI_SAFE_THIS_CPU_OPS
        select ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
        select ARCH_HAS_PREEMPT_LAZY
-       select ARCH_HAS_PTE_SPECIAL
+       select ARCH_HAS_PTE_SPECIAL if 64BIT
        select ARCH_HAS_SET_MEMORY
        select ARCH_HAS_SET_DIRECT_MAP
        select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
@@ -60,16 +60,15 @@ config LOONGARCH
        select ARCH_KEEP_MEMBLOCK
        select ARCH_MIGHT_HAVE_PC_PARPORT
        select ARCH_MIGHT_HAVE_PC_SERIO
-       select ARCH_SPARSEMEM_ENABLE
        select ARCH_STACKWALK
        select ARCH_SUPPORTS_ACPI
        select ARCH_SUPPORTS_ATOMIC_RMW
-       select ARCH_SUPPORTS_HUGETLBFS
+       select ARCH_SUPPORTS_HUGETLBFS if 64BIT
        select ARCH_SUPPORTS_INT128 if CC_HAS_INT128
        select ARCH_SUPPORTS_LTO_CLANG
        select ARCH_SUPPORTS_LTO_CLANG_THIN
        select ARCH_SUPPORTS_MSEAL_SYSTEM_MAPPINGS
-       select ARCH_SUPPORTS_NUMA_BALANCING
+       select ARCH_SUPPORTS_NUMA_BALANCING if NUMA
        select ARCH_SUPPORTS_PER_VMA_LOCK
        select ARCH_SUPPORTS_RT
        select ARCH_SUPPORTS_SCHED_SMT if SMP
@@ -79,10 +78,10 @@ config LOONGARCH
        select ARCH_USE_MEMTEST
        select ARCH_USE_QUEUED_RWLOCKS
        select ARCH_USE_QUEUED_SPINLOCKS
-       select ARCH_WANT_DEFAULT_BPF_JIT
+       select ARCH_WANT_DEFAULT_BPF_JIT if HAVE_EBPF_JIT
        select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT
        select ARCH_WANT_LD_ORPHAN_WARN
-       select ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP
+       select ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP if 64BIT
        select ARCH_WANTS_NO_INSTR
        select ARCH_WANTS_THP_SWAP if HAVE_ARCH_TRANSPARENT_HUGEPAGE
        select BUILDTIME_TABLE_SORT
@@ -90,13 +89,14 @@ config LOONGARCH
        select CPU_PM
        select EDAC_SUPPORT
        select EFI
+       select GENERIC_ATOMIC64 if 32BIT
        select GENERIC_CLOCKEVENTS
        select GENERIC_CMOS_UPDATE
        select GENERIC_CPU_AUTOPROBE
        select GENERIC_CPU_DEVICES
        select GENERIC_CPU_VULNERABILITIES
        select GENERIC_ENTRY
-       select GENERIC_GETTIMEOFDAY
+       select GENERIC_GETTIMEOFDAY if 64BIT
        select GENERIC_IOREMAP if !ARCH_IOREMAP
        select GENERIC_IRQ_MATRIX_ALLOCATOR
        select GENERIC_IRQ_MULTI_HANDLER
@@ -111,16 +111,16 @@ config LOONGARCH
        select GENERIC_PCI_IOMAP
        select GENERIC_SCHED_CLOCK
        select GENERIC_SMP_IDLE_THREAD
-       select GENERIC_TIME_VSYSCALL
+       select GENERIC_TIME_VSYSCALL if GENERIC_GETTIMEOFDAY
        select GPIOLIB
        select HAS_IOPORT
-       select HAVE_ALIGNED_STRUCT_PAGE
+       select HAVE_ALIGNED_STRUCT_PAGE if 64BIT
        select HAVE_ARCH_AUDITSYSCALL
-       select HAVE_ARCH_BITREVERSE
+       select HAVE_ARCH_BITREVERSE if 64BIT
        select HAVE_ARCH_JUMP_LABEL
        select HAVE_ARCH_JUMP_LABEL_RELATIVE
-       select HAVE_ARCH_KASAN
-       select HAVE_ARCH_KFENCE
+       select HAVE_ARCH_KASAN if 64BIT
+       select HAVE_ARCH_KFENCE if 64BIT
        select HAVE_ARCH_KGDB if PERF_EVENTS
        select HAVE_ARCH_KSTACK_ERASE
        select HAVE_ARCH_MMAP_RND_BITS if MMU
@@ -128,8 +128,8 @@ config LOONGARCH
        select HAVE_ARCH_SECCOMP
        select HAVE_ARCH_SECCOMP_FILTER
        select HAVE_ARCH_TRACEHOOK
-       select HAVE_ARCH_TRANSPARENT_HUGEPAGE
-       select HAVE_ARCH_USERFAULTFD_MINOR if USERFAULTFD
+       select HAVE_ARCH_TRANSPARENT_HUGEPAGE if 64BIT
+       select HAVE_ARCH_USERFAULTFD_MINOR if 64BIT && USERFAULTFD
        select HAVE_ASM_MODVERSIONS
        select HAVE_CMPXCHG_DOUBLE
        select HAVE_CMPXCHG_LOCAL
@@ -143,7 +143,7 @@ config LOONGARCH
        select HAVE_FTRACE_REGS_HAVING_PT_REGS
        select HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
        select HAVE_DYNAMIC_FTRACE_WITH_REGS
-       select HAVE_EBPF_JIT
+       select HAVE_EBPF_JIT if 64BIT
        select HAVE_EFFICIENT_UNALIGNED_ACCESS if !ARCH_STRICT_ALIGN
        select HAVE_EXIT_THREAD
        select HAVE_GENERIC_TIF_BITS
@@ -166,9 +166,9 @@ config LOONGARCH
        select HAVE_LIVEPATCH
        select HAVE_MOD_ARCH_SPECIFIC
        select HAVE_NMI
-       select HAVE_OBJTOOL if AS_HAS_EXPLICIT_RELOCS && AS_HAS_THIN_ADD_SUB
+       select HAVE_OBJTOOL if AS_HAS_EXPLICIT_RELOCS && AS_HAS_THIN_ADD_SUB && 64BIT
        select HAVE_PCI
-       select HAVE_PERF_EVENTS
+       select HAVE_PERF_EVENTS if 64BIT
        select HAVE_PERF_REGS
        select HAVE_PERF_USER_STACK_DUMP
        select HAVE_POSIX_CPU_TIMERS_TASK_WORK
@@ -210,18 +210,50 @@ config LOONGARCH
        select SYSCTL_ARCH_UNALIGN_ALLOW
        select SYSCTL_ARCH_UNALIGN_NO_WARN
        select SYSCTL_EXCEPTION_TRACE
-       select SWIOTLB
+       select SWIOTLB if 64BIT
        select TRACE_IRQFLAGS_SUPPORT
        select USE_PERCPU_NUMA_NODE_ID
        select USER_STACKTRACE_SUPPORT
        select VDSO_GETRANDOM
-       select ZONE_DMA32
+       select ZONE_DMA32 if 64BIT
+
+menu "Kernel type and options"
+
+choice
+       prompt "Kernel type"
 
 config 32BIT
-       bool
+       bool "32-bit kernel"
+       help
+         Select this option if you want to build a 32-bit kernel.
 
 config 64BIT
-       def_bool y
+       bool "64-bit kernel"
+       help
+         Select this option if you want to build a 64-bit kernel.
+
+endchoice
+
+if 32BIT
+
+choice
+       prompt "32-bit kernel sub-type"
+
+config 32BIT_REDUCED
+       bool "32-bit kernel for LA32R"
+       help
+         Select this option if you want to build a 32-bit kernel for
+         LoongArch32 Reduced (LA32R).
+
+config 32BIT_STANDARD
+       bool "32-bit kernel for LA32S"
+       help
+         Select this option if you want to build a 32-bit kernel for
+         LoongArch32 Standard (LA32S).
+
+endchoice
+
+endif
 
 config GENERIC_BUG
        def_bool y
@@ -314,8 +346,6 @@ config RUSTC_HAS_ANNOTATE_TABLEJUMP
        depends on RUST
        def_bool $(rustc-option,-Cllvm-args=--loongarch-annotate-tablejump)
 
-menu "Kernel type and options"
-
 source "kernel/Kconfig.hz"
 
 choice
@@ -327,8 +357,17 @@ choice
          of page size and page table levels. The size of virtual memory
          address space are determined by the page table layout.
 
+config 4KB_2LEVEL
+       bool "4KB with 2 levels"
+       select HAVE_PAGE_SIZE_4KB
+       select PGTABLE_2LEVEL
+       help
+         This option selects 4KB page size with 2 level page tables, which
+         support a maximum of 32 bits of application virtual memory.
+
 config 4KB_3LEVEL
        bool "4KB with 3 levels"
+       depends on 64BIT
        select HAVE_PAGE_SIZE_4KB
        select PGTABLE_3LEVEL
        help
@@ -337,6 +376,7 @@ config 4KB_3LEVEL
 
 config 4KB_4LEVEL
        bool "4KB with 4 levels"
+       depends on 64BIT
        select HAVE_PAGE_SIZE_4KB
        select PGTABLE_4LEVEL
        help
@@ -353,6 +393,7 @@ config 16KB_2LEVEL
 
 config 16KB_3LEVEL
        bool "16KB with 3 levels"
+       depends on 64BIT
        select HAVE_PAGE_SIZE_16KB
        select PGTABLE_3LEVEL
        help
@@ -369,6 +410,7 @@ config 64KB_2LEVEL
 
 config 64KB_3LEVEL
        bool "64KB with 3 levels"
+       depends on 64BIT
        select HAVE_PAGE_SIZE_64KB
        select PGTABLE_3LEVEL
        help
@@ -466,6 +508,7 @@ config EFI_STUB
 
 config SMP
        bool "Multi-Processing support"
+       depends on 64BIT
        help
          This enables support for systems with more than one CPU. If you have
          a system with only one CPU, say N. If you have a system with more
@@ -504,6 +547,7 @@ config NR_CPUS
 config NUMA
        bool "NUMA Support"
        select SMP
+       depends on 64BIT
        help
          Say Y to compile the kernel with NUMA (Non-Uniform Memory Access)
          support.  This option improves performance on systems with more
@@ -586,7 +630,7 @@ config CPU_HAS_FPU
 
 config CPU_HAS_LSX
        bool "Support for the Loongson SIMD Extension"
-       depends on AS_HAS_LSX_EXTENSION
+       depends on AS_HAS_LSX_EXTENSION && 64BIT
        help
          Loongson SIMD Extension (LSX) introduces 128 bit wide vector registers
          and a set of SIMD instructions to operate on them. When this option
@@ -601,7 +645,7 @@ config CPU_HAS_LSX
 config CPU_HAS_LASX
        bool "Support for the Loongson Advanced SIMD Extension"
        depends on CPU_HAS_LSX
-       depends on AS_HAS_LASX_EXTENSION
+       depends on AS_HAS_LASX_EXTENSION && 64BIT
        help
          Loongson Advanced SIMD Extension (LASX) introduces 256 bit wide vector
          registers and a set of SIMD instructions to operate on them. When this
@@ -615,7 +659,7 @@ config CPU_HAS_LASX
 
 config CPU_HAS_LBT
        bool "Support for the Loongson Binary Translation Extension"
-       depends on AS_HAS_LBT_EXTENSION
+       depends on AS_HAS_LBT_EXTENSION && 64BIT
        help
          Loongson Binary Translation (LBT) introduces 4 scratch registers (SCR0
          to SCR3), x86/ARM eflags (eflags) and x87 fpu stack pointer (ftop).
@@ -643,13 +687,13 @@ config ARCH_SELECTS_KEXEC_FILE
        select HAVE_IMA_KEXEC if IMA
 
 config ARCH_SUPPORTS_CRASH_DUMP
-       def_bool y
+       def_bool 64BIT
 
 config ARCH_DEFAULT_CRASH_DUMP
-       def_bool y
+       def_bool 64BIT
 
 config ARCH_SELECTS_CRASH_DUMP
-       def_bool y
+       def_bool 64BIT
        depends on CRASH_DUMP
        select RELOCATABLE
 
@@ -658,6 +702,7 @@ config ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION
 
 config RELOCATABLE
        bool "Relocatable kernel"
+       depends on 64BIT
        select ARCH_HAS_RELR
        help
          This builds the kernel as a Position Independent Executable (PIE),
@@ -694,7 +739,7 @@ source "kernel/livepatch/Kconfig"
 
 config PARAVIRT
        bool "Enable paravirtualization code"
-       depends on AS_HAS_LVZ_EXTENSION
+       depends on AS_HAS_LVZ_EXTENSION && 64BIT
        select HAVE_PV_STEAL_CLOCK_GEN
        help
          This changes the kernel so it can modify itself when it is run
@@ -723,7 +768,7 @@ config ARCH_FLATMEM_ENABLE
        depends on !NUMA
 
 config ARCH_SPARSEMEM_ENABLE
-       def_bool y
+       def_bool 64BIT
        select SPARSEMEM_VMEMMAP_ENABLE
        help
          Say Y to support efficient handling of sparse physical memory,
@@ -740,10 +785,12 @@ config MMU
        default y
 
 config ARCH_MMAP_RND_BITS_MIN
-       default 12
+       default 10 if 32BIT
+       default 12 if 64BIT
 
 config ARCH_MMAP_RND_BITS_MAX
-       default 18
+       default 15 if 32BIT
+       default 20 if 64BIT
 
 config ARCH_SUPPORTS_UPROBES
        def_bool y
index 8d45b860fe562b0e2ff51162d2ea280889aca946..47516aeea9d29f51f63eac2b1c2dde00245ed377 100644 (file)
@@ -25,6 +25,7 @@ endif
 #
 # Select the object file format to substitute into the linker script.
 #
+32bit-tool-archpref    = loongarch32
 64bit-tool-archpref    = loongarch64
 32bit-bfd              = elf32-loongarch
 64bit-bfd              = elf64-loongarch
@@ -51,7 +52,10 @@ KBUILD_CPPFLAGS += -DCC_USING_PATCHABLE_FUNCTION_ENTRY
 CC_FLAGS_FTRACE := -fpatchable-function-entry=2
 endif
 
-ifdef CONFIG_64BIT
+ifdef CONFIG_32BIT
+tool-archpref          = $(32bit-tool-archpref)
+UTS_MACHINE            := loongarch32
+else
 tool-archpref          = $(64bit-tool-archpref)
 UTS_MACHINE            := loongarch64
 endif
@@ -62,9 +66,19 @@ ifneq ($(SUBARCH),$(ARCH))
   endif
 endif
 
+ifdef CONFIG_32BIT
+ifdef CONFIG_32BIT_STANDARD
+ld-emul                        = $(32bit-emul)
+cflags-y               += -march=la32v1.0 -mabi=ilp32s -mcmodel=normal
+else  # CONFIG_32BIT_REDUCED
+ld-emul                        = $(32bit-emul)
+cflags-y               += -march=la32rv1.0 -mabi=ilp32s -mcmodel=normal
+endif
+endif
+
 ifdef CONFIG_64BIT
 ld-emul                        = $(64bit-emul)
-cflags-y               += -mabi=lp64s -mcmodel=normal
+cflags-y               += -march=loongarch64 -mabi=lp64s -mcmodel=normal
 endif
 
 cflags-y                       += -pipe $(CC_FLAGS_NO_FPU)
@@ -140,7 +154,12 @@ ifndef CONFIG_KASAN
 cflags-y += -fno-builtin-memcpy -fno-builtin-memmove -fno-builtin-memset
 endif
 
+ifdef CONFIG_32BIT
+load-y         = 0xa0200000
+else
 load-y         = 0x9000000000200000
+endif
+
 bootvars-y     = VMLINUX_LOAD_ADDRESS=$(load-y)
 
 drivers-$(CONFIG_PCI)          += arch/loongarch/pci/
index 4e1c374c57823ee995201c2b5d21ed70c504c5f1..8b6d9b42b5f0b44e9c5b5af4188e7d476197cf7d 100644 (file)
@@ -20,7 +20,13 @@ $(obj)/vmlinux.efi: vmlinux FORCE
        $(call if_changed,objcopy)
 
 EFI_ZBOOT_PAYLOAD      := vmlinux.efi
+
+ifdef CONFIG_32BIT
+EFI_ZBOOT_BFD_TARGET   := elf32-loongarch
+EFI_ZBOOT_MACH_TYPE    := LOONGARCH32
+else
 EFI_ZBOOT_BFD_TARGET   := elf64-loongarch
 EFI_ZBOOT_MACH_TYPE    := LOONGARCH64
+endif
 
 include $(srctree)/drivers/firmware/efi/libstub/Makefile.zboot
index d0e1377a041d63c94331736c17bfcb8be905458e..840d944c2f73898b11a15df893bba4400038ae89 100644 (file)
@@ -6,7 +6,12 @@
 
 #define PAGE_SIZE _PAGE_SIZE
 #define RO_EXCEPTION_TABLE_ALIGN       4
-#define PHYSADDR_MASK                  0xffffffffffff /* 48-bit */
+
+#ifdef CONFIG_32BIT
+#define PHYSADDR_MASK                  0x1fffffff      /* 29-bit */
+#else
+#define PHYSADDR_MASK                  0xffffffffffff  /* 48-bit */
+#endif
 
 /*
  * Put .bss..swapper_pg_dir as the first thing in .bss. This will
index 8e521360997523596dac1a85c0e02dff5c2bac51..15da2d88c0c10c42eaffa27649c39ddb7a06ee45 100644 (file)
@@ -19,7 +19,7 @@ if VIRTUALIZATION
 
 config KVM
        tristate "Kernel-based Virtual Machine (KVM) support"
-       depends on AS_HAS_LVZ_EXTENSION
+       depends on AS_HAS_LVZ_EXTENSION && 64BIT
        select HAVE_KVM_DIRTY_RING_ACQ_REL
        select HAVE_KVM_IRQ_ROUTING
        select HAVE_KVM_IRQCHIP
index ccea3bbd4353134fb115fc547f742f9f5e420204..a19466b22ab91accc38995a4ade7f793d0266bed 100644 (file)
@@ -3,8 +3,10 @@
 # Makefile for LoongArch-specific library files.
 #
 
-lib-y  += delay.o memset.o memcpy.o memmove.o \
-          clear_user.o copy_user.o csum.o dump_tlb.o unaligned.o
+lib-y  += delay.o clear_user.o copy_user.o dump_tlb.o unaligned.o
+
+lib-$(CONFIG_32BIT) += bswapsi.o bswapdi.o
+lib-$(CONFIG_64BIT) += memset.o memcpy.o memmove.o csum.o
 
 obj-$(CONFIG_ARCH_SUPPORTS_INT128) += tishift.o
 
index e386ffd009b7ef6a94ea398285915f38caf2bbe5..7c65e82525a8dea51dd72ea95b2906dfedf6061d 100644 (file)
@@ -97,6 +97,7 @@ zboot-obj-$(CONFIG_KERNEL_ZSTD)       := zboot-decompress-zstd.o lib-xxhash.o
 CFLAGS_zboot-decompress-zstd.o += -I$(srctree)/lib/zstd
 
 zboot-obj-$(CONFIG_RISCV)      += lib-clz_ctz.o lib-ashldi3.o
+zboot-obj-$(CONFIG_LOONGARCH)  += lib-clz_ctz.o lib-ashldi3.o
 lib-$(CONFIG_EFI_ZBOOT)                += zboot.o $(zboot-obj-y)
 
 lib-$(CONFIG_UNACCEPTED_MEMORY) += unaccepted_memory.o bitmap.o find.o
index 5aaed8ac6e443b17e717281ac8e40bbe5344974c..64a413396c14b24309430280d166d974e3ba0c55 100644 (file)
@@ -187,7 +187,7 @@ config VMD
 
 config PCI_LOONGSON
        bool "LOONGSON PCIe controller"
-       depends on MACH_LOONGSON64 || COMPILE_TEST
+       depends on MACH_LOONGSON32 || MACH_LOONGSON64 || COMPILE_TEST
        depends on OF || ACPI
        depends on PCI_QUIRKS
        default MACH_LOONGSON64
index 70e7a6016de3277d06360423a13cf448d7624d71..5bf613405fddaee5ee3379c804ad9f376488b721 100644 (file)
@@ -65,7 +65,7 @@ config CRC32_ARCH
        depends on CRC32 && CRC_OPTIMIZATIONS
        default y if ARM && KERNEL_MODE_NEON
        default y if ARM64
-       default y if LOONGARCH
+       default y if LOONGARCH && 64BIT
        default y if MIPS && CPU_MIPSR6
        default y if PPC64 && ALTIVEC
        default y if RISCV && RISCV_ISA_ZBC