[PATCH] arm64: head.S: get rid of x25 and x26 with 'global' scope
Mark Rutland
mark.rutland at arm.com
Wed Aug 17 03:19:25 PDT 2016
On Tue, Aug 16, 2016 at 09:02:32PM +0200, Ard Biesheuvel wrote:
> Currently, x25 and x26 hold the physical addresses of idmap_pg_dir
> and swapper_pg_dir, respectively, when running early boot code. But
> having registers with 'global' scope in files that contain different
> sections with different lifetimes, and that are called by different
> CPUs at different times is a bit messy, especially since stashing the
> values does not buy us anything in terms of code size or clarity.
>
> So simply replace each reference to x25 or x26 with an adrp instruction
> referring to idmap_pg_dir or swapper_pg_dir directly.
>
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
Nice! I agree that this makes things clearer, and as far as I can tell
is correct, so FWIW:
Acked-by: Mark Rutland <mark.rutland at arm.com>
Was this just for the sake of cleanup, or should we expect more head.S
patches soon?
Thanks,
Mark.
> ---
> arch/arm64/kernel/sleep.S | 2 --
> arch/arm64/kernel/head.S | 28 +++++++++-----------
> 2 files changed, 13 insertions(+), 17 deletions(-)
>
> diff --git a/arch/arm64/kernel/sleep.S b/arch/arm64/kernel/sleep.S
> index 9a3aec97ac09..a20a7576e77d 100644
> --- a/arch/arm64/kernel/sleep.S
> +++ b/arch/arm64/kernel/sleep.S
> @@ -102,8 +102,6 @@ ENTRY(cpu_resume)
> /* enable the MMU early - so we can access sleep_save_stash by va */
> adr_l lr, __enable_mmu /* __cpu_setup will return here */
> ldr x27, =_cpu_resume /* __enable_mmu will branch here */
> - adrp x25, idmap_pg_dir
> - adrp x26, swapper_pg_dir
> b __cpu_setup
> ENDPROC(cpu_resume)
>
> diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
> index b77f58355da1..219676253dbc 100644
> --- a/arch/arm64/kernel/head.S
> +++ b/arch/arm64/kernel/head.S
> @@ -214,7 +214,7 @@ ENTRY(stext)
> adrp x24, __PHYS_OFFSET
> and x23, x24, MIN_KIMG_ALIGN - 1 // KASLR offset, defaults to 0
> bl set_cpu_boot_mode_flag
> - bl __create_page_tables // x25=TTBR0, x26=TTBR1
> + bl __create_page_tables
> /*
> * The following calls CPU setup code, see arch/arm64/mm/proc.S for
> * details.
> @@ -311,23 +311,21 @@ ENDPROC(preserve_boot_args)
> * been enabled
> */
> __create_page_tables:
> - adrp x25, idmap_pg_dir
> - adrp x26, swapper_pg_dir
> mov x28, lr
>
> /*
> * Invalidate the idmap and swapper page tables to avoid potential
> * dirty cache lines being evicted.
> */
> - mov x0, x25
> - add x1, x26, #SWAPPER_DIR_SIZE
> + adrp x0, idmap_pg_dir
> + adrp x1, swapper_pg_dir + SWAPPER_DIR_SIZE
> bl __inval_cache_range
>
> /*
> * Clear the idmap and swapper page tables.
> */
> - mov x0, x25
> - add x6, x26, #SWAPPER_DIR_SIZE
> + adrp x0, idmap_pg_dir
> + adrp x6, swapper_pg_dir + SWAPPER_DIR_SIZE
> 1: stp xzr, xzr, [x0], #16
> stp xzr, xzr, [x0], #16
> stp xzr, xzr, [x0], #16
> @@ -340,7 +338,7 @@ __create_page_tables:
> /*
> * Create the identity mapping.
> */
> - mov x0, x25 // idmap_pg_dir
> + adrp x0, idmap_pg_dir
> adrp x3, __idmap_text_start // __pa(__idmap_text_start)
>
> #ifndef CONFIG_ARM64_VA_BITS_48
> @@ -390,7 +388,7 @@ __create_page_tables:
> /*
> * Map the kernel image (starting with PHYS_OFFSET).
> */
> - mov x0, x26 // swapper_pg_dir
> + adrp x0, swapper_pg_dir
> mov_q x5, KIMAGE_VADDR + TEXT_OFFSET // compile time __va(_text)
> add x5, x5, x23 // add KASLR displacement
> create_pgd_entry x0, x5, x3, x6
> @@ -405,8 +403,8 @@ __create_page_tables:
> * accesses (MMU disabled), invalidate the idmap and swapper page
> * tables again to remove any speculatively loaded cache lines.
> */
> - mov x0, x25
> - add x1, x26, #SWAPPER_DIR_SIZE
> + adrp x0, idmap_pg_dir
> + adrp x1, swapper_pg_dir + SWAPPER_DIR_SIZE
> dmb sy
> bl __inval_cache_range
>
> @@ -666,8 +664,6 @@ secondary_startup:
> /*
> * Common entry point for secondary CPUs.
> */
> - adrp x25, idmap_pg_dir
> - adrp x26, swapper_pg_dir
> bl __cpu_setup // initialise processor
>
> adr_l x27, __secondary_switch // address to jump to after enabling the MMU
> @@ -731,8 +727,10 @@ ENTRY(__enable_mmu)
> cmp x2, #ID_AA64MMFR0_TGRAN_SUPPORTED
> b.ne __no_granule_support
> update_early_cpu_boot_status 0, x1, x2
> - msr ttbr0_el1, x25 // load TTBR0
> - msr ttbr1_el1, x26 // load TTBR1
> + adrp x1, idmap_pg_dir
> + adrp x2, swapper_pg_dir
> + msr ttbr0_el1, x1 // load TTBR0
> + msr ttbr1_el1, x2 // load TTBR1
> isb
> msr sctlr_el1, x0
> isb
> --
> 2.7.4
>
More information about the linux-arm-kernel
mailing list