From: Marc Zyngier <maz@kernel.org>
To: Will Deacon <will@kernel.org>
Cc: catalin.marinas@arm.com, kernel-team@android.com,
kvmarm@lists.cs.columbia.edu
Subject: Re: [PATCH v3 07/10] KVM: arm64: Allocate hyp vectors statically
Date: Fri, 13 Nov 2020 12:02:10 +0000 [thread overview]
Message-ID: <90f9dc9475059997d80dd254186c74f6@kernel.org> (raw)
In-Reply-To: <20201113113847.21619-8-will@kernel.org>
On 2020-11-13 11:38, Will Deacon wrote:
> The EL2 vectors installed when a guest is running point at one of the
> following configurations for a given CPU:
>
> - Straight at __kvm_hyp_vector
> - A trampoline containing an SMC sequence to mitigate Spectre-v2 and
> then a direct branch to __kvm_hyp_vector
> - A dynamically-allocated trampoline which has an indirect branch to
> __kvm_hyp_vector
> - A dynamically-allocated trampoline containing an SMC sequence to
> mitigate Spectre-v2 and then an indirect branch to __kvm_hyp_vector
>
> The indirect branches mean that VA randomization at EL2 isn't trivially
> bypassable using Spectre-v3a (where the vector base is readable by the
> guest).
>
> Rather than populate these vectors dynamically, configure everything
> statically and use an enumerated type to identify the vector "slot"
> corresponding to one of the configurations above. This both simplifies
> the code, but also makes it much easier to implement at EL2 later on.
>
> Cc: Marc Zyngier <maz@kernel.org>
> Cc: Quentin Perret <qperret@google.com>
> Signed-off-by: Will Deacon <will@kernel.org>
> ---
> arch/arm64/include/asm/kvm_asm.h | 5 --
> arch/arm64/include/asm/spectre.h | 36 +++++++++++++-
> arch/arm64/kernel/cpu_errata.c | 2 +
> arch/arm64/kernel/proton-pack.c | 63 +++++-------------------
> arch/arm64/kvm/arm.c | 82 +++++++++++++-------------------
> arch/arm64/kvm/hyp/Makefile | 2 +-
> arch/arm64/kvm/hyp/hyp-entry.S | 72 ++++++++++++++++------------
> arch/arm64/kvm/hyp/smccc_wa.S | 32 -------------
> arch/arm64/kvm/va_layout.c | 11 +----
> 9 files changed, 126 insertions(+), 179 deletions(-)
> delete mode 100644 arch/arm64/kvm/hyp/smccc_wa.S
I haven't had a chance to test this series yet, but I may have spotted
another small nit, see below:
[...]
> +static int kvm_init_vector_slots(void)
> +{
> + int err;
> + void *base;
> +
> + base = kern_hyp_va(kvm_ksym_ref(__kvm_hyp_vector));
> + kvm_init_vector_slot(base, HYP_VECTOR_DIRECT);
> +
> + base = kern_hyp_va(kvm_ksym_ref(__bp_harden_hyp_vecs));
> + kvm_init_vector_slot(base, HYP_VECTOR_SPECTRE_DIRECT);
>
> - /*
> - * SV2 = ARM64_SPECTRE_V2
> - * HEL2 = ARM64_HARDEN_EL2_VECTORS
> - *
> - * !SV2 + !HEL2 -> use direct vectors
> - * SV2 + !HEL2 -> use hardened vectors in place
> - * !SV2 + HEL2 -> allocate one vector slot and use exec mapping
> - * SV2 + HEL2 -> use hardened vectors and use exec mapping
> - */
> if (!cpus_have_const_cap(ARM64_HARDEN_EL2_VECTORS))
> return 0;
>
> - /*
> - * Always allocate a spare vector slot, as we don't know yet which
> CPUs
> - * have a BP hardening slot that we can reuse.
> - */
> - slot = atomic_inc_return(&arm64_el2_vector_last_slot);
> - BUG_ON(slot >= BP_HARDEN_EL2_SLOTS);
> - __kvm_harden_el2_vector_slot = slot;
> + if (!has_vhe()) {
> + err = create_hyp_exec_mappings(__pa_symbol(__bp_harden_hyp_vecs),
> + __BP_HARDEN_HYP_VECS_SZ, &base);
> + if (err)
> + return err;
> + }
>
> - return create_hyp_exec_mappings(__pa_symbol(__bp_harden_hyp_vecs),
> - __BP_HARDEN_HYP_VECS_SZ,
> - &__kvm_bp_vect_base);
> + kvm_init_vector_slot(base, HYP_VECTOR_INDIRECT);
> + kvm_init_vector_slot(base, HYP_VECTOR_SPECTRE_INDIRECT);
> + return 0;
> }
>
> static void cpu_init_hyp_mode(void)
> @@ -1406,24 +1403,9 @@ static void cpu_hyp_reset(void)
> static void cpu_set_hyp_vector(void)
> {
> struct bp_hardening_data *data = this_cpu_ptr(&bp_hardening_data);
> - void *vect = kern_hyp_va(kvm_ksym_ref(__kvm_hyp_vector));
> - int slot = -1;
> -
> - if (cpus_have_const_cap(ARM64_SPECTRE_V2) && data->fn) {
> - vect = kern_hyp_va(kvm_ksym_ref(__bp_harden_hyp_vecs));
> - slot = data->hyp_vectors_slot;
> - }
> + void *vector = hyp_spectre_vector_selector[data->slot];
>
> - if (this_cpu_has_cap(ARM64_HARDEN_EL2_VECTORS) && !has_vhe()) {
> - vect = __kvm_bp_vect_base;
> - if (slot == -1)
> - slot = __kvm_harden_el2_vector_slot;
> - }
> -
> - if (slot != -1)
> - vect += slot * SZ_2K;
> -
> - *this_cpu_ptr_hyp_sym(kvm_hyp_vector) = (unsigned long)vect;
> + *this_cpu_ptr_hyp_sym(kvm_hyp_vector) = (unsigned long)vector;
> }
>
> static void cpu_hyp_reinit(void)
> @@ -1661,9 +1643,9 @@ static int init_hyp_mode(void)
> goto out_err;
> }
>
> - err = kvm_map_vectors();
> + err = kvm_init_vector_slots();
> if (err) {
> - kvm_err("Cannot map vectors\n");
> + kvm_err("Cannot initialise vector slots\n");
> goto out_err;
> }
>
> @@ -1810,6 +1792,10 @@ int kvm_arch_init(void *opaque)
> goto out_err;
> }
>
> + err = kvm_init_vector_slots();
> + if (err)
> + goto out_err;
Don't you end-up calling kvm_init_vector_slots() twice on nVHE?
It's probably harmless, but I think we can have a single call here,
and drop the call from init_hyp_mode().
What do you think? If you agree, I can perform the change when queuing
the series.
Thanks,
M.
--
Jazz is not dead. It just smells funny...
_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
next prev parent reply other threads:[~2020-11-13 12:02 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-13 11:38 [PATCH v3 00/10] Rework hyp vector handling Will Deacon
2020-11-13 11:38 ` [PATCH v3 01/10] KVM: arm64: Remove redundant Spectre-v2 code from kvm_map_vector() Will Deacon
2020-11-13 11:38 ` [PATCH v3 02/10] KVM: arm64: Tidy up kvm_map_vector() Will Deacon
2020-11-13 11:38 ` [PATCH v3 03/10] KVM: arm64: Move kvm_get_hyp_vector() out of header file Will Deacon
2020-11-13 11:38 ` [PATCH v3 04/10] KVM: arm64: Make BP hardening globals static instead Will Deacon
2020-11-13 11:38 ` [PATCH v3 05/10] KVM: arm64: Move BP hardening helpers into spectre.h Will Deacon
2020-11-13 11:38 ` [PATCH v3 06/10] KVM: arm64: Re-jig logic when patching hardened hyp vectors Will Deacon
2020-11-13 11:38 ` [PATCH v3 07/10] KVM: arm64: Allocate hyp vectors statically Will Deacon
2020-11-13 12:02 ` Marc Zyngier [this message]
2020-11-13 12:10 ` Will Deacon
2020-11-13 11:38 ` [PATCH v3 08/10] arm64: spectre: Rename ARM64_HARDEN_EL2_VECTORS to ARM64_SPECTRE_V3A Will Deacon
2020-11-13 11:38 ` [PATCH v3 09/10] arm64: spectre: Consolidate spectre-v3a detection Will Deacon
2020-11-13 11:38 ` [PATCH v3 10/10] KVM: arm64: Remove redundant hyp vectors entry Will Deacon
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=90f9dc9475059997d80dd254186c74f6@kernel.org \
--to=maz@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=kernel-team@android.com \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=will@kernel.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