From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 49C05C433FE for ; Thu, 3 Feb 2022 17:12:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=MviPF9d2LSAO3Lm587Iqj2ARg0Y0hWdBexes8TZz0zg=; b=tBXA0cB0H6OG3w rAlME5gQsd+D5i8EQh0ILnZACZ9QUxdIHzXJs2+aIBKwp4c/6d73C0T/26IVgvhSzty3npmTsU6XV 4h6vvz/UNpuR7S1LjIlNAgxVMq0lNxT7eWM5rCsbS/in/WVSej1Fcof2mKSrpoA8PFtwu5ycphOXq qO6wI5q3aP5krsI9DZllFqlKlo0h1j7xTgl6oEhJHH+QSgX8vArQz73wyBN8cKTVBwGLx7VGGWogE 5c0v1Ecxj6nrvKk7ShsiiSaS/kVsbV417+/ygHkq5d7xx1hWWfGM0n4FmXY248h+CaNpdcEN04Ryf DHrPtwdKl/vUu0CQ4vBw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nFfdb-0025uC-QH; Thu, 03 Feb 2022 17:11:15 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nFfdY-0025tS-CZ for linux-arm-kernel@lists.infradead.org; Thu, 03 Feb 2022 17:11:14 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 46358147A; Thu, 3 Feb 2022 09:11:10 -0800 (PST) Received: from monolith.localdoman (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 7AD043F40C; Thu, 3 Feb 2022 09:11:07 -0800 (PST) Date: Thu, 3 Feb 2022 17:11:16 +0000 From: Alexandru Elisei To: Marc Zyngier Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org, Andre Przywara , Christoffer Dall , Jintack Lim , Haibo Xu , Ganapatrao Kulkarni , Chase Conklin , "Russell King (Oracle)" , James Morse , Suzuki K Poulose , karl.heubaum@oracle.com, mihai.carabas@oracle.com, miguel.luis@oracle.com, kernel-team@android.com Subject: Re: [PATCH v6 18/64] KVM: arm64: nv: Trap EL1 VM register accesses in virtual EL2 Message-ID: References: <20220128121912.509006-1-maz@kernel.org> <20220128121912.509006-19-maz@kernel.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20220128121912.509006-19-maz@kernel.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220203_091112_550869_C3A779E8 X-CRM114-Status: GOOD ( 28.59 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi Marc, On Fri, Jan 28, 2022 at 12:18:26PM +0000, Marc Zyngier wrote: > From: Christoffer Dall > > When running in virtual EL2 mode, we actually run the hardware in EL1 > and therefore have to use the EL1 registers to ensure correct operation. > > By setting the HCR.TVM and HCR.TVRM we ensure that the virtual EL2 mode > doesn't shoot itself in the foot when setting up what it believes to be > a different mode's system register state (for example when preparing to > switch to a VM). > > We can leverage the existing sysregs infrastructure to support trapped > accesses to these registers. > > Signed-off-by: Christoffer Dall > Signed-off-by: Marc Zyngier > --- > arch/arm64/kvm/hyp/include/hyp/switch.h | 4 +--- > arch/arm64/kvm/hyp/nvhe/switch.c | 2 +- > arch/arm64/kvm/hyp/vhe/switch.c | 7 ++++++- > arch/arm64/kvm/sys_regs.c | 19 ++++++++++++++++--- > 4 files changed, 24 insertions(+), 8 deletions(-) > > diff --git a/arch/arm64/kvm/hyp/include/hyp/switch.h b/arch/arm64/kvm/hyp/include/hyp/switch.h > index 58e14f8ead23..49c3b9eb09d7 100644 > --- a/arch/arm64/kvm/hyp/include/hyp/switch.h > +++ b/arch/arm64/kvm/hyp/include/hyp/switch.h > @@ -110,10 +110,8 @@ static inline void __deactivate_traps_common(struct kvm_vcpu *vcpu) > write_sysreg(0, pmuserenr_el0); > } > > -static inline void ___activate_traps(struct kvm_vcpu *vcpu) > +static inline void ___activate_traps(struct kvm_vcpu *vcpu, u64 hcr) > { > - u64 hcr = vcpu->arch.hcr_el2; > - > if (cpus_have_final_cap(ARM64_WORKAROUND_CAVIUM_TX2_219_TVM)) > hcr |= HCR_TVM; > > diff --git a/arch/arm64/kvm/hyp/nvhe/switch.c b/arch/arm64/kvm/hyp/nvhe/switch.c > index 6410d21d8695..61a5627fd456 100644 > --- a/arch/arm64/kvm/hyp/nvhe/switch.c > +++ b/arch/arm64/kvm/hyp/nvhe/switch.c > @@ -38,7 +38,7 @@ static void __activate_traps(struct kvm_vcpu *vcpu) > { > u64 val; > > - ___activate_traps(vcpu); > + ___activate_traps(vcpu, vcpu->arch.hcr_el2); > __activate_traps_common(vcpu); > > val = vcpu->arch.cptr_el2; > diff --git a/arch/arm64/kvm/hyp/vhe/switch.c b/arch/arm64/kvm/hyp/vhe/switch.c > index 82ddaebe66de..6ed9e4893a02 100644 > --- a/arch/arm64/kvm/hyp/vhe/switch.c > +++ b/arch/arm64/kvm/hyp/vhe/switch.c > @@ -32,9 +32,14 @@ DEFINE_PER_CPU(unsigned long, kvm_hyp_vector); > > static void __activate_traps(struct kvm_vcpu *vcpu) > { > + u64 hcr = vcpu->arch.hcr_el2; > u64 val; > > - ___activate_traps(vcpu); > + /* Trap VM sysreg accesses if an EL2 guest is not using VHE. */ > + if (vcpu_is_el2(vcpu) && !vcpu_el2_e2h_is_set(vcpu)) > + hcr |= HCR_TVM | HCR_TRVM; > + > + ___activate_traps(vcpu, hcr); > > val = read_sysreg(cpacr_el1); > val |= CPACR_EL1_TTA; > diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c > index 102bc4906723..9d3520f1d17a 100644 > --- a/arch/arm64/kvm/sys_regs.c > +++ b/arch/arm64/kvm/sys_regs.c > @@ -322,8 +322,15 @@ static void get_access_mask(const struct sys_reg_desc *r, u64 *mask, u64 *shift) > > /* > * Generic accessor for VM registers. Only called as long as HCR_TVM > - * is set. If the guest enables the MMU, we stop trapping the VM > - * sys_regs and leave it in complete control of the caches. > + * is set. > + * > + * This is set in two cases: either (1) we're running at vEL2, or (2) > + * we're running at EL1 and the guest has its MMU off. > + * > + * (1) TVM/TRVM is set, as we need to virtualise some of the VM > + * registers for the guest hypervisor > + * (2) Once the guest enables the MMU, we stop trapping the VM sys_regs > + * and leave it in complete control of the caches. > */ > static bool access_vm_reg(struct kvm_vcpu *vcpu, > struct sys_reg_params *p, > @@ -332,7 +339,13 @@ static bool access_vm_reg(struct kvm_vcpu *vcpu, > bool was_enabled = vcpu_has_cache_enabled(vcpu); > u64 val, mask, shift; > > - BUG_ON(!p->is_write); > + /* We don't expect TRVM on the host */ I don't get what that means. Isn't KVM setting HCR_EL2.TRVM to trap reads? Other than that, the patch looks good: Reviewed-by: Alexandru Elisei Thanks, Alex > + BUG_ON(!vcpu_is_el2(vcpu) && !p->is_write); > + > + if (!p->is_write) { > + p->regval = vcpu_read_sys_reg(vcpu, r->reg); > + return true; > + } > > get_access_mask(r, &mask, &shift); > > -- > 2.30.2 > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel