Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2bf31a4a authored by Ard Biesheuvel's avatar Ard Biesheuvel Committed by Catalin Marinas
Browse files

arm64: avoid dynamic relocations in early boot code



Before implementing KASLR for arm64 by building a self-relocating PIE
executable, we have to ensure that values we use before the relocation
routine is executed are not subject to dynamic relocation themselves.
This applies not only to virtual addresses, but also to values that are
supplied by the linker at build time and relocated using R_AARCH64_ABS64
relocations.

So instead, use assemble time constants, or force the use of static
relocations by folding the constants into the instructions.

Reviewed-by: default avatarMark Rutland <mark.rutland@arm.com>
Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 6ad1fe5d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -61,7 +61,7 @@ ENTRY(entry)
	 */
	mov	x20, x0		// DTB address
	ldr	x0, [sp, #16]	// relocated _text address
	ldr	x21, =stext_offset
	movz	x21, #:abs_g0:stext_offset
	add	x21, x0, x21

	/*
+26 −13
Original line number Diff line number Diff line
@@ -67,12 +67,11 @@
 * in the entry routines.
 */
	__HEAD

_head:
	/*
	 * DO NOT MODIFY. Image header expected by Linux boot-loaders.
	 */
#ifdef CONFIG_EFI
efi_head:
	/*
	 * This add instruction has no meaningful effect except that
	 * its opcode forms the magic "MZ" signature required by UEFI.
@@ -94,14 +93,14 @@ efi_head:
	.byte	0x4d
	.byte	0x64
#ifdef CONFIG_EFI
	.long	pe_header - efi_head		// Offset to the PE header.
	.long	pe_header - _head		// Offset to the PE header.
#else
	.word	0				// reserved
#endif

#ifdef CONFIG_EFI
	.globl	__efistub_stext_offset
	.set	__efistub_stext_offset, stext - efi_head
	.set	__efistub_stext_offset, stext - _head
	.align 3
pe_header:
	.ascii	"PE"
@@ -124,7 +123,7 @@ optional_header:
	.long	_end - stext			// SizeOfCode
	.long	0				// SizeOfInitializedData
	.long	0				// SizeOfUninitializedData
	.long	__efistub_entry - efi_head	// AddressOfEntryPoint
	.long	__efistub_entry - _head		// AddressOfEntryPoint
	.long	__efistub_stext_offset		// BaseOfCode

extra_header_fields:
@@ -139,7 +138,7 @@ extra_header_fields:
	.short	0				// MinorSubsystemVersion
	.long	0				// Win32VersionValue

	.long	_end - efi_head			// SizeOfImage
	.long	_end - _head			// SizeOfImage

	// Everything before the kernel image is considered part of the header
	.long	__efistub_stext_offset		// SizeOfHeaders
@@ -219,11 +218,13 @@ ENTRY(stext)
	 * On return, the CPU will be ready for the MMU to be turned on and
	 * the TCR will have been set.
	 */
	ldr	x27, =__mmap_switched		// address to jump to after
	ldr	x27, 0f				// address to jump to after
						// MMU has been enabled
	adr_l	lr, __enable_mmu		// return (PIC) address
	b	__cpu_setup			// initialise processor
ENDPROC(stext)
	.align	3
0:	.quad	__mmap_switched - (_head - TEXT_OFFSET) + KIMAGE_VADDR

/*
 * Preserve the arguments passed by the bootloader in x0 .. x3
@@ -391,7 +392,8 @@ __create_page_tables:
	mov	x0, x26				// swapper_pg_dir
	ldr	x5, =KIMAGE_VADDR
	create_pgd_entry x0, x5, x3, x6
	ldr	x6, =KERNEL_END			// __va(KERNEL_END)
	ldr	w6, kernel_img_size
	add	x6, x6, x5
	mov	x3, x24				// phys offset
	create_block_map x0, x7, x3, x5, x6

@@ -408,6 +410,9 @@ __create_page_tables:
	mov	lr, x27
	ret
ENDPROC(__create_page_tables)

kernel_img_size:
	.long	_end - (_head - TEXT_OFFSET)
	.ltorg

/*
@@ -415,6 +420,10 @@ ENDPROC(__create_page_tables)
 */
	.set	initial_sp, init_thread_union + THREAD_START_SP
__mmap_switched:
	adr_l	x8, vectors			// load VBAR_EL1 with virtual
	msr	vbar_el1, x8			// vector table address
	isb

	// Clear BSS
	adr_l	x0, __bss_start
	mov	x1, xzr
@@ -610,13 +619,19 @@ ENTRY(secondary_startup)
	adrp	x26, swapper_pg_dir
	bl	__cpu_setup			// initialise processor

	ldr	x21, =secondary_data
	ldr	x27, =__secondary_switched	// address to jump to after enabling the MMU
	ldr	x8, =KIMAGE_VADDR
	ldr	w9, 0f
	sub	x27, x8, w9, sxtw		// address to jump to after enabling the MMU
	b	__enable_mmu
ENDPROC(secondary_startup)
0:	.long	(_text - TEXT_OFFSET) - __secondary_switched

ENTRY(__secondary_switched)
	ldr	x0, [x21]			// get secondary_data.stack
	adr_l	x5, vectors
	msr	vbar_el1, x5
	isb

	ldr_l	x0, secondary_data		// get secondary_data.stack
	mov	sp, x0
	and	x0, x0, #~(THREAD_SIZE - 1)
	msr	sp_el0, x0			// save thread_info
@@ -641,8 +656,6 @@ __enable_mmu:
	ubfx	x2, x1, #ID_AA64MMFR0_TGRAN_SHIFT, 4
	cmp	x2, #ID_AA64MMFR0_TGRAN_SUPPORTED
	b.ne	__no_granule_support
	ldr	x5, =vectors
	msr	vbar_el1, x5
	msr	ttbr0_el1, x25			// load TTBR0
	msr	ttbr1_el1, x26			// load TTBR1
	isb