From: Marc Zyngier <marc.zyngier@arm.com>
To: Christoffer Dall <christoffer.dall@linaro.org>
Cc: Andrew Jones <drjones@redhat.com>,
kvm@vger.kernel.org, Tomasz Nowicki <tn@semihalf.com>,
kvmarm@lists.cs.columbia.edu, Julien Grall <julien.grall@arm.com>,
Yury Norov <ynorov@caviumnetworks.com>,
linux-arm-kernel@lists.infradead.org,
Dave Martin <Dave.Martin@arm.com>,
Shih-Wei Li <shihwei@cs.columbia.edu>
Subject: Re: [PATCH v4 08/40] KVM: arm/arm64: Introduce vcpu_el1_is_32bit
Date: Wed, 21 Feb 2018 12:05:27 +0000 [thread overview]
Message-ID: <86d10ylf94.wl-marc.zyngier@arm.com> (raw)
In-Reply-To: <20180215210332.8648-9-christoffer.dall@linaro.org>
On Thu, 15 Feb 2018 21:03:00 +0000,
Christoffer Dall wrote:
>
> We have numerous checks around that checks if the HCR_EL2 has the RW bit
> set to figure out if we're running an AArch64 or AArch32 VM. In some
> cases, directly checking the RW bit (given its unintuitive name), is a
> bit confusing, and that's not going to improve as we move logic around
> for the following patches that optimize KVM on AArch64 hosts with VHE.
>
> Therefore, introduce a helper, vcpu_el1_is_32bit, and replace existing
> direct checks of HCR_EL2.RW with the helper.
>
> Reviewed-by: Julien Grall <julien.grall@arm.com>
> Reviewed-by: Julien Thierry <julien.thierry@arm.com>
> Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
> ---
>
> Notes:
> Changes since v2:
> - New patch
>
> Changes since v1:
> - Reworded comments as suggested by Drew
>
> arch/arm64/include/asm/kvm_emulate.h | 7 ++++++-
> arch/arm64/kvm/hyp/switch.c | 11 +++++------
> arch/arm64/kvm/hyp/sysreg-sr.c | 5 +++--
> arch/arm64/kvm/inject_fault.c | 6 +++---
> 4 files changed, 17 insertions(+), 12 deletions(-)
>
> diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/kvm_emulate.h
> index 9ee316b962c8..3cc535591bdf 100644
> --- a/arch/arm64/include/asm/kvm_emulate.h
> +++ b/arch/arm64/include/asm/kvm_emulate.h
> @@ -45,6 +45,11 @@ void kvm_inject_undef32(struct kvm_vcpu *vcpu);
> void kvm_inject_dabt32(struct kvm_vcpu *vcpu, unsigned long addr);
> void kvm_inject_pabt32(struct kvm_vcpu *vcpu, unsigned long addr);
>
> +static inline bool vcpu_el1_is_32bit(struct kvm_vcpu *vcpu)
> +{
> + return !(vcpu->arch.hcr_el2 & HCR_RW);
> +}
> +
> static inline void vcpu_reset_hcr(struct kvm_vcpu *vcpu)
> {
> vcpu->arch.hcr_el2 = HCR_GUEST_FLAGS;
> @@ -65,7 +70,7 @@ static inline void vcpu_reset_hcr(struct kvm_vcpu *vcpu)
> * For now this is conditional, since no AArch32 feature regs
> * are currently virtualised.
> */
> - if (vcpu->arch.hcr_el2 & HCR_RW)
> + if (!vcpu_el1_is_32bit(vcpu))
> vcpu->arch.hcr_el2 |= HCR_TID3;
> }
>
> diff --git a/arch/arm64/kvm/hyp/switch.c b/arch/arm64/kvm/hyp/switch.c
> index b51638490d85..fbab9752a9f4 100644
> --- a/arch/arm64/kvm/hyp/switch.c
> +++ b/arch/arm64/kvm/hyp/switch.c
> @@ -74,7 +74,7 @@ static hyp_alternate_select(__activate_traps_arch,
>
> static void __hyp_text __activate_traps(struct kvm_vcpu *vcpu)
> {
> - u64 val;
> + u64 hcr = vcpu->arch.hcr_el2;
>
> /*
> * We are about to set CPTR_EL2.TFP to trap all floating point
> @@ -85,17 +85,16 @@ static void __hyp_text __activate_traps(struct kvm_vcpu *vcpu)
> * If FP/ASIMD is not implemented, FPEXC is UNDEFINED and any access to
> * it will cause an exception.
> */
> - val = vcpu->arch.hcr_el2;
> -
> - if (!(val & HCR_RW) && system_supports_fpsimd()) {
> + if (vcpu_el1_is_32bit(vcpu) && system_supports_fpsimd()) {
> write_sysreg(1 << 30, fpexc32_el2);
> isb();
> }
> - write_sysreg(val, hcr_el2);
>
> - if (cpus_have_const_cap(ARM64_HAS_RAS_EXTN) && (val & HCR_VSE))
> + if (cpus_have_const_cap(ARM64_HAS_RAS_EXTN) && (hcr & HCR_VSE))
> write_sysreg_s(vcpu->arch.vsesr_el2, SYS_VSESR_EL2);
>
> + write_sysreg(hcr, hcr_el2);
> +
> /* Trap on AArch32 cp15 c15 accesses (EL1 or EL0) */
> write_sysreg(1 << 15, hstr_el2);
> /*
> diff --git a/arch/arm64/kvm/hyp/sysreg-sr.c b/arch/arm64/kvm/hyp/sysreg-sr.c
> index 434f0fc9cfb3..99fc60516103 100644
> --- a/arch/arm64/kvm/hyp/sysreg-sr.c
> +++ b/arch/arm64/kvm/hyp/sysreg-sr.c
> @@ -19,6 +19,7 @@
> #include <linux/kvm_host.h>
>
> #include <asm/kvm_asm.h>
> +#include <asm/kvm_emulate.h>
> #include <asm/kvm_hyp.h>
>
> /* Yes, this does nothing, on purpose */
> @@ -147,7 +148,7 @@ void __hyp_text __sysreg32_save_state(struct kvm_vcpu *vcpu)
> {
> u64 *spsr, *sysreg;
>
> - if (read_sysreg(hcr_el2) & HCR_RW)
> + if (!vcpu_el1_is_32bit(vcpu))
> return;
>
> spsr = vcpu->arch.ctxt.gp_regs.spsr;
> @@ -172,7 +173,7 @@ void __hyp_text __sysreg32_restore_state(struct kvm_vcpu *vcpu)
> {
> u64 *spsr, *sysreg;
>
> - if (read_sysreg(hcr_el2) & HCR_RW)
> + if (!vcpu_el1_is_32bit(vcpu))
> return;
>
> spsr = vcpu->arch.ctxt.gp_regs.spsr;
> diff --git a/arch/arm64/kvm/inject_fault.c b/arch/arm64/kvm/inject_fault.c
> index c1e179d34e6a..30a3f58cdb7b 100644
> --- a/arch/arm64/kvm/inject_fault.c
> +++ b/arch/arm64/kvm/inject_fault.c
> @@ -128,7 +128,7 @@ static void inject_undef64(struct kvm_vcpu *vcpu)
> */
> void kvm_inject_dabt(struct kvm_vcpu *vcpu, unsigned long addr)
> {
> - if (!(vcpu->arch.hcr_el2 & HCR_RW))
> + if (vcpu_el1_is_32bit(vcpu))
> kvm_inject_dabt32(vcpu, addr);
> else
> inject_abt64(vcpu, false, addr);
> @@ -144,7 +144,7 @@ void kvm_inject_dabt(struct kvm_vcpu *vcpu, unsigned long addr)
> */
> void kvm_inject_pabt(struct kvm_vcpu *vcpu, unsigned long addr)
> {
> - if (!(vcpu->arch.hcr_el2 & HCR_RW))
> + if (vcpu_el1_is_32bit(vcpu))
> kvm_inject_pabt32(vcpu, addr);
> else
> inject_abt64(vcpu, true, addr);
> @@ -158,7 +158,7 @@ void kvm_inject_pabt(struct kvm_vcpu *vcpu, unsigned long addr)
> */
> void kvm_inject_undefined(struct kvm_vcpu *vcpu)
> {
> - if (!(vcpu->arch.hcr_el2 & HCR_RW))
> + if (vcpu_el1_is_32bit(vcpu))
> kvm_inject_undef32(vcpu);
> else
> inject_undef64(vcpu);
> --
> 2.14.2
>
nit: not strictly necessary, but would it be worth adding a similar
(and trivial) version of this predicate to the 32bit code? Just to
keep things in sync?
Otherwise,
Acked-by: Marc Zyngier <marc.zyngier@arm.com>
M.
--
Jazz is not dead, it just smell funny.
next prev parent reply other threads:[~2018-02-21 12:05 UTC|newest]
Thread overview: 138+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-15 21:02 [PATCH v4 00/40] Optimize KVM/ARM for VHE systems Christoffer Dall
2018-02-15 21:02 ` [PATCH v4 01/40] KVM: arm/arm64: Avoid vcpu_load for other vcpu ioctls than KVM_RUN Christoffer Dall
2018-02-21 9:32 ` Marc Zyngier
2018-02-21 17:05 ` Andrew Jones
2018-02-15 21:02 ` [PATCH v4 02/40] KVM: arm/arm64: Move vcpu_load call after kvm_vcpu_first_run_init Christoffer Dall
2018-02-21 11:05 ` Marc Zyngier
2018-02-15 21:02 ` [PATCH v4 03/40] KVM: arm64: Avoid storing the vcpu pointer on the stack Christoffer Dall
2018-02-19 15:50 ` Julien Grall
2018-02-22 8:43 ` Christoffer Dall
2018-02-21 11:34 ` Marc Zyngier
2018-02-22 9:02 ` Christoffer Dall
2018-02-22 9:35 ` Marc Zyngier
2018-02-22 9:49 ` Andrew Jones
2018-02-21 17:32 ` Andrew Jones
2018-02-22 9:10 ` Christoffer Dall
2018-02-22 9:56 ` Andrew Jones
2018-02-22 10:24 ` Christoffer Dall
2018-02-15 21:02 ` [PATCH v4 04/40] KVM: arm64: Rework hyp_panic for VHE and non-VHE Christoffer Dall
2018-02-21 17:32 ` Andrew Jones
2018-02-15 21:02 ` [PATCH v4 05/40] KVM: arm64: Move HCR_INT_OVERRIDE to default HCR_EL2 guest flag Christoffer Dall
2018-02-15 21:02 ` [PATCH v4 06/40] KVM: arm/arm64: Get rid of vcpu->arch.irq_lines Christoffer Dall
2018-02-15 21:02 ` [PATCH v4 07/40] KVM: arm/arm64: Add kvm_vcpu_load_sysregs and kvm_vcpu_put_sysregs Christoffer Dall
2018-02-15 21:03 ` [PATCH v4 08/40] KVM: arm/arm64: Introduce vcpu_el1_is_32bit Christoffer Dall
2018-02-21 12:05 ` Marc Zyngier [this message]
2018-02-22 9:11 ` Christoffer Dall
2018-02-21 17:34 ` Andrew Jones
2018-02-15 21:03 ` [PATCH v4 09/40] KVM: arm64: Move debug dirty flag calculation out of world switch Christoffer Dall
2018-02-21 17:35 ` Andrew Jones
2018-02-15 21:03 ` [PATCH v4 10/40] KVM: arm64: Slightly improve debug save/restore functions Christoffer Dall
2018-02-21 17:39 ` Andrew Jones
2018-02-21 17:52 ` Marc Zyngier
2018-02-22 8:05 ` Andrew Jones
2018-02-24 18:32 ` Christoffer Dall
2018-02-24 20:16 ` Marc Zyngier
2018-02-15 21:03 ` [PATCH v4 11/40] KVM: arm64: Improve debug register save/restore flow Christoffer Dall
2018-02-21 17:40 ` Andrew Jones
2018-02-15 21:03 ` [PATCH v4 12/40] KVM: arm64: Factor out fault info population and gic workarounds Christoffer Dall
2018-02-21 17:41 ` Andrew Jones
2018-02-15 21:03 ` [PATCH v4 13/40] KVM: arm64: Introduce VHE-specific kvm_vcpu_run Christoffer Dall
2018-02-21 17:43 ` Andrew Jones
2018-02-21 18:18 ` Andrew Jones
2018-02-22 9:16 ` Christoffer Dall
2018-02-15 21:03 ` [PATCH v4 14/40] KVM: arm64: Remove kern_hyp_va() use in VHE switch function Christoffer Dall
2018-02-15 21:03 ` [PATCH v4 15/40] KVM: arm64: Don't deactivate VM on VHE systems Christoffer Dall
2018-02-15 21:03 ` [PATCH v4 16/40] KVM: arm64: Remove noop calls to timer save/restore from VHE switch Christoffer Dall
2018-02-21 17:43 ` Andrew Jones
2018-02-15 21:03 ` [PATCH v4 17/40] KVM: arm64: Move userspace system registers into separate function Christoffer Dall
2018-02-19 17:21 ` Julien Grall
2018-02-22 9:18 ` Christoffer Dall
2018-02-21 12:21 ` Marc Zyngier
2018-02-15 21:03 ` [PATCH v4 18/40] KVM: arm64: Rewrite sysreg alternatives to static keys Christoffer Dall
2018-02-21 17:44 ` Andrew Jones
2018-02-15 21:03 ` [PATCH v4 19/40] KVM: arm64: Introduce separate VHE/non-VHE sysreg save/restore functions Christoffer Dall
2018-02-15 21:03 ` [PATCH v4 20/40] KVM: arm/arm64: Remove leftover comment from kvm_vcpu_run_vhe Christoffer Dall
2018-02-21 17:47 ` Andrew Jones
2018-02-15 21:03 ` [PATCH v4 21/40] KVM: arm64: Unify non-VHE host/guest sysreg save and restore functions Christoffer Dall
2018-02-15 21:03 ` [PATCH v4 22/40] KVM: arm64: Don't save the host ELR_EL2 and SPSR_EL2 on VHE systems Christoffer Dall
2018-02-21 17:49 ` Andrew Jones
2018-02-15 21:03 ` [PATCH v4 23/40] KVM: arm64: Change 32-bit handling of VM system registers Christoffer Dall
2018-02-15 21:03 ` [PATCH v4 24/40] KVM: arm64: Rewrite system register accessors to read/write functions Christoffer Dall
2018-02-19 18:12 ` Julien Grall
2018-02-22 9:18 ` Christoffer Dall
2018-02-21 13:32 ` Marc Zyngier
2018-02-22 9:22 ` Christoffer Dall
2018-02-22 10:48 ` Marc Zyngier
2018-02-22 11:10 ` Christoffer Dall
2018-02-22 13:26 ` Marc Zyngier
2018-02-22 13:34 ` Andrew Jones
2018-02-22 14:35 ` Christoffer Dall
2018-02-22 15:11 ` Andrew Jones
2018-02-22 15:58 ` Christoffer Dall
2018-02-15 21:03 ` [PATCH v4 25/40] KVM: arm64: Introduce framework for accessing deferred sysregs Christoffer Dall
2018-02-21 14:16 ` Marc Zyngier
2018-02-22 13:40 ` Andrew Jones
2018-02-22 14:56 ` Christoffer Dall
2018-02-22 17:40 ` Julien Grall
2018-02-15 21:03 ` [PATCH v4 26/40] KVM: arm/arm64: Prepare to handle deferred save/restore of SPSR_EL1 Christoffer Dall
2018-02-21 14:47 ` Marc Zyngier
2018-02-22 9:25 ` Christoffer Dall
2018-02-22 13:49 ` Andrew Jones
2018-02-15 21:03 ` [PATCH v4 27/40] KVM: arm64: Prepare to handle deferred save/restore of ELR_EL1 Christoffer Dall
2018-02-21 15:08 ` Marc Zyngier
2018-02-22 13:51 ` Andrew Jones
2018-02-15 21:03 ` [PATCH v4 28/40] KVM: arm64: Defer saving/restoring 64-bit sysregs to vcpu load/put on VHE Christoffer Dall
2018-02-21 15:33 ` Marc Zyngier
2018-02-23 18:05 ` Christoffer Dall
2018-02-22 14:04 ` Andrew Jones
2018-02-22 18:30 ` Julien Grall
2018-02-22 18:31 ` Julien Grall
2018-02-22 19:49 ` Christoffer Dall
2018-02-22 19:48 ` Christoffer Dall
2018-02-15 21:03 ` [PATCH v4 29/40] KVM: arm64: Prepare to handle deferred save/restore of 32-bit registers Christoffer Dall
2018-02-21 15:44 ` Marc Zyngier
2018-02-22 14:30 ` Andrew Jones
2018-02-23 11:35 ` Julien Grall
2018-02-15 21:03 ` [PATCH v4 30/40] KVM: arm64: Defer saving/restoring 32-bit sysregs to vcpu load/put Christoffer Dall
2018-02-21 16:27 ` Marc Zyngier
2018-02-22 18:15 ` Christoffer Dall
2018-02-22 14:35 ` Andrew Jones
2018-02-22 14:58 ` Christoffer Dall
2018-02-15 21:03 ` [PATCH v4 31/40] KVM: arm64: Move common VHE/non-VHE trap config in separate functions Christoffer Dall
2018-02-21 17:59 ` Marc Zyngier
2018-02-22 18:17 ` Christoffer Dall
2018-02-25 21:27 ` Christoffer Dall
2018-02-22 15:34 ` Andrew Jones
2018-02-23 14:30 ` Julien Grall
2018-02-23 17:48 ` Christoffer Dall
2018-02-25 21:29 ` Christoffer Dall
2018-02-15 21:03 ` [PATCH v4 32/40] KVM: arm64: Directly call VHE and non-VHE FPSIMD enabled functions Christoffer Dall
2018-02-21 18:11 ` Marc Zyngier
2018-02-22 15:38 ` Andrew Jones
2018-02-15 21:03 ` [PATCH v4 33/40] KVM: arm64: Configure c15, PMU, and debug register traps on cpu load/put for VHE Christoffer Dall
2018-02-21 18:20 ` Marc Zyngier
2018-02-22 18:57 ` Christoffer Dall
2018-02-22 15:51 ` Andrew Jones
2018-02-15 21:03 ` [PATCH v4 34/40] KVM: arm64: Cleanup __activate_traps and __deactive_traps for VHE and non-VHE Christoffer Dall
2018-02-21 18:26 ` Marc Zyngier
2018-02-22 19:04 ` Christoffer Dall
2018-02-22 15:54 ` Andrew Jones
2018-02-15 21:03 ` [PATCH v4 35/40] KVM: arm/arm64: Get rid of vgic_elrsr Christoffer Dall
2018-02-22 9:45 ` Marc Zyngier
2018-02-23 14:44 ` Julien Grall
2018-02-23 17:50 ` Christoffer Dall
2018-02-15 21:03 ` [PATCH v4 36/40] KVM: arm/arm64: Handle VGICv2 save/restore from the main VGIC code Christoffer Dall
2018-02-15 21:03 ` [PATCH v4 37/40] KVM: arm/arm64: Move arm64-only vgic-v2-sr.c file to arm64 Christoffer Dall
2018-02-22 12:33 ` Marc Zyngier
2018-02-22 14:37 ` Christoffer Dall
2018-02-15 21:03 ` [PATCH v4 38/40] KVM: arm/arm64: Handle VGICv3 save/restore from the main VGIC code on VHE Christoffer Dall
2018-02-22 12:32 ` Marc Zyngier
2018-02-22 14:42 ` Christoffer Dall
2018-02-22 15:01 ` Marc Zyngier
2018-02-22 16:02 ` Christoffer Dall
2018-02-22 17:21 ` Marc Zyngier
2018-02-22 19:28 ` Christoffer Dall
2018-02-15 21:03 ` [PATCH v4 39/40] KVM: arm/arm64: Move VGIC APR save/restore to vgic put/load Christoffer Dall
2018-02-22 13:11 ` Marc Zyngier
2018-02-22 14:44 ` Christoffer Dall
2018-02-15 21:03 ` [PATCH v4 40/40] KVM: arm/arm64: Avoid VGICv3 save/restore on VHE with no IRQs Christoffer Dall
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=86d10ylf94.wl-marc.zyngier@arm.com \
--to=marc.zyngier@arm.com \
--cc=Dave.Martin@arm.com \
--cc=christoffer.dall@linaro.org \
--cc=drjones@redhat.com \
--cc=julien.grall@arm.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=shihwei@cs.columbia.edu \
--cc=tn@semihalf.com \
--cc=ynorov@caviumnetworks.com \
/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