2022-05-31 18:04:11 +08:00
# SPDX-License-Identifier: GPL-2.0
#
# Author: Huacai Chen <chenhuacai@loongson.cn>
# Copyright (C) 2020-2022 Loongson Technology Corporation Limited
boot := arch/loongarch/boot
2022-05-31 18:04:12 +08:00
KBUILD_DEFCONFIG := loongson3_defconfig
2022-08-22 14:39:49 +02:00
image-name-y := vmlinux
image-name-$(CONFIG_EFI_ZBOOT) := vmlinuz
efi/loongarch: Add efistub booting support
This patch adds efistub booting support, which is the standard UEFI boot
protocol for LoongArch to use.
We use generic efistub, which means we can pass boot information (i.e.,
system table, memory map, kernel command line, initrd) via a light FDT
and drop a lot of non-standard code.
We use a flat mapping to map the efi runtime in the kernel's address
space. In efi, VA = PA; in kernel, VA = PA + PAGE_OFFSET. As a result,
flat mapping is not identity mapping, SetVirtualAddressMap() is still
needed for the efi runtime.
Tested-by: Xi Ruoyao <xry111@xry111.site>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
[ardb: change fpic to fpie as suggested by Xi Ruoyao]
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
2022-08-19 18:20:37 +08:00
i f n d e f C O N F I G _ E F I _ S T U B
KBUILD_IMAGE := $( boot) /vmlinux.elf
e l s e
2022-08-22 14:39:49 +02:00
KBUILD_IMAGE := $( boot) /$( image-name-y) .efi
efi/loongarch: Add efistub booting support
This patch adds efistub booting support, which is the standard UEFI boot
protocol for LoongArch to use.
We use generic efistub, which means we can pass boot information (i.e.,
system table, memory map, kernel command line, initrd) via a light FDT
and drop a lot of non-standard code.
We use a flat mapping to map the efi runtime in the kernel's address
space. In efi, VA = PA; in kernel, VA = PA + PAGE_OFFSET. As a result,
flat mapping is not identity mapping, SetVirtualAddressMap() is still
needed for the efi runtime.
Tested-by: Xi Ruoyao <xry111@xry111.site>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
[ardb: change fpic to fpie as suggested by Xi Ruoyao]
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
2022-08-19 18:20:37 +08:00
e n d i f
2022-05-31 18:04:11 +08:00
#
# 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
i f d e f C O N F I G _ 6 4 B I T
tool-archpref = $( 64bit-tool-archpref)
UTS_MACHINE := loongarch64
e n d i f
i f n e q ( $( SUBARCH ) , $( ARCH ) )
ifeq ( $( CROSS_COMPILE) ,)
CROSS_COMPILE := $( call cc-cross-prefix, $( tool-archpref) -linux- $( tool-archpref) -linux-gnu- $( tool-archpref) -unknown-linux-gnu-)
endif
e n d i f
i f d e f C O N F I G _ 6 4 B I T
ld-emul = $( 64bit-emul)
cflags-y += -mabi= lp64s
e n d i f
cflags-y += -G0 -pipe -msoft-float
LDFLAGS_vmlinux += -G0 -static -n -nostdlib
2022-10-12 16:36:08 +08:00
# When the assembler supports explicit relocation hint, we must use it.
# GCC may have -mexplicit-relocs off by default if it was built with an old
# assembler, so we force it via an option.
#
# When the assembler does not supports explicit relocation hint, we can't use
# it. Disable it if the compiler supports it.
#
# If you've seen "unknown reloc hint" message building the kernel and you are
# now wondering why "-mexplicit-relocs" is not wrapped with cc-option: the
# combination of a "new" assembler and "old" compiler is not supported. Either
# upgrade the compiler or downgrade the assembler.
i f d e f C O N F I G _ A S _ H A S _ E X P L I C I T _ R E L O C S
cflags-y += -mexplicit-relocs
KBUILD_CFLAGS_KERNEL += -mdirect-extern-access
e l s e
cflags-y += $( call cc-option,-mno-explicit-relocs)
2022-05-31 18:04:11 +08:00
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
2022-10-12 16:36:08 +08:00
e n d i f
2022-05-31 18:04:11 +08:00
cflags-y += -ffreestanding
cflags-y += $( call cc-option, -mno-check-zero-division)
LoongArch: Add kdump support
This patch adds support for kdump. In kdump case the normal kernel will
reserve a region for the crash kernel and jump there on panic.
Arch-specific functions are added to allow for implementing a crash dump
file interface, /proc/vmcore, which can be viewed as a ELF file.
A user-space tool, such as kexec-tools, is responsible for allocating a
separate region for the core's ELF header within the crash kdump kernel
memory and filling it in when executing kexec_load().
Then, its location will be advertised to the crash dump kernel via a
command line argument "elfcorehdr=", and the crash dump kernel will
preserve this region for later use with arch_reserve_vmcore() at boot
time.
At the same time, the crash kdump kernel is also limited within the
"crashkernel" area via a command line argument "mem=", so as not to
destroy the original kernel dump data.
In the crash dump kernel environment, /proc/vmcore is used to access the
primary kernel's memory with copy_oldmem_page().
I tested kdump on LoongArch machines (Loongson-3A5000) and it works as
expected (suggested crashkernel parameter is "crashkernel=512M@2560M"),
you may test it by triggering a crash through /proc/sysrq-trigger:
$ sudo kexec -p /boot/vmlinux-kdump --reuse-cmdline --append="nr_cpus=1"
# echo c > /proc/sysrq-trigger
Signed-off-by: Youling Tang <tangyouling@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
2022-10-12 16:36:19 +08:00
i f n d e f C O N F I G _ P H Y S I C A L _ S T A R T
2022-05-31 18:04:11 +08:00
load-y = 0x9000000000200000
LoongArch: Add kdump support
This patch adds support for kdump. In kdump case the normal kernel will
reserve a region for the crash kernel and jump there on panic.
Arch-specific functions are added to allow for implementing a crash dump
file interface, /proc/vmcore, which can be viewed as a ELF file.
A user-space tool, such as kexec-tools, is responsible for allocating a
separate region for the core's ELF header within the crash kdump kernel
memory and filling it in when executing kexec_load().
Then, its location will be advertised to the crash dump kernel via a
command line argument "elfcorehdr=", and the crash dump kernel will
preserve this region for later use with arch_reserve_vmcore() at boot
time.
At the same time, the crash kdump kernel is also limited within the
"crashkernel" area via a command line argument "mem=", so as not to
destroy the original kernel dump data.
In the crash dump kernel environment, /proc/vmcore is used to access the
primary kernel's memory with copy_oldmem_page().
I tested kdump on LoongArch machines (Loongson-3A5000) and it works as
expected (suggested crashkernel parameter is "crashkernel=512M@2560M"),
you may test it by triggering a crash through /proc/sysrq-trigger:
$ sudo kexec -p /boot/vmlinux-kdump --reuse-cmdline --append="nr_cpus=1"
# echo c > /proc/sysrq-trigger
Signed-off-by: Youling Tang <tangyouling@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
2022-10-12 16:36:19 +08:00
e l s e
load-y = $( CONFIG_PHYSICAL_START)
e n d i f
2022-05-31 18:04:11 +08:00
bootvars-y = VMLINUX_LOAD_ADDRESS = $( load-y)
2022-08-06 15:19:33 +08:00
drivers-$(CONFIG_PCI) += arch/loongarch/pci/
2022-05-31 18:04:11 +08:00
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
# Don't emit unaligned accesses.
# Not all LoongArch cores support unaligned access, and as kernel we can't
# rely on others to provide emulation for these accesses.
KBUILD_CFLAGS += $( call cc-option,-mstrict-align)
KBUILD_CFLAGS += -isystem $( shell $( CC) -print-file-name= include)
KBUILD_LDFLAGS += -m $( ld-emul)
i f d e f C O N F I G _ L O O N G A R C H
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' )
e n d i f
libs-y += arch/loongarch/lib/
efi/loongarch: Add efistub booting support
This patch adds efistub booting support, which is the standard UEFI boot
protocol for LoongArch to use.
We use generic efistub, which means we can pass boot information (i.e.,
system table, memory map, kernel command line, initrd) via a light FDT
and drop a lot of non-standard code.
We use a flat mapping to map the efi runtime in the kernel's address
space. In efi, VA = PA; in kernel, VA = PA + PAGE_OFFSET. As a result,
flat mapping is not identity mapping, SetVirtualAddressMap() is still
needed for the efi runtime.
Tested-by: Xi Ruoyao <xry111@xry111.site>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
[ardb: change fpic to fpie as suggested by Xi Ruoyao]
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
2022-08-19 18:20:37 +08:00
libs-$(CONFIG_EFI_STUB) += $( objtree) /drivers/firmware/efi/libstub/lib.a
2022-05-31 18:04:11 +08:00
i f e q ( $( KBUILD_EXTMOD ) , )
prepare : vdso_prepare
vdso_prepare : prepare 0
$( Q) $( MAKE) $( build) = arch/loongarch/vdso include/generated/vdso-offsets.h
e n d i f
PHONY += vdso_install
vdso_install :
$( Q) $( MAKE) $( build) = arch/loongarch/vdso $@
efi/loongarch: Add efistub booting support
This patch adds efistub booting support, which is the standard UEFI boot
protocol for LoongArch to use.
We use generic efistub, which means we can pass boot information (i.e.,
system table, memory map, kernel command line, initrd) via a light FDT
and drop a lot of non-standard code.
We use a flat mapping to map the efi runtime in the kernel's address
space. In efi, VA = PA; in kernel, VA = PA + PAGE_OFFSET. As a result,
flat mapping is not identity mapping, SetVirtualAddressMap() is still
needed for the efi runtime.
Tested-by: Xi Ruoyao <xry111@xry111.site>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
[ardb: change fpic to fpie as suggested by Xi Ruoyao]
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
2022-08-19 18:20:37 +08:00
all : $( notdir $ ( KBUILD_IMAGE ) )
2022-05-31 18:04:11 +08:00
2022-08-22 14:39:49 +02:00
vmlinux.elf vmlinux.efi vmlinuz.efi : vmlinux
efi/loongarch: Add efistub booting support
This patch adds efistub booting support, which is the standard UEFI boot
protocol for LoongArch to use.
We use generic efistub, which means we can pass boot information (i.e.,
system table, memory map, kernel command line, initrd) via a light FDT
and drop a lot of non-standard code.
We use a flat mapping to map the efi runtime in the kernel's address
space. In efi, VA = PA; in kernel, VA = PA + PAGE_OFFSET. As a result,
flat mapping is not identity mapping, SetVirtualAddressMap() is still
needed for the efi runtime.
Tested-by: Xi Ruoyao <xry111@xry111.site>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
[ardb: change fpic to fpie as suggested by Xi Ruoyao]
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
2022-08-19 18:20:37 +08:00
$( Q) $( MAKE) $( build) = $( boot) $( bootvars-y) $( boot) /$@
2022-05-31 18:04:11 +08:00
install :
2022-08-22 14:39:49 +02:00
$( Q) install -D -m 755 $( KBUILD_IMAGE) $( INSTALL_PATH) /$( image-name-y) -$( KERNELRELEASE)
2022-05-31 18:04:11 +08:00
$( Q) install -D -m 644 .config $( INSTALL_PATH) /config-$( KERNELRELEASE)
$( Q) install -D -m 644 System.map $( INSTALL_PATH) /System.map-$( KERNELRELEASE)
d e f i n e a r c h h e l p
echo ' install - install kernel into $(INSTALL_PATH)'
echo
e n d e f