[PATCH 00/17] arm64: Early CPU feature override, and an application to VHE

Marc Zyngier maz at kernel.org
Mon Dec 28 05:49:41 EST 2020

It recently came to light that there is a need to be able to override
some CPU features very early on, before the kernel is fully up and
running. The reasons for this range from specific feature support
(such as using Protected KVM on VHE HW, which is the main motivation
for this work) to errata workaround (a feature is broken on a CPU and
needs to be turned off, or rather not enabled).

This series tries to offer a limited framework for this kind of
problems, by allowing a set of options to be passed on the
command-line and altering the feature set that the cpufeature
subsystem exposes to the rest of the kernel. Note that this doesn't
change anything for code that directly uses the CPU ID registers.

The series completely changes the way a VHE-capable arm64 boots, by
*always* booting non-VHE first, and then upgrading to VHE when deemed
capable. Although this sounds scary, this is actually simple to
implement (and I wish I had though of it five years ago). The "upgrade
to VHE" path is then conditioned on the VHE feature not being disabled
from the command-line.

Said command-line parsing borrows a lot from the kaslr code, and
subsequently allows the "nokaslr" option to be moved to the new
infrastructure (though it all looks a bit... odd).

This has been tested on multiple VHE and non-VHE systems.

Marc Zyngier (17):
  arm64: Fix labels in el2_setup macros
  arm64: Fix outdated TCR setup comment
  arm64: Turn the MMU-on sequence into a macro
  arm64: Provide an 'upgrade to VHE' stub hypercall
  arm64: Initialise as nVHE before switching to VHE
  arm64: Move VHE-specific SPE setup to mutate_to_vhe()
  arm64: Simplify init_el2_state to be non-VHE only
  arm64: Move SCTLR_EL1 initialisation to EL-agnostic code
  arm64: cpufeature: Add global feature override facility
  arm64: Extract early FDT mapping from kaslr_early_init()
  arm64: cpufeature: Add an early command-line cpufeature override
  arm64: Allow ID_AA64MMFR1_EL1.VH to be overridden from the command
  arm64: Honor VHE being disabled from the command-line
  arm64: Add an aliasing facility for the idreg override
  arm64: Make kvm-arm.mode={nvhe,protected} an alias of
  KVM: arm64: Document HVC_VHE_RESTART stub hypercall
  arm64: Move "nokaslr" over to the early cpufeature infrastructure

 .../admin-guide/kernel-parameters.txt         |   3 +
 Documentation/virt/kvm/arm/hyp-abi.rst        |   9 +
 arch/arm64/include/asm/assembler.h            |  17 ++
 arch/arm64/include/asm/cpufeature.h           |   5 +
 arch/arm64/include/asm/el2_setup.h            |  60 +++----
 arch/arm64/include/asm/setup.h                |  11 ++
 arch/arm64/include/asm/virt.h                 |   7 +-
 arch/arm64/kernel/Makefile                    |   2 +-
 arch/arm64/kernel/cpufeature.c                |  32 +++-
 arch/arm64/kernel/head.S                      |  71 ++------
 arch/arm64/kernel/hyp-stub.S                  | 117 ++++++++++++-
 arch/arm64/kernel/idreg-override.c            | 161 ++++++++++++++++++
 arch/arm64/kernel/kaslr.c                     |  44 +----
 arch/arm64/kernel/setup.c                     |  15 ++
 arch/arm64/kvm/arm.c                          |   3 +
 arch/arm64/kvm/hyp/nvhe/hyp-init.S            |   2 +-
 arch/arm64/mm/proc.S                          |  16 +-
 17 files changed, 415 insertions(+), 160 deletions(-)
 create mode 100644 arch/arm64/include/asm/setup.h
 create mode 100644 arch/arm64/kernel/idreg-override.c


More information about the linux-arm-kernel mailing list