[PATCH 0/8] arm64: 2016 head.S spring cleaning

Ard Biesheuvel ard.biesheuvel at linaro.org
Mon Apr 4 07:52:16 PDT 2016


After having been responsible for obfuscating the head.S code in the v4.6
cycle to implement KASLR support, this series attempts to make amends by
performing some janitorial duties as well.

The main point of this series is to get rid of the file scoped callee saved
registers in head.S to store the FDT pointer, ID map and swapper dir addresses,
KASLR offset, PHYS offset etc. The fact that these are file scoped makes it
unnecessarily complicated to reason about lifetimes etc, especially since the
code is called by both the boot CPU and secondaries.

Since some of these functions are called without a stack, we still need to use
callee saved registers to preserve values across function calls without
stacking/unstacking the previous values, but these instances are now function
scoped, not file scoped, and documented.

Patch #1 gets rid of the confusing subtraction of address and offset values to
obtain __secondary_switched.

Patch #2 gets rid of x21 in head.S

Patch #3 creates moves the stack pointer init to an earlier time in
__mmap_switched, and creates a proper stack frame.

Patch #4 changes the EL2 detection code to simply use x0 as a return value and
first argument.

Patch #5 gets rid of x25 and x26 to store idmap_pg_dir and swapper_pg_dir

Patch #6 gets rid of x27 to store __mmap_switched or __secondary_switched

Patch #7 gets rid of x24 to store PHYS_OFFSET

Patch #8 gets rid of x23 to store the kaslr offset

@Maintainers: feel free to cherry pick if not all [or none] of these patches
make sense to you

Ard Biesheuvel (8):
  arm64/kernel: use literal for relocated address of
    __secondary_switched
  arm64/kernel: reuse boot_args array to get to __fdt_pointer
  arm64/kernel: use a proper stack frame in __mmap_switched()
  arm64/kernel: use ordinary calling convention for EL2 setup
  arm64/kernel: refer to idmap_pg_dir and swapper_pg_dir directly
  arm64/kernel: pass virtual entry point as __enable_mmu() argument
  arm64/kernel: drop __PHYS_OFFSET register with file scope from head.S
  arm64/kernel: drop global kaslr_offset in x23 from head.S

 arch/arm64/kernel/head.S  | 177 +++++++++++---------
 arch/arm64/kernel/setup.c |   4 +-
 2 files changed, 95 insertions(+), 86 deletions(-)

-- 
2.5.0




More information about the linux-arm-kernel mailing list