Skip to content

arm64: Early CPU feature override, and applications to VHE, BTI and PAuth

Marc Zyngier kvmarm linux-arm-kernel lkml 7 versions – In review

Get series with b4
b4 am [email protected]

Versions newest first · linked by author and title

  1. v7 Latest23 patches 6 repliesIn review
  2. v621 patches 9 repliesSuperseded
  3. v521 patches 16 repliesSuperseded
Earlier versions · 4
VersionPostedPatchesRepliesStatus
v421 patches34 repliesSuperseded
v321 patches10 repliesSuperseded
v217 patches6 repliesSuperseded
v117 patches3 repliesSuperseded

Patches in v7 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/23arm64: Fix labels in el2_setup macrosarch/arm64/include/asm/el2_setup.h+12 -120 replies
2/23arm64: Fix outdated TCR setup commentarch/arm64/mm/proc.S+2 -20 replies
3/23arm64: Turn the MMU-on sequence into a macroarch/arm64/include/asm/assembler.h arch/arm64/kernel/head.S arch/arm64/mm/proc.S+22 -260 replies
4/23arm64: Provide an 'upgrade to VHE' stub hypercallarch/arm64/include/asm/virt.h arch/arm64/kernel/hyp-stub.S+80 -30 replies
5/23arm64: Initialise as nVHE before switching to VHEarch/arm64/kernel/head.S arch/arm64/kernel/hyp-stub.S arch/arm64/kernel/sleep.S+27 -360 replies
6/23arm64: Drop early setting of MDSCR_EL2.TPMSarch/arm64/include/asm/el2_setup.h+0 -30 replies
7/23arm64: Move VHE-specific SPE setup to mutate_to_vhe()arch/arm64/kernel/hyp-stub.S+5 -30 replies
8/23arm64: Simplify init_el2_state to be non-VHE onlyarch/arm64/include/asm/el2_setup.h arch/arm64/kernel/head.S arch/arm64/kvm/hyp/nvhe/hyp-init.S+10 -270 replies
9/23arm64: Move SCTLR_EL1 initialisation to EL-agnostic codearch/arm64/kernel/head.S+3 -50 replies
10/23arm64: cpufeature: Add global feature override facilityarch/arm64/include/asm/cpufeature.h arch/arm64/kernel/cpufeature.c+45 -60 replies
11/23arm64: cpufeature: Use IDreg override in __read_sysreg_by_encoding()arch/arm64/include/asm/cpufeature.h arch/arm64/kernel/cpufeature.c+14 -20 replies
12/23arm64: Extract early FDT mapping from kaslr_early_init()arch/arm64/include/asm/setup.h arch/arm64/kernel/head.S arch/arm64/kernel/kaslr.c +1 more+31 -50 replies
13/23arm64: cpufeature: Add an early command-line cpufeature override facilityarch/arm64/kernel/Makefile arch/arm64/kernel/head.S arch/arm64/kernel/idreg-override.c+152 -10 replies
14/23arm64: Allow ID_AA64MMFR1_EL1.VH to be overridden from the command linearch/arm64/include/asm/cpufeature.h arch/arm64/kernel/cpufeature.c arch/arm64/kernel/idreg-override.c+17 -10 replies
15/23arm64: Honor VHE being disabled from the command-linearch/arm64/kernel/asm-offsets.c arch/arm64/kernel/hyp-stub.S+14 -00 replies
16/23arm64: Add an aliasing facility for the idreg overridearch/arm64/kernel/idreg-override.c+14 -30 replies
17/23arm64: Make kvm-arm.mode={nvhe, protected} an alias of id_aa64mmfr1.vh=0Documentation/admin-guide/kernel-parameters.txt arch/arm64/kernel/idreg-override.c arch/arm64/kvm/arm.c+8 -00 replies
18/23KVM: arm64: Document HVC_VHE_RESTART stub hypercallDocumentation/virt/kvm/arm/hyp-abi.rst+9 -00 replies
19/23arm64: Move "nokaslr" over to the early cpufeature infrastructurearch/arm64/kernel/idreg-override.c arch/arm64/kernel/kaslr.c+17 -340 replies
20/23arm64: cpufeatures: Allow disabling of BTI from the command-lineDocumentation/admin-guide/kernel-parameters.txt arch/arm64/include/asm/cpufeature.h arch/arm64/kernel/cpufeature.c +2 more+19 -20 replies
21/23arm64: Defer enabling pointer authentication on boot corearch/arm64/include/asm/pointer_auth.h arch/arm64/include/asm/stackprotector.h arch/arm64/kernel/head.S+11 -40 replies
22/23arm64: cpufeatures: Allow disabling of Pointer Auth from the command-lineDocumentation/admin-guide/kernel-parameters.txt arch/arm64/include/asm/cpufeature.h arch/arm64/kernel/cpufeature.c +1 more+23 -10 replies
23/23arm64: Cope with CPUs stuck in VHE modearch/arm64/kernel/head.S arch/arm64/kernel/hyp-stub.S+54 -72 replies

Reviews trailers per patch

21 of 23 patches have a Reviewed-by or Acked-by.

PatchCatalin MarinasDavid BrazdilSrinivas RamanaSuzuki K Poulose
1/23A-b A-b
2/23A-b A-b
3/23A-b A-b
4/23A-b A-b
5/23A-b A-b
6/23
7/23A-b A-b
8/23A-b A-b
9/23A-b A-b
10/23R-b A-b R-b
11/23R-b A-b R-b
12/23A-b A-b
13/23R-b A-b
14/23R-b A-b A-b
15/23A-b A-b
16/23R-b A-b
17/23A-b A-b
18/23A-b
19/23A-b A-b
20/23R-b A-b T-b
21/23R-b A-b
22/23R-b A-b T-b
23/23

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes. Scroll the table sideways for all 4 reviewers.

Read the v7 thread

Cover letter [PATCH v7 00/23] arm64: Early CPU feature override, and applications to VHE, BTI and PAuth

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 system boots, by *always* booting non-VHE first, and then upgrading to VHE when deemed capable. Although it sounds scary, this is actually simple to implement (and I wish I had done that 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).

Further patches now add support for disabling BTI and PAuth, the latter being based on an initial series by Srinivas Ramana[0]. There is some ongoing discussions about being able to disable MTE, but no clear resolution on that subject yet

WARNING: this series breaks Apple M1 badly, as it is stuck in VHE mode. The last patch in this series papers over the problem, but it *isn't* a candidate for merging yet.

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

Branch available at [7].

* From v6 [6]:
- Greatly simplify SPE setup with VHE
- Simplify option parsing by reusing some of the helpers user by parse_args(). The whole function cannot be used though, as it does things that can't be done at the point where we parse the overrides.
- Add a patch allowing M1 CPUs to boot. This patch shouldn't be merged until we decide to support this non-architectural behaviour.

* From v5 [5]:
- Turn most __initdata into __initconst
- Ensure that all strings are part of the __initconst section. This is a bit ugly, but saves memory once up and running
- Make overrides __ro_after_init
- Change the command-line parsing so that the same feature can be overridden multiple times, with the expected left-to-right parsing order being respected
- Handle all space-like characters as option delimiters
- Collected Acks, RBs and TBs

* From v4 [4]:
- Documentation fixes
- Moved the val/mask pair into a arm64_ftr_override structure, leading to simpler code
- All arm64_ftr_reg now have a default override, which simplifies the code a bit further
- Dropped some of the "const" attributes
- Renamed init_shadow_regs() to init_feature_override()
- Renamed struct reg_desc to struct ftr_set_desc
- Refactored command-line parsing
- Simplified handling of VHE being disabled on the cmdline
- Turn EL1 S1 MMU off on switch to VHE
- HVC_VHE_RESTART now returns an error code on failure
- Added missing asmlinkage and dummy prototypes
- Collected Acks and RBs from David, Catalin and Suzuki

* From v3 [3]:
- Fixed the VHE_RESTART stub (duh!)
- Switched to using arm64_ftr_safe_value() instead of the user provided value
- Per-feature override warning

* From v2 [2]:
- Simplify the VHE_RESTART stub
- Fixed a number of spelling mistakes, and hopefully introduced a few more
- Override features in __read_sysreg_by_encoding()
- Allow both BTI and PAuth to be overridden on the command line
- Rebased on -rc3

* From v1 [1]:
- Fix SPE init on VHE when EL2 doesn't own SPE
- Fix re-init when KASLR is used
- Handle the resume path
- Rebased to 5.11-rc2

[0] https://lore.kernel.org/r/[email protected]
[1] https://lore.kernel.org/r/[email protected]
[2] https://lore.kernel.org/r/[email protected]
[3] https://lore.kernel.org/r/[email protected]
[4] https://lore.kernel.org/r/[email protected]
[5] https://lore.kernel.org/r/[email protected]
[6] https://lore.kernel.org/r/[email protected]
[7] https://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms.git/log/?h=hack/arm64-early-cpufeature

Marc Zyngier (22):
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: Drop early setting of MDSCR_EL2.TPMS
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: cpufeature: Use IDreg override in __read_sysreg_by_encoding()
arm64: Extract early FDT mapping from kaslr_early_init()
arm64: cpufeature: Add an early command-line cpufeature override
facility
arm64: Allow ID_AA64MMFR1_EL1.VH to be overridden from the command
line
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

    id_aa64mmfr1.vh=0

KVM: arm64: Document HVC_VHE_RESTART stub hypercall
arm64: Move "nokaslr" over to the early cpufeature infrastructure
arm64: cpufeatures: Allow disabling of BTI from the command-line
arm64: cpufeatures: Allow disabling of Pointer Auth from the
command-line
[DO NOT MERGE] arm64: Cope with CPUs stuck in VHE mode

Srinivas Ramana (1):
arm64: Defer enabling pointer authentication on boot core

 .../admin-guide/kernel-parameters.txt         |   9 +
 Documentation/virt/kvm/arm/hyp-abi.rst        |   9 +
 arch/arm64/include/asm/assembler.h            |  17 ++
 arch/arm64/include/asm/cpufeature.h           |  11 +
 arch/arm64/include/asm/el2_setup.h            |  60 ++---
 arch/arm64/include/asm/pointer_auth.h         |  10 +
 arch/arm64/include/asm/setup.h                |  11 +
 arch/arm64/include/asm/stackprotector.h       |   1 +
 arch/arm64/include/asm/virt.h                 |   7 +-
 arch/arm64/kernel/Makefile                    |   2 +-
 arch/arm64/kernel/asm-offsets.c               |   3 +
 arch/arm64/kernel/cpufeature.c                |  73 +++++-
 arch/arm64/kernel/head.S                      |  94 +++-----
 arch/arm64/kernel/hyp-stub.S                  | 141 +++++++++++-
 arch/arm64/kernel/idreg-override.c            | 216 ++++++++++++++++++
 arch/arm64/kernel/kaslr.c                     |  43 +---
 arch/arm64/kernel/setup.c                     |  15 ++
 arch/arm64/kernel/sleep.S                     |   1 +
 arch/arm64/kvm/arm.c                          |   3 +
 arch/arm64/kvm/hyp/nvhe/hyp-init.S            |   2 +-
 arch/arm64/mm/mmu.c                           |   2 +-
 arch/arm64/mm/proc.S                          |  16 +-
 22 files changed, 576 insertions(+), 170 deletions(-)
 create mode 100644 arch/arm64/include/asm/setup.h
 create mode 100644 arch/arm64/kernel/idreg-override.c
Signature · 6 lines
2.29.2

_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm