mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-04 17:44:14 +08:00
174a0c565c
The use of the 'kernel_offset' variable to position the image file that has been loaded by UEFI or GRUB is unnecessary, because we can directly position the loaded image file through using the image_base field of the efi_loaded_image struct provided by UEFI. Replace kernel_offset with image_base to position the image file that has been loaded by UEFI or GRUB. Signed-off-by: Wang Yao <wangyao@lemote.com> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
165 lines
2.9 KiB
ArmAsm
165 lines
2.9 KiB
ArmAsm
/* 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
|
|
#define RO_EXCEPTION_TABLE_ALIGN 4
|
|
|
|
/*
|
|
* 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>
|
|
#include "image-vars.h"
|
|
|
|
/*
|
|
* Max avaliable Page Size is 64K, so we set SectionAlignment
|
|
* field of EFI application to 64K.
|
|
*/
|
|
PECOFF_FILE_ALIGN = 0x200;
|
|
PECOFF_SEGMENT_ALIGN = 0x10000;
|
|
|
|
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 = .;
|
|
HEAD_TEXT_SECTION
|
|
|
|
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
|
_stext = .;
|
|
.text : {
|
|
TEXT_TEXT
|
|
SCHED_TEXT
|
|
LOCK_TEXT
|
|
KPROBES_TEXT
|
|
IRQENTRY_TEXT
|
|
SOFTIRQENTRY_TEXT
|
|
*(.fixup)
|
|
*(.gnu.warning)
|
|
} :text = 0
|
|
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
|
_etext = .;
|
|
|
|
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
|
__init_begin = .;
|
|
__inittext_begin = .;
|
|
|
|
INIT_TEXT_SECTION(PAGE_SIZE)
|
|
.exit.text : {
|
|
EXIT_TEXT
|
|
}
|
|
|
|
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
|
__inittext_end = .;
|
|
|
|
__initdata_begin = .;
|
|
|
|
/*
|
|
* struct alt_inst entries. From the header (alternative.h):
|
|
* "Alternative instructions for different CPU types or capabilities"
|
|
* Think locking instructions on spinlocks.
|
|
*/
|
|
. = ALIGN(4);
|
|
.altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) {
|
|
__alt_instructions = .;
|
|
*(.altinstructions)
|
|
__alt_instructions_end = .;
|
|
}
|
|
|
|
INIT_DATA_SECTION(16)
|
|
.exit.data : {
|
|
EXIT_DATA
|
|
}
|
|
|
|
#ifdef CONFIG_SMP
|
|
PERCPU_SECTION(1 << CONFIG_L1_CACHE_SHIFT)
|
|
#endif
|
|
|
|
.init.bss : {
|
|
*(.init.bss)
|
|
}
|
|
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
|
__initdata_end = .;
|
|
|
|
__init_end = .;
|
|
|
|
_sdata = .;
|
|
RO_DATA(4096)
|
|
|
|
.got : ALIGN(16) { *(.got) }
|
|
.plt : ALIGN(16) { *(.plt) }
|
|
.got.plt : ALIGN(16) { *(.got.plt) }
|
|
|
|
RW_DATA(1 << CONFIG_L1_CACHE_SHIFT, PAGE_SIZE, THREAD_SIZE)
|
|
|
|
.rela.dyn : ALIGN(8) {
|
|
__rela_dyn_begin = .;
|
|
*(.rela.dyn) *(.rela*)
|
|
__rela_dyn_end = .;
|
|
}
|
|
|
|
.data.rel : { *(.data.rel*) }
|
|
|
|
#ifdef CONFIG_RELOCATABLE
|
|
. = ALIGN(8);
|
|
.la_abs : AT(ADDR(.la_abs) - LOAD_OFFSET) {
|
|
__la_abs_begin = .;
|
|
*(.la_abs)
|
|
__la_abs_end = .;
|
|
}
|
|
#endif
|
|
|
|
.sdata : {
|
|
*(.sdata)
|
|
}
|
|
.edata_padding : { BYTE(0); . = ALIGN(PECOFF_FILE_ALIGN); }
|
|
_edata = .;
|
|
|
|
BSS_SECTION(0, SZ_64K, 8)
|
|
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
|
|
|
_end = .;
|
|
|
|
STABS_DEBUG
|
|
DWARF_DEBUG
|
|
ELF_DETAILS
|
|
|
|
#ifdef CONFIG_EFI_STUB
|
|
/* header symbols */
|
|
_kernel_asize = _end - _text;
|
|
_kernel_fsize = _edata - _text;
|
|
_kernel_vsize = _end - __initdata_begin;
|
|
_kernel_rsize = _edata - __initdata_begin;
|
|
#endif
|
|
|
|
.gptab.sdata : {
|
|
*(.gptab.data)
|
|
*(.gptab.sdata)
|
|
}
|
|
.gptab.sbss : {
|
|
*(.gptab.bss)
|
|
*(.gptab.sbss)
|
|
}
|
|
|
|
DISCARDS
|
|
/DISCARD/ : {
|
|
*(.dynamic .dynsym .dynstr .hash .gnu.hash)
|
|
*(.gnu.attributes)
|
|
*(.options)
|
|
*(.eh_frame)
|
|
}
|
|
}
|