From: mark.rutland@arm.com (Mark Rutland)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 12/21] arm64: avoid dynamic relocations in early boot code
Date: Thu, 14 Jan 2016 17:09:52 +0000 [thread overview]
Message-ID: <20160114170951.GA23942@leverpostej> (raw)
In-Reply-To: <1452518355-4606-13-git-send-email-ard.biesheuvel@linaro.org>
On Mon, Jan 11, 2016 at 02:19:05PM +0100, Ard Biesheuvel wrote:
> 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.
>
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
I think we lose a bit of legibility due to the hoops we jump through for
the new literals. However, it is correct, and I've not managed to come
up with anything nicer.
FWIW:
Reviewed-by: Mark Rutland <mark.rutland@arm.com>
Thanks,
Mark.
> ---
> arch/arm64/kernel/efi-entry.S | 2 +-
> arch/arm64/kernel/head.S | 39 +++++++++++++-------
> 2 files changed, 27 insertions(+), 14 deletions(-)
>
> diff --git a/arch/arm64/kernel/efi-entry.S b/arch/arm64/kernel/efi-entry.S
> index a773db92908b..f82036e02485 100644
> --- a/arch/arm64/kernel/efi-entry.S
> +++ b/arch/arm64/kernel/efi-entry.S
> @@ -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
>
> /*
> diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
> index 211f75e673f4..5dc8079cef77 100644
> --- a/arch/arm64/kernel/head.S
> +++ b/arch/arm64/kernel/head.S
> @@ -78,12 +78,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.
> @@ -105,14 +104,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"
> @@ -135,7 +134,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:
> @@ -150,7 +149,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
> @@ -230,11 +229,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
> @@ -402,7 +403,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
>
> @@ -419,6 +421,9 @@ __create_page_tables:
> mov lr, x27
> ret
> ENDPROC(__create_page_tables)
> +
> +kernel_img_size:
> + .long _end - (_head - TEXT_OFFSET)
> .ltorg
>
> /*
> @@ -426,6 +431,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
> @@ -612,13 +621,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
> @@ -643,8 +658,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
> --
> 2.5.0
>
next prev parent reply other threads:[~2016-01-14 17:09 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-11 13:18 [PATCH v3 00/21] arm64: implement support for KASLR Ard Biesheuvel
2016-01-11 13:18 ` [PATCH v3 01/21] of/fdt: make memblock minimum physical address arch configurable Ard Biesheuvel
2016-01-11 13:18 ` [PATCH v3 02/21] arm64: introduce KIMAGE_VADDR as the virtual base of the kernel region Ard Biesheuvel
2016-01-11 16:31 ` Mark Rutland
2016-01-11 13:18 ` [PATCH v3 03/21] arm64: pgtable: add dummy pud_index() and pmd_index() definitions Ard Biesheuvel
2016-01-11 17:40 ` Mark Rutland
2016-01-12 17:25 ` Ard Biesheuvel
2016-01-11 13:18 ` [PATCH v3 04/21] arm64: decouple early fixmap init from linear mapping Ard Biesheuvel
2016-01-11 16:09 ` Mark Rutland
2016-01-11 16:15 ` Ard Biesheuvel
2016-01-11 16:27 ` Mark Rutland
2016-01-11 16:51 ` Mark Rutland
2016-01-11 17:08 ` Ard Biesheuvel
2016-01-11 17:15 ` Ard Biesheuvel
2016-01-11 17:21 ` Mark Rutland
2016-01-11 13:18 ` [PATCH v3 05/21] arm64: kvm: deal with kernel symbols outside of " Ard Biesheuvel
2016-01-12 12:36 ` Mark Rutland
2016-01-12 13:23 ` Ard Biesheuvel
2016-01-11 13:18 ` [PATCH v3 06/21] arm64: pgtable: implement static [pte|pmd|pud]_offset variants Ard Biesheuvel
2016-01-11 16:24 ` Mark Rutland
2016-01-11 17:28 ` Ard Biesheuvel
2016-01-11 17:31 ` Mark Rutland
2016-01-11 13:19 ` [PATCH v3 07/21] arm64: move kernel image to base of vmalloc area Ard Biesheuvel
2016-01-12 18:14 ` Mark Rutland
2016-01-13 8:39 ` Ard Biesheuvel
2016-01-13 9:58 ` Ard Biesheuvel
2016-01-13 11:11 ` Mark Rutland
2016-01-13 11:14 ` Ard Biesheuvel
2016-01-13 13:51 ` Mark Rutland
2016-01-13 15:50 ` Ard Biesheuvel
2016-01-13 16:26 ` Mark Rutland
2016-01-14 18:57 ` Mark Rutland
2016-01-15 9:54 ` Ard Biesheuvel
2016-01-15 11:23 ` Mark Rutland
2016-01-27 14:31 ` Ard Biesheuvel
2016-01-11 13:19 ` [PATCH v3 08/21] arm64: add support for module PLTs Ard Biesheuvel
2016-01-22 16:55 ` Mark Rutland
2016-01-22 17:06 ` Ard Biesheuvel
2016-01-22 17:19 ` Mark Rutland
2016-01-11 13:19 ` [PATCH v3 09/21] extable: add support for relative extables to search and sort routines Ard Biesheuvel
2016-01-11 13:19 ` [PATCH v3 10/21] arm64: switch to relative exception tables Ard Biesheuvel
2016-01-11 13:19 ` [PATCH v3 11/21] arm64: avoid R_AARCH64_ABS64 relocations for Image header fields Ard Biesheuvel
2016-01-13 18:12 ` Mark Rutland
2016-01-13 18:48 ` Ard Biesheuvel
2016-01-14 8:51 ` Ard Biesheuvel
2016-01-14 9:05 ` Ard Biesheuvel
2016-01-14 10:46 ` Mark Rutland
2016-01-14 11:22 ` Ard Biesheuvel
2016-01-11 13:19 ` [PATCH v3 12/21] arm64: avoid dynamic relocations in early boot code Ard Biesheuvel
2016-01-14 17:09 ` Mark Rutland [this message]
2016-01-11 13:19 ` [PATCH v3 13/21] arm64: allow kernel Image to be loaded anywhere in physical memory Ard Biesheuvel
2016-01-11 13:19 ` [PATCH v3 14/21] arm64: redefine SWAPPER_TABLE_SHIFT for use in asm code Ard Biesheuvel
2016-01-11 13:19 ` [PATCH v3 14/21] arm64: [re]define SWAPPER_TABLE_[SHIFT|SIZE] " Ard Biesheuvel
2016-01-11 13:26 ` Ard Biesheuvel
2016-01-11 13:19 ` [PATCH v3 15/21] arm64: split elf relocs into a separate header Ard Biesheuvel
2016-01-11 13:19 ` [PATCH v3 16/21] scripts/sortextable: add support for ET_DYN binaries Ard Biesheuvel
2016-01-11 13:19 ` [PATCH v3 17/21] arm64: add support for a relocatable kernel and KASLR Ard Biesheuvel
2016-01-11 13:19 ` [PATCH v3 18/21] efi: stub: implement efi_get_random_bytes() based on EFI_RNG_PROTOCOL Ard Biesheuvel
2016-01-21 15:42 ` Matt Fleming
2016-01-21 16:12 ` Ard Biesheuvel
2016-01-11 13:19 ` [PATCH v3 19/21] efi: stub: add implementation of efi_random_alloc() Ard Biesheuvel
2016-01-21 16:10 ` Matt Fleming
2016-01-21 16:16 ` Ard Biesheuvel
2016-01-11 13:19 ` [PATCH v3 20/21] efi: stub: use high allocation for converted command line Ard Biesheuvel
2016-01-21 16:20 ` Matt Fleming
2016-01-11 13:19 ` [PATCH v3 21/21] arm64: efi: invoke EFI_RNG_PROTOCOL to supply KASLR randomness Ard Biesheuvel
2016-01-21 16:31 ` Matt Fleming
2016-01-11 22:07 ` [PATCH v3 00/21] arm64: implement support for KASLR Kees Cook
2016-01-12 7:17 ` Ard Biesheuvel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160114170951.GA23942@leverpostej \
--to=mark.rutland@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).