Skip to content

Commit

Permalink
Revert "arm64: get rid of TEXT_OFFSET"
Browse files Browse the repository at this point in the history
This reverts commit 120dc60.
  • Loading branch information
afaerber committed Sep 16, 2020
1 parent 43309e0 commit 0d2c647
Show file tree
Hide file tree
Showing 10 changed files with 29 additions and 14 deletions.
6 changes: 6 additions & 0 deletions arch/arm64/Makefile
Expand Up @@ -11,6 +11,7 @@
# Copyright (C) 1995-2001 by Russell King

LDFLAGS_vmlinux :=--no-undefined -X
CPPFLAGS_vmlinux.lds = -DTEXT_OFFSET=$(TEXT_OFFSET)

ifeq ($(CONFIG_RELOCATABLE), y)
# Pass --no-apply-dynamic-relocs to restore pre-binutils-2.27 behaviour
Expand Down Expand Up @@ -138,6 +139,9 @@ endif
# Default value
head-y := arch/arm64/kernel/head.o

# The byte offset of the kernel image in RAM from the start of RAM.
TEXT_OFFSET := 0x0

ifeq ($(CONFIG_KASAN_SW_TAGS), y)
KASAN_SHADOW_SCALE_SHIFT := 4
else
Expand All @@ -148,6 +152,8 @@ KBUILD_CFLAGS += -DKASAN_SHADOW_SCALE_SHIFT=$(KASAN_SHADOW_SCALE_SHIFT)
KBUILD_CPPFLAGS += -DKASAN_SHADOW_SCALE_SHIFT=$(KASAN_SHADOW_SCALE_SHIFT)
KBUILD_AFLAGS += -DKASAN_SHADOW_SCALE_SHIFT=$(KASAN_SHADOW_SCALE_SHIFT)

export TEXT_OFFSET

core-y += arch/arm64/
libs-y := arch/arm64/lib/ $(libs-y)
libs-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a
Expand Down
3 changes: 2 additions & 1 deletion arch/arm64/include/asm/boot.h
Expand Up @@ -13,7 +13,8 @@
#define MAX_FDT_SIZE SZ_2M

/*
* arm64 requires the kernel image to placed at a 2 MB aligned base address
* arm64 requires the kernel image to placed
* TEXT_OFFSET bytes beyond a 2 MB aligned base
*/
#define MIN_KIMG_ALIGN SZ_2M

Expand Down
2 changes: 1 addition & 1 deletion arch/arm64/include/asm/kernel-pgtable.h
Expand Up @@ -86,7 +86,7 @@
+ EARLY_PGDS((vstart), (vend)) /* each PGDIR needs a next level page table */ \
+ EARLY_PUDS((vstart), (vend)) /* each PUD needs a next level page table */ \
+ EARLY_PMDS((vstart), (vend))) /* each PMD needs a next level page table */
#define INIT_DIR_SIZE (PAGE_SIZE * EARLY_PAGES(KIMAGE_VADDR, _end))
#define INIT_DIR_SIZE (PAGE_SIZE * EARLY_PAGES(KIMAGE_VADDR + TEXT_OFFSET, _end))
#define IDMAP_DIR_SIZE (IDMAP_PGTABLE_LEVELS * PAGE_SIZE)

#ifdef CONFIG_ARM64_SW_TTBR0_PAN
Expand Down
2 changes: 1 addition & 1 deletion arch/arm64/include/asm/memory.h
Expand Up @@ -169,7 +169,7 @@ extern s64 memstart_addr;
/* PHYS_OFFSET - the physical address of the start of memory. */
#define PHYS_OFFSET ({ VM_BUG_ON(memstart_addr & 1); memstart_addr; })

/* the virtual base of the kernel image */
/* the virtual base of the kernel image (minus TEXT_OFFSET) */
extern u64 kimage_vaddr;

/* the offset between the kernel virtual and physical mappings */
Expand Down
2 changes: 2 additions & 0 deletions arch/arm64/kernel/Makefile
Expand Up @@ -3,6 +3,8 @@
# Makefile for the linux kernel.
#

CPPFLAGS_vmlinux.lds := -DTEXT_OFFSET=$(TEXT_OFFSET)
AFLAGS_head.o := -DTEXT_OFFSET=$(TEXT_OFFSET)
CFLAGS_armv8_deprecated.o := -I$(src)

CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE)
Expand Down
16 changes: 10 additions & 6 deletions arch/arm64/kernel/head.S
Expand Up @@ -36,10 +36,14 @@

#include "efi-header.S"

#define __PHYS_OFFSET KERNEL_START
#define __PHYS_OFFSET (KERNEL_START - TEXT_OFFSET)

#if (PAGE_OFFSET & 0x1fffff) != 0
#if (TEXT_OFFSET & 0xfff) != 0
#error TEXT_OFFSET must be at least 4KB aligned
#elif (PAGE_OFFSET & 0x1fffff) != 0
#error PAGE_OFFSET must be at least 2MB aligned
#elif TEXT_OFFSET > 0x1fffff
#error TEXT_OFFSET must be less than 2MB
#endif

/*
Expand All @@ -51,7 +55,7 @@
* x0 = physical address to the FDT blob.
*
* This code is mostly position independent so you call this at
* __pa(PAGE_OFFSET).
* __pa(PAGE_OFFSET + TEXT_OFFSET).
*
* Note that the callee-saved registers are used for storing variables
* that are useful before the MMU is enabled. The allocations are described
Expand All @@ -73,7 +77,7 @@ _head:
b primary_entry // branch to kernel start, magic
.long 0 // reserved
#endif
.quad 0 // Image load offset from start of RAM, little-endian
le64sym _kernel_offset_le // Image load offset from start of RAM, little-endian
le64sym _kernel_size_le // Effective size of kernel image, little-endian
le64sym _kernel_flags_le // Informative flags, little-endian
.quad 0 // reserved
Expand Down Expand Up @@ -378,7 +382,7 @@ SYM_FUNC_START_LOCAL(__create_page_tables)
* Map the kernel image (starting with PHYS_OFFSET).
*/
adrp x0, init_pg_dir
mov_q x5, KIMAGE_VADDR // compile time __va(_text)
mov_q x5, KIMAGE_VADDR + TEXT_OFFSET // compile time __va(_text)
add x5, x5, x23 // add KASLR displacement
mov x4, PTRS_PER_PGD
adrp x6, _end // runtime __pa(_end)
Expand Down Expand Up @@ -470,7 +474,7 @@ SYM_FUNC_END(__primary_switched)

.pushsection ".rodata", "a"
SYM_DATA_START(kimage_vaddr)
.quad _text
.quad _text - TEXT_OFFSET
SYM_DATA_END(kimage_vaddr)
EXPORT_SYMBOL(kimage_vaddr)
.popsection
Expand Down
1 change: 1 addition & 0 deletions arch/arm64/kernel/image.h
Expand Up @@ -62,6 +62,7 @@
*/
#define HEAD_SYMBOLS \
DEFINE_IMAGE_LE64(_kernel_size_le, _end - _text); \
DEFINE_IMAGE_LE64(_kernel_offset_le, TEXT_OFFSET); \
DEFINE_IMAGE_LE64(_kernel_flags_le, __HEAD_FLAGS);

#endif /* __ARM64_KERNEL_IMAGE_H */
4 changes: 2 additions & 2 deletions arch/arm64/kernel/vmlinux.lds.S
Expand Up @@ -103,7 +103,7 @@ SECTIONS
*(.dynsym .dynstr .hash .gnu.hash)
}

. = KIMAGE_VADDR;
. = KIMAGE_VADDR + TEXT_OFFSET;

.head.text : {
_text = .;
Expand Down Expand Up @@ -294,4 +294,4 @@ ASSERT((__entry_tramp_text_end - __entry_tramp_text_start) == PAGE_SIZE,
/*
* If padding is applied before .head.text, virt<->phys conversions will fail.
*/
ASSERT(_text == KIMAGE_VADDR, "HEAD is misaligned")
ASSERT(_text == (KIMAGE_VADDR + TEXT_OFFSET), "HEAD is misaligned")
1 change: 1 addition & 0 deletions drivers/firmware/efi/libstub/Makefile
Expand Up @@ -68,6 +68,7 @@ lib-$(CONFIG_ARM64) += arm64-stub.o
lib-$(CONFIG_X86) += x86-stub.o
lib-$(CONFIG_RISCV) += riscv-stub.o
CFLAGS_arm32-stub.o := -DTEXT_OFFSET=$(TEXT_OFFSET)
CFLAGS_arm64-stub.o := -DTEXT_OFFSET=$(TEXT_OFFSET)

# Even when -mbranch-protection=none is set, Clang will generate a
# .note.gnu.property for code-less object files (like lib/ctype.c),
Expand Down
6 changes: 3 additions & 3 deletions drivers/firmware/efi/libstub/arm64-stub.c
Expand Up @@ -77,7 +77,7 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,

kernel_size = _edata - _text;
kernel_memsize = kernel_size + (_end - _edata);
*reserve_size = kernel_memsize;
*reserve_size = kernel_memsize + TEXT_OFFSET % min_kimg_align();

if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) && phys_seed != 0) {
/*
Expand All @@ -91,7 +91,7 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
}

if (status != EFI_SUCCESS) {
if (IS_ALIGNED((u64)_text, min_kimg_align())) {
if (IS_ALIGNED((u64)_text - TEXT_OFFSET, min_kimg_align())) {
/*
* Just execute from wherever we were loaded by the
* UEFI PE/COFF loader if the alignment is suitable.
Expand All @@ -111,7 +111,7 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
}
}

*image_addr = *reserve_addr;
*image_addr = *reserve_addr + TEXT_OFFSET % min_kimg_align();
memcpy((void *)*image_addr, _text, kernel_size);

return EFI_SUCCESS;
Expand Down

0 comments on commit 0d2c647

Please sign in to comment.