-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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>
- Loading branch information
Huacai Chen
authored and
Ard Biesheuvel
committed
Sep 6, 2022
1 parent
568035b
commit ead384d
Showing
15 changed files
with
275 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* | ||
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited | ||
*/ | ||
|
||
#include <linux/pe.h> | ||
#include <linux/sizes.h> | ||
|
||
.macro __EFI_PE_HEADER | ||
.long PE_MAGIC | ||
.Lcoff_header: | ||
.short IMAGE_FILE_MACHINE_LOONGARCH64 /* Machine */ | ||
.short .Lsection_count /* NumberOfSections */ | ||
.long 0 /* TimeDateStamp */ | ||
.long 0 /* PointerToSymbolTable */ | ||
.long 0 /* NumberOfSymbols */ | ||
.short .Lsection_table - .Loptional_header /* SizeOfOptionalHeader */ | ||
.short IMAGE_FILE_DEBUG_STRIPPED | \ | ||
IMAGE_FILE_EXECUTABLE_IMAGE | \ | ||
IMAGE_FILE_LINE_NUMS_STRIPPED /* Characteristics */ | ||
|
||
.Loptional_header: | ||
.short PE_OPT_MAGIC_PE32PLUS /* PE32+ format */ | ||
.byte 0x02 /* MajorLinkerVersion */ | ||
.byte 0x14 /* MinorLinkerVersion */ | ||
.long __inittext_end - .Lefi_header_end /* SizeOfCode */ | ||
.long _end - __initdata_begin /* SizeOfInitializedData */ | ||
.long 0 /* SizeOfUninitializedData */ | ||
.long __efistub_efi_pe_entry - _head /* AddressOfEntryPoint */ | ||
.long .Lefi_header_end - _head /* BaseOfCode */ | ||
|
||
.Lextra_header_fields: | ||
.quad 0 /* ImageBase */ | ||
.long PECOFF_SEGMENT_ALIGN /* SectionAlignment */ | ||
.long PECOFF_FILE_ALIGN /* FileAlignment */ | ||
.short 0 /* MajorOperatingSystemVersion */ | ||
.short 0 /* MinorOperatingSystemVersion */ | ||
.short LINUX_EFISTUB_MAJOR_VERSION /* MajorImageVersion */ | ||
.short LINUX_EFISTUB_MINOR_VERSION /* MinorImageVersion */ | ||
.short 0 /* MajorSubsystemVersion */ | ||
.short 0 /* MinorSubsystemVersion */ | ||
.long 0 /* Win32VersionValue */ | ||
|
||
.long _end - _head /* SizeOfImage */ | ||
|
||
/* Everything before the kernel image is considered part of the header */ | ||
.long .Lefi_header_end - _head /* SizeOfHeaders */ | ||
.long 0 /* CheckSum */ | ||
.short IMAGE_SUBSYSTEM_EFI_APPLICATION /* Subsystem */ | ||
.short 0 /* DllCharacteristics */ | ||
.quad 0 /* SizeOfStackReserve */ | ||
.quad 0 /* SizeOfStackCommit */ | ||
.quad 0 /* SizeOfHeapReserve */ | ||
.quad 0 /* SizeOfHeapCommit */ | ||
.long 0 /* LoaderFlags */ | ||
.long (.Lsection_table - .) / 8 /* NumberOfRvaAndSizes */ | ||
|
||
.quad 0 /* ExportTable */ | ||
.quad 0 /* ImportTable */ | ||
.quad 0 /* ResourceTable */ | ||
.quad 0 /* ExceptionTable */ | ||
.quad 0 /* CertificationTable */ | ||
.quad 0 /* BaseRelocationTable */ | ||
|
||
/* Section table */ | ||
.Lsection_table: | ||
.ascii ".text\0\0\0" | ||
.long __inittext_end - .Lefi_header_end /* VirtualSize */ | ||
.long .Lefi_header_end - _head /* VirtualAddress */ | ||
.long __inittext_end - .Lefi_header_end /* SizeOfRawData */ | ||
.long .Lefi_header_end - _head /* PointerToRawData */ | ||
|
||
.long 0 /* PointerToRelocations */ | ||
.long 0 /* PointerToLineNumbers */ | ||
.short 0 /* NumberOfRelocations */ | ||
.short 0 /* NumberOfLineNumbers */ | ||
.long IMAGE_SCN_CNT_CODE | \ | ||
IMAGE_SCN_MEM_READ | \ | ||
IMAGE_SCN_MEM_EXECUTE /* Characteristics */ | ||
|
||
.ascii ".data\0\0\0" | ||
.long _end - __initdata_begin /* VirtualSize */ | ||
.long __initdata_begin - _head /* VirtualAddress */ | ||
.long _edata - __initdata_begin /* SizeOfRawData */ | ||
.long __initdata_begin - _head /* PointerToRawData */ | ||
|
||
.long 0 /* PointerToRelocations */ | ||
.long 0 /* PointerToLineNumbers */ | ||
.short 0 /* NumberOfRelocations */ | ||
.short 0 /* NumberOfLineNumbers */ | ||
.long IMAGE_SCN_CNT_INITIALIZED_DATA | \ | ||
IMAGE_SCN_MEM_READ | \ | ||
IMAGE_SCN_MEM_WRITE /* Characteristics */ | ||
|
||
.set .Lsection_count, (. - .Lsection_table) / 40 | ||
|
||
.balign 0x10000 /* PECOFF_SEGMENT_ALIGN */ | ||
.Lefi_header_end: | ||
.endm |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
/* SPDX-License-Identifier: GPL-2.0-only */ | ||
/* | ||
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited | ||
*/ | ||
#ifndef __LOONGARCH_KERNEL_IMAGE_VARS_H | ||
#define __LOONGARCH_KERNEL_IMAGE_VARS_H | ||
|
||
#ifdef CONFIG_EFI_STUB | ||
|
||
__efistub_memcmp = memcmp; | ||
__efistub_memchr = memchr; | ||
__efistub_memcpy = memcpy; | ||
__efistub_memmove = memmove; | ||
__efistub_memset = memset; | ||
__efistub_strcat = strcat; | ||
__efistub_strcmp = strcmp; | ||
__efistub_strlen = strlen; | ||
__efistub_strncat = strncat; | ||
__efistub_strnstr = strnstr; | ||
__efistub_strnlen = strnlen; | ||
__efistub_strrchr = strrchr; | ||
__efistub_kernel_entry = kernel_entry; | ||
__efistub_kernel_asize = kernel_asize; | ||
__efistub_kernel_fsize = kernel_fsize; | ||
__efistub_kernel_offset = kernel_offset; | ||
__efistub_screen_info = screen_info; | ||
|
||
#endif | ||
|
||
#endif /* __LOONGARCH_KERNEL_IMAGE_VARS_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.