Thread (78 messages) 78 messages, 12 authors, 2022-05-14

Re: [PATCH V9 05/24] LoongArch: Add build infrastructure

From: Huacai Chen <hidden>
Date: 2022-05-01 12:42:09
Also in: linux-arch, lkml

Hi, Xuerui,

On Sun, May 1, 2022 at 6:09 PM WANG Xuerui [off-list ref] wrote:

On 4/30/22 17:04, Huacai Chen wrote:
quoted
This patch adds Kbuild, Makefile, Kconfig and link script for LoongArch
build infrastructure.

Signed-off-by: Huacai Chen <redacted>
---
  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?
quoted
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.
quoted
+
+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"?
quoted
+
+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
quoted
+
+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.
quoted
+       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.
quoted
+
+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?
quoted
+       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@loongson.cn>
+# 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.
quoted
+#
+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!
quoted
+
+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")
quoted
+
+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.
quoted
+
+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.
quoted
+#
+
+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/)
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help