Hi, Xuerui, On Sun, May 1, 2022 at 6:09 PM WANG Xuerui <kernel@xxxxxxxxxx> wrote: > > > On 4/30/22 17:04, Huacai Chen wrote: > > This patch adds Kbuild, Makefile, Kconfig and link script for LoongArch > > build infrastructure. > > > > Signed-off-by: Huacai Chen <chenhuacai@xxxxxxxxxxx> > > --- > > arch/loongarch/.gitignore | 9 + > > arch/loongarch/Kbuild | 3 + > > arch/loongarch/Kconfig | 351 +++++++++++++++++++++++++ > > arch/loongarch/Kconfig.debug | 0 > > arch/loongarch/Makefile | 99 +++++++ > > arch/loongarch/include/asm/Kbuild | 29 ++ > > arch/loongarch/include/uapi/asm/Kbuild | 2 + > > arch/loongarch/kernel/Makefile | 22 ++ > > arch/loongarch/kernel/vmlinux.lds.S | 100 +++++++ > > arch/loongarch/lib/Makefile | 7 + > > arch/loongarch/mm/Makefile | 9 + > > arch/loongarch/pci/Makefile | 7 + > > scripts/subarch.include | 2 +- > > 13 files changed, 639 insertions(+), 1 deletion(-) > > create mode 100644 arch/loongarch/.gitignore > > create mode 100644 arch/loongarch/Kbuild > > create mode 100644 arch/loongarch/Kconfig > > create mode 100644 arch/loongarch/Kconfig.debug > > create mode 100644 arch/loongarch/Makefile > > create mode 100644 arch/loongarch/include/asm/Kbuild > > create mode 100644 arch/loongarch/include/uapi/asm/Kbuild > > create mode 100644 arch/loongarch/kernel/Makefile > > create mode 100644 arch/loongarch/kernel/vmlinux.lds.S > > create mode 100644 arch/loongarch/lib/Makefile > > create mode 100644 arch/loongarch/mm/Makefile > > create mode 100644 arch/loongarch/pci/Makefile > > > > diff --git a/arch/loongarch/.gitignore b/arch/loongarch/.gitignore > > new file mode 100644 > > index 000000000000..fd88d21e7172 > > --- /dev/null > > +++ b/arch/loongarch/.gitignore > > @@ -0,0 +1,9 @@ > > +*.lds > > +*.raw > > +calc_vmlinuz_load_addr > > +elf-entry > > +relocs > > +vmlinux* > > +vmlinuz* > > + > > +!kernel/vmlinux.lds.S > This exclude entry is unnecessary? > > diff --git a/arch/loongarch/Kbuild b/arch/loongarch/Kbuild > > new file mode 100644 > > index 000000000000..1ad35aabdd16 > > --- /dev/null > > +++ b/arch/loongarch/Kbuild > > @@ -0,0 +1,3 @@ > > +obj-y += kernel/ > > +obj-y += mm/ > > +obj-y += vdso/ > > diff --git a/arch/loongarch/Kconfig b/arch/loongarch/Kconfig > > new file mode 100644 > > index 000000000000..44b763046893 > > --- /dev/null > > +++ b/arch/loongarch/Kconfig > > @@ -0,0 +1,351 @@ > > +# SPDX-License-Identifier: GPL-2.0 > > +config LOONGARCH > > + bool > > + default y > > + select ACPI_MCFG if ACPI > > + select ACPI_SYSTEM_POWER_STATES_SUPPORT if ACPI > > + select ARCH_BINFMT_ELF_STATE > > + select ARCH_ENABLE_MEMORY_HOTPLUG > > + select ARCH_ENABLE_MEMORY_HOTREMOVE > > + select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI > > + select ARCH_HAS_PTE_SPECIAL > > + select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST > > + select ARCH_INLINE_READ_LOCK if !PREEMPTION > > + select ARCH_INLINE_READ_LOCK_BH if !PREEMPTION > > + select ARCH_INLINE_READ_LOCK_IRQ if !PREEMPTION > > + select ARCH_INLINE_READ_LOCK_IRQSAVE if !PREEMPTION > > + select ARCH_INLINE_READ_UNLOCK if !PREEMPTION > > + select ARCH_INLINE_READ_UNLOCK_BH if !PREEMPTION > > + select ARCH_INLINE_READ_UNLOCK_IRQ if !PREEMPTION > > + select ARCH_INLINE_READ_UNLOCK_IRQRESTORE if !PREEMPTION > > + select ARCH_INLINE_WRITE_LOCK if !PREEMPTION > > + select ARCH_INLINE_WRITE_LOCK_BH if !PREEMPTION > > + select ARCH_INLINE_WRITE_LOCK_IRQ if !PREEMPTION > > + select ARCH_INLINE_WRITE_LOCK_IRQSAVE if !PREEMPTION > > + select ARCH_INLINE_WRITE_UNLOCK if !PREEMPTION > > + select ARCH_INLINE_WRITE_UNLOCK_BH if !PREEMPTION > > + select ARCH_INLINE_WRITE_UNLOCK_IRQ if !PREEMPTION > > + select ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE if !PREEMPTION > > + select ARCH_INLINE_SPIN_TRYLOCK if !PREEMPTION > > + select ARCH_INLINE_SPIN_TRYLOCK_BH if !PREEMPTION > > + select ARCH_INLINE_SPIN_LOCK if !PREEMPTION > > + select ARCH_INLINE_SPIN_LOCK_BH if !PREEMPTION > > + select ARCH_INLINE_SPIN_LOCK_IRQ if !PREEMPTION > > + select ARCH_INLINE_SPIN_LOCK_IRQSAVE if !PREEMPTION > > + select ARCH_INLINE_SPIN_UNLOCK if !PREEMPTION > > + select ARCH_INLINE_SPIN_UNLOCK_BH if !PREEMPTION > > + select ARCH_INLINE_SPIN_UNLOCK_IRQ if !PREEMPTION > > + select ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE if !PREEMPTION > > + select ARCH_MIGHT_HAVE_PC_PARPORT > > + select ARCH_MIGHT_HAVE_PC_SERIO > > + select ARCH_SPARSEMEM_ENABLE > > + select ARCH_SUPPORTS_ACPI > > + select ARCH_SUPPORTS_ATOMIC_RMW > > + select ARCH_SUPPORTS_HUGETLBFS > > + select ARCH_USE_BUILTIN_BSWAP > > + select ARCH_USE_CMPXCHG_LOCKREF > > + select ARCH_USE_QUEUED_RWLOCKS > > + select ARCH_USE_QUEUED_SPINLOCKS > > + select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT > > + select ARCH_WANTS_NO_INSTR > > + select BUILDTIME_TABLE_SORT > > + select COMMON_CLK > > + select GENERIC_CLOCKEVENTS > > + select GENERIC_CMOS_UPDATE > > + select GENERIC_CPU_AUTOPROBE > > + select GENERIC_ENTRY > > + select GENERIC_FIND_FIRST_BIT > > + select GENERIC_GETTIMEOFDAY > > + select GENERIC_IRQ_MULTI_HANDLER > > + select GENERIC_IRQ_PROBE > > + select GENERIC_IRQ_SHOW > > + select GENERIC_LIB_ASHLDI3 > > + select GENERIC_LIB_ASHRDI3 > > + select GENERIC_LIB_CMPDI2 > > + select GENERIC_LIB_LSHRDI3 > > + select GENERIC_LIB_UCMPDI2 > > + select GENERIC_PCI_IOMAP > > + select GENERIC_SCHED_CLOCK > > + select GENERIC_TIME_VSYSCALL > > + select GPIOLIB > > + select HAVE_ARCH_AUDITSYSCALL > > + select HAVE_ARCH_COMPILER_H > > + select HAVE_ARCH_MMAP_RND_BITS if MMU > > + select HAVE_ARCH_SECCOMP_FILTER > > + select HAVE_ARCH_TRACEHOOK > > + select HAVE_ARCH_TRANSPARENT_HUGEPAGE > > + select HAVE_ASM_MODVERSIONS > > + select HAVE_CONTEXT_TRACKING > > + select HAVE_COPY_THREAD_TLS > > + select HAVE_DEBUG_KMEMLEAK > > + select HAVE_DEBUG_STACKOVERFLOW > > + select HAVE_DMA_CONTIGUOUS > > + select HAVE_EXIT_THREAD > > + select HAVE_FAST_GUP > > + select HAVE_GENERIC_VDSO > > + select HAVE_IOREMAP_PROT > > + select HAVE_IRQ_EXIT_ON_IRQ_STACK > > + select HAVE_IRQ_TIME_ACCOUNTING > > + select HAVE_MEMBLOCK > > + select HAVE_MEMBLOCK_NODE_MAP > > + select HAVE_MOD_ARCH_SPECIFIC > > + select HAVE_NMI > > + select HAVE_PCI > > + select HAVE_PERF_EVENTS > > + select HAVE_REGS_AND_STACK_ACCESS_API > > + select HAVE_RSEQ > > + select HAVE_SYSCALL_TRACEPOINTS > > + select HAVE_TIF_NOHZ > > + select HAVE_VIRT_CPU_ACCOUNTING_GEN > > + select IRQ_FORCED_THREADING > > + select IRQ_LOONGARCH_CPU > > + select MODULES_USE_ELF_RELA if MODULES > > + select PCI > > + select PCI_DOMAINS_GENERIC > > + select PCI_ECAM if ACPI > > + select PCI_MSI_ARCH_FALLBACKS > > + select PERF_USE_VMALLOC > > + select RTC_LIB > > + select SPARSE_IRQ > > + select SYSCTL_EXCEPTION_TRACE > > + select SWIOTLB > > + select TRACE_IRQFLAGS_SUPPORT > > + select ZONE_DMA32 > > + > > +config 32BIT > > + bool > > + > > +config 64BIT > > + def_bool y > > + > > +config CPU_HAS_FPU > > + bool > > + default y > > + > > +config CPU_HAS_PREFETCH > > + bool > > + default y > > + > > +config GENERIC_CALIBRATE_DELAY > > + def_bool y > > + > > +config GENERIC_CSUM > > + def_bool y > > + > > +config GENERIC_HWEIGHT > > + def_bool y > > + > > +config L1_CACHE_SHIFT > > + int > > + default "6" > > + > > +config LOCKDEP_SUPPORT > > + bool > > + default y > > + > > +config MACH_LOONGSON32 > > + def_bool 32BIT > > + > > +config MACH_LOONGSON64 > > + def_bool 64BIT > These two config symbols are not used anywhere in arch/loongarch, but > from a quick grep it seems they're sharing the names of the MIPS config > symbols, on purpose, maybe for sharing code between the MIPS-era > Loongson models and the LoongArch models. If so, a comment explaining > this could be beneficial. > > + > > +config PAGE_SIZE_4KB > > + bool > > + > > +config PAGE_SIZE_16KB > > + bool > > + > > +config PAGE_SIZE_64KB > > + bool > > + > > +config PGTABLE_2LEVEL > > + bool > > + > > +config PGTABLE_3LEVEL > > + bool > > + > > +config PGTABLE_4LEVEL > > + bool > > + > > +config PGTABLE_LEVELS > > + int > > + default 2 if PGTABLE_2LEVEL > > + default 3 if PGTABLE_3LEVEL > > + default 4 if PGTABLE_4LEVEL > > + > > +config SCHED_OMIT_FRAME_POINTER > > + bool > > + default y > > + > > +menu "Kernel type" > > + > > +source "kernel/Kconfig.hz" > > + > > +choice > > + prompt "Page Table Layout" > > + default 16KB_2LEVEL if 32BIT > > + default 16KB_3LEVEL if 64BIT > > + help > > + Allows choosing the page table layout, which is a combination > > + of page size and page table levels. The virtual memory address > > + space bits are determined by the page table layout. > "The size of virtual memory address space"? > > + > > +config 4KB_3LEVEL > > + bool "4KB with 3 levels" > > + select PAGE_SIZE_4KB > > + select PGTABLE_3LEVEL > > + help > > + This option selects 4KB page size with 3 level page tables, which > > + support a maximum 39 bits of application virtual memory. > "a maximum of XX bits" -- similarly for all occurrences below. OK, most of your suggestions will be taken. Huacai > > + > > +config 4KB_4LEVEL > > + bool "4KB with 4 levels" > > + select PAGE_SIZE_4KB > > + select PGTABLE_4LEVEL > > + help > > + This option selects 4KB page size with 4 level page tables, which > > + support a maximum 48 bits of application virtual memory. > > + > > +config 16KB_2LEVEL > > + bool "16KB with 2 levels" > > + select PAGE_SIZE_16KB > > + select PGTABLE_2LEVEL > > + help > > + This option selects 16KB page size with 2 level page tables, which > > + support a maximum 36 bits of application virtual memory. > > + > > +config 16KB_3LEVEL > > + bool "16KB with 3 levels" > > + select PAGE_SIZE_16KB > > + select PGTABLE_3LEVEL > > + help > > + This option selects 16KB page size with 3 level page tables, which > > + support a maximum 47 bits of application virtual memory. > > + > > +config 64KB_2LEVEL > > + bool "64KB with 2 levels" > > + select PAGE_SIZE_64KB > > + select PGTABLE_2LEVEL > > + help > > + This option selects 64KB page size with 2 level page tables, which > > + support a maximum 42 bits of application virtual memory. > > + > > +config 64KB_3LEVEL > > + bool "64KB with 3 levels" > > + select PAGE_SIZE_64KB > > + select PGTABLE_3LEVEL > > + help > > + This option selects 64KB page size with 3 level page tables, which > > + support a maximum 55 bits of application virtual memory. > > + > > +endchoice > > + > > +config DMI > > + bool "Enable DMI scanning" > > + select DMI_SCAN_MACHINE_NON_EFI_FALLBACK > > + default y > > + help > > + Enabled scanning of DMI to identify machine quirks. Say Y > Should be "Enable scanning ..." but the arch/x86 and arch/mips versions > of this text all have this typo. Might be wise to fix here... then fix > the other two later. > > + here unless you have verified that your setup is not > > + affected by entries in the DMI blacklist. Required by PNP > > + BIOS code. > Do we have a "PNP BIOS"? I know this is also copied text, but we may > tweak it to suit our platform. > > + > > +config EFI > > + bool "EFI runtime service support" > > + select UCS2_STRING > > + select EFI_RUNTIME_WRAPPERS > > + help > > + This enables the kernel to use EFI runtime services that are > > + available (such as the EFI variable services). > > + > > + This option is only useful on systems that have EFI firmware. > > + In addition, you should use the latest ELILO loader available > > + at <http://elilo.sourceforge.net> in order to take advantage > > + of EFI runtime services. However, even with this option, the > Remove mention of ELILO? > > + resultant kernel should continue to boot on existing non-EFI > > + platforms. > > + > > +config FORCE_MAX_ZONEORDER > > + int "Maximum zone order" > > + range 14 64 if PAGE_SIZE_64KB > > + default "14" if PAGE_SIZE_64KB > > + range 12 64 if PAGE_SIZE_16KB > > + default "12" if PAGE_SIZE_16KB > > + range 11 64 > > + default "11" > > + help > > + The kernel memory allocator divides physically contiguous memory > > + blocks into "zones", where each zone is a power of two number of > > + pages. This option selects the largest power of two that the kernel > > + keeps in the memory allocator. If you need to allocate very large > > + blocks of physically contiguous memory, then you may need to > > + increase this value. > > + > > + This config option is actually maximum order plus one. For example, > > + a value of 11 means that the largest free memory block is 2^10 pages. > > + > > + The page size is not necessarily 4KB. Keep this in mind > > + when choosing a value for this option. > > + > > +config SECCOMP > > + bool "Enable seccomp to safely compute untrusted bytecode" > > + depends on PROC_FS > > + default y > > + help > > + This kernel feature is useful for number crunching applications > > + that may need to compute untrusted bytecode during their > > + execution. By using pipes or other transports made available to > > + the process as file descriptors supporting the read/write > > + syscalls, it's possible to isolate those applications in > > + their own address space using seccomp. Once seccomp is > > + enabled via /proc/<pid>/seccomp, it cannot be disabled > > + and the task is only allowed to execute a few safe syscalls > > + defined by each seccomp mode. > > + > > + If unsure, say Y. Only embedded should say N here. > > + > > +endmenu > > + > > +config ARCH_SELECT_MEMORY_MODEL > > + def_bool y > > + > > +config ARCH_FLATMEM_ENABLE > > + def_bool y > > + > > +config ARCH_SPARSEMEM_ENABLE > > + def_bool y > > + help > > + Say Y to support efficient handling of sparse physical memory, > > + for architectures which are either NUMA (Non-Uniform Memory Access) > > + or have huge holes in the physical address space for other reasons. > > + See <file:Documentation/vm/numa.rst> for more. > > + > > +config ARCH_ENABLE_THP_MIGRATION > > + def_bool y > > + depends on TRANSPARENT_HUGEPAGE > > + > > +config ARCH_MEMORY_PROBE > > + def_bool y > > + depends on MEMORY_HOTPLUG > > + > > +config MMU > > + bool > > + default y > > + > > +config ARCH_MMAP_RND_BITS_MIN > > + default 12 > > + > > +config ARCH_MMAP_RND_BITS_MAX > > + default 18 > > + > > +menu "Bus options" > > + > > +endmenu > > + > > +menu "Power management options" > > + > > +source "drivers/acpi/Kconfig" > > + > > +endmenu > > + > > +source "drivers/firmware/Kconfig" > > diff --git a/arch/loongarch/Kconfig.debug b/arch/loongarch/Kconfig.debug > > new file mode 100644 > > index 000000000000..e69de29bb2d1 > > diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile > > new file mode 100644 > > index 000000000000..0a40e79b3265 > > --- /dev/null > > +++ b/arch/loongarch/Makefile > > @@ -0,0 +1,99 @@ > > +# SPDX-License-Identifier: GPL-2.0 > > +# > > +# Author: Huacai Chen <chenhuacai@xxxxxxxxxxx> > > +# Copyright (C) 2020-2022 Loongson Technology Corporation Limited > > + > > +# > > +# Select the object file format to substitute into the linker script. > > +# > > +64bit-tool-archpref = loongarch64 > > +32bit-bfd = elf32-loongarch > > +64bit-bfd = elf64-loongarch > > +32bit-emul = elf32loongarch > > +64bit-emul = elf64loongarch > > + > > +ifdef CONFIG_64BIT > > +tool-archpref = $(64bit-tool-archpref) > > +UTS_MACHINE := loongarch64 > > +endif > > + > > +ifneq ($(SUBARCH),$(ARCH)) > > + ifeq ($(CROSS_COMPILE),) > > + CROSS_COMPILE := $(call cc-cross-prefix, $(tool-archpref)-linux- $(tool-archpref)-linux-gnu- $(tool-archpref)-unknown-linux-gnu-) > > + endif > > +endif > > + > > +cflags-y += $(call cc-option, -mno-check-zero-division) > > + > > +ifdef CONFIG_64BIT > > +ld-emul = $(64bit-emul) > > +cflags-y += -mabi=lp64s > > +endif > > + > > +all-y := vmlinux > > + > > +# > > +# GCC uses -G0 -mabicalls -fpic as default. We don't want PIC in the kernel > > +# code since it only slows down the whole thing. At some point we might make > > +# use of global pointer optimizations but their use of $r2 conflicts with > > +# the current pointer optimization. > LoongArch doesn't have any notion of "abicalls", please remove the whole > MIPS legacy... or at least replace with something suitable for LoongArch. > > +# > > +cflags-y += -G0 -pipe > > +cflags-y += -msoft-float > > +LDFLAGS_vmlinux += -G0 -static -n -nostdlib > > +KBUILD_AFLAGS_KERNEL += -Wa,-mla-global-with-pcrel > > +KBUILD_CFLAGS_KERNEL += -Wa,-mla-global-with-pcrel > > +KBUILD_AFLAGS_MODULE += -Wa,-mla-global-with-abs > > +KBUILD_CFLAGS_MODULE += -fplt -Wa,-mla-global-with-abs,-mla-local-with-abs > These switches are the ones that should receive more love via > comments... they are here to tell the assembler to emit the "la.global" > and "la.local" pseudo-insns in a particular "flavor". Why not simply use > the default? This needs explanation! > > + > > +cflags-y += -ffreestanding > > +cflags-y += $(call as-option,-Wa$(comma)-mno-fix-loongson3-llsc,) > Unfortunately we're still working around the LL/SC hardware issue even > after migrating to LoongArch... might be better to add a comment too. > (something along the line of "we work around the issue manually in the > handwritten assembly, so no automatic workarounds should kick in") > > + > > +load-y = 0x9000000000200000 > > +bootvars-y = VMLINUX_LOAD_ADDRESS=$(load-y) > > + > > +drivers-$(CONFIG_PCI) += arch/loongarch/pci/ > > + > > +KBUILD_AFLAGS += $(cflags-y) > > +KBUILD_CFLAGS += $(cflags-y) > > +KBUILD_CPPFLAGS += -DVMLINUX_LOAD_ADDRESS=$(load-y) > > + > > +# This is required to get dwarf unwinding tables into .debug_frame > > +# instead of .eh_frame so we don't discard them. > > +KBUILD_CFLAGS += -fno-asynchronous-unwind-tables > > +KBUILD_CFLAGS += -isystem $(shell $(CC) -print-file-name=include) > > +KBUILD_CFLAGS += $(call cc-option,-mstrict-align) > Explain reason of this -mstrict-align request -- it's because not all > LoongArch cores support unaligned accesses, and as kernel we can't rely > on others to provide emulation for these accesses. > > + > > +KBUILD_LDFLAGS += -m $(ld-emul) > > + > > +ifdef CONFIG_LOONGARCH > > +CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \ > > + egrep -vw '__GNUC_(MINOR_|PATCHLEVEL_)?_' | \ > > + sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/" -e 's/\$$/&&/g') > > +endif > > + > > +head-y := arch/loongarch/kernel/head.o > > + > > +libs-y += arch/loongarch/lib/ > > + > > +prepare: vdso_prepare > > +vdso_prepare: prepare0 > > + $(Q)$(MAKE) $(build)=arch/loongarch/vdso include/generated/vdso-offsets.h > > + > > +PHONY += vdso_install > > +vdso_install: > > + $(Q)$(MAKE) $(build)=arch/loongarch/vdso $@ > > + > > +all: $(all-y) > > + > > +CLEAN_FILES += vmlinux > > + > > +install: > > + $(Q)install -D -m 755 vmlinux $(INSTALL_PATH)/vmlinux-$(KERNELRELEASE) > > + $(Q)install -D -m 644 .config $(INSTALL_PATH)/config-$(KERNELRELEASE) > > + $(Q)install -D -m 644 System.map $(INSTALL_PATH)/System.map-$(KERNELRELEASE) > > + > > +define archhelp > > + echo ' install - install kernel into $(INSTALL_PATH)' > > + echo > > +endef > > diff --git a/arch/loongarch/include/asm/Kbuild b/arch/loongarch/include/asm/Kbuild > > new file mode 100644 > > index 000000000000..a0eed6076c79 > > --- /dev/null > > +++ b/arch/loongarch/include/asm/Kbuild > > @@ -0,0 +1,29 @@ > > +# SPDX-License-Identifier: GPL-2.0 > > +generic-y += dma-contiguous.h > > +generic-y += export.h > > +generic-y += mcs_spinlock.h > > +generic-y += parport.h > > +generic-y += early_ioremap.h > > +generic-y += qrwlock.h > > +generic-y += qspinlock.h > > +generic-y += rwsem.h > > +generic-y += segment.h > > +generic-y += user.h > > +generic-y += stat.h > > +generic-y += fcntl.h > > +generic-y += ioctl.h > > +generic-y += ioctls.h > > +generic-y += mman.h > > +generic-y += msgbuf.h > > +generic-y += sembuf.h > > +generic-y += shmbuf.h > > +generic-y += statfs.h > > +generic-y += socket.h > > +generic-y += sockios.h > > +generic-y += termios.h > > +generic-y += termbits.h > > +generic-y += poll.h > > +generic-y += param.h > > +generic-y += posix_types.h > > +generic-y += resource.h > > +generic-y += kvm_para.h > > diff --git a/arch/loongarch/include/uapi/asm/Kbuild b/arch/loongarch/include/uapi/asm/Kbuild > > new file mode 100644 > > index 000000000000..4aa680ca2e5f > > --- /dev/null > > +++ b/arch/loongarch/include/uapi/asm/Kbuild > > @@ -0,0 +1,2 @@ > > +# SPDX-License-Identifier: GPL-2.0 > > +generic-y += kvm_para.h > > diff --git a/arch/loongarch/kernel/Makefile b/arch/loongarch/kernel/Makefile > > new file mode 100644 > > index 000000000000..ead27a11e8e0 > > --- /dev/null > > +++ b/arch/loongarch/kernel/Makefile > > @@ -0,0 +1,22 @@ > > +# SPDX-License-Identifier: GPL-2.0 > > +# > > +# Makefile for the Linux/LoongArch kernel. > > +# > > + > > +extra-y := head.o vmlinux.lds > > + > > +obj-y += cpu-probe.o cacheinfo.o cmdline.o env.o setup.o entry.o genex.o \ > > + traps.o irq.o idle.o process.o dma.o mem.o io.o reset.o switch.o \ > > + elf.o rtc.o syscall.o signal.o time.o topology.o cmpxchg.o \ > > + inst.o ptrace.o vdso.o > > + > > +obj-$(CONFIG_ACPI) += acpi.o > > +obj-$(CONFIG_EFI) += efi.o > > + > > +obj-$(CONFIG_CPU_HAS_FPU) += fpu.o > > + > > +obj-$(CONFIG_MODULES) += module.o module-sections.o > > + > > +obj-$(CONFIG_PROC_FS) += proc.o > > + > > +CPPFLAGS_vmlinux.lds := $(KBUILD_CFLAGS) > > diff --git a/arch/loongarch/kernel/vmlinux.lds.S b/arch/loongarch/kernel/vmlinux.lds.S > > new file mode 100644 > > index 000000000000..02abfaaa4892 > > --- /dev/null > > +++ b/arch/loongarch/kernel/vmlinux.lds.S > > @@ -0,0 +1,100 @@ > > +/* SPDX-License-Identifier: GPL-2.0 */ > > +#include <linux/sizes.h> > > +#include <asm/asm-offsets.h> > > +#include <asm/thread_info.h> > > + > > +#define PAGE_SIZE _PAGE_SIZE > > + > > +/* > > + * Put .bss..swapper_pg_dir as the first thing in .bss. This will > > + * ensure that it has .bss alignment (64K). > > + */ > > +#define BSS_FIRST_SECTIONS *(.bss..swapper_pg_dir) > > + > > +#include <asm-generic/vmlinux.lds.h> > > + > > +OUTPUT_ARCH(loongarch) > > +ENTRY(kernel_entry) > > +PHDRS { > > + text PT_LOAD FLAGS(7); /* RWX */ > > + note PT_NOTE FLAGS(4); /* R__ */ > > +} > > + > > +jiffies = jiffies_64; > > + > > +SECTIONS > > +{ > > + . = VMLINUX_LOAD_ADDRESS; > > + > > + _text = .; > > + .text : { > > + TEXT_TEXT > > + SCHED_TEXT > > + CPUIDLE_TEXT > > + LOCK_TEXT > > + KPROBES_TEXT > > + IRQENTRY_TEXT > > + SOFTIRQENTRY_TEXT > > + *(.fixup) > > + *(.gnu.warning) > > + } :text = 0 > > + _etext = .; > > + > > + EXCEPTION_TABLE(16) > > + > > + . = ALIGN(PAGE_SIZE); > > + __init_begin = .; > > + __inittext_begin = .; > > + > > + INIT_TEXT_SECTION(PAGE_SIZE) > > + .exit.text : { > > + EXIT_TEXT > > + } > > + > > + __inittext_end = .; > > + > > + __initdata_begin = .; > > + > > + INIT_DATA_SECTION(16) > > + .exit.data : { > > + EXIT_DATA > > + } > > + > > + __initdata_end = .; > > + > > + __init_end = .; > > + > > + _sdata = .; > > + RO_DATA(4096) > > + RW_DATA(1 << CONFIG_L1_CACHE_SHIFT, PAGE_SIZE, THREAD_SIZE) > > + > > + .sdata : { > > + *(.sdata) > > + } > > + > > + . = ALIGN(SZ_64K); > > + _edata = .; > > + > > + BSS_SECTION(0, SZ_64K, 8) > > + > > + _end = .; > > + > > + STABS_DEBUG > > + DWARF_DEBUG > > + > > + .gptab.sdata : { > > + *(.gptab.data) > > + *(.gptab.sdata) > > + } > > + .gptab.sbss : { > > + *(.gptab.bss) > > + *(.gptab.sbss) > > + } > > + > > + DISCARDS > > + /DISCARD/ : { > > + *(.gnu.attributes) > > + *(.options) > > + *(.eh_frame) > > + } > > +} > > diff --git a/arch/loongarch/lib/Makefile b/arch/loongarch/lib/Makefile > > new file mode 100644 > > index 000000000000..7f32f3e4a6ec > > --- /dev/null > > +++ b/arch/loongarch/lib/Makefile > > @@ -0,0 +1,7 @@ > > +# SPDX-License-Identifier: GPL-2.0 > > +# > > +# Makefile for LoongArch-specific library files.. > One extra period at end of line. > > +# > > + > > +lib-y += delay.o memset.o memcpy.o memmove.o \ > > + clear_user.o copy_user.o dump_tlb.o > > diff --git a/arch/loongarch/mm/Makefile b/arch/loongarch/mm/Makefile > > new file mode 100644 > > index 000000000000..8ffc6383f836 > > --- /dev/null > > +++ b/arch/loongarch/mm/Makefile > > @@ -0,0 +1,9 @@ > > +# SPDX-License-Identifier: GPL-2.0 > > +# > > +# Makefile for the Linux/LoongArch-specific parts of the memory manager. > > +# > > + > > +obj-y += init.o cache.o tlb.o tlbex.o extable.o \ > > + fault.o ioremap.o maccess.o mmap.o pgtable.o page.o > > + > > +obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o > > diff --git a/arch/loongarch/pci/Makefile b/arch/loongarch/pci/Makefile > > new file mode 100644 > > index 000000000000..8101ef3df71c > > --- /dev/null > > +++ b/arch/loongarch/pci/Makefile > > @@ -0,0 +1,7 @@ > > +# SPDX-License-Identifier: GPL-2.0 > > +# > > +# Makefile for the PCI specific kernel interface routines under Linux. > > +# > > + > > +obj-y += pci.o > > +obj-$(CONFIG_ACPI) += acpi.o > > diff --git a/scripts/subarch.include b/scripts/subarch.include > > index 776849a3c500..4bd327d0ae42 100644 > > --- a/scripts/subarch.include > > +++ b/scripts/subarch.include > > @@ -10,4 +10,4 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/x86/ -e s/x86_64/x86/ \ > > -e s/s390x/s390/ \ > > -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \ > > -e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ \ > > - -e s/riscv.*/riscv/) > > + -e s/riscv.*/riscv/ -e s/loongarch.*/loongarch/)