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 X-Spam-Level: X-Spam-Status: No, score=-13.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9DBC4C43461 for ; Wed, 16 Sep 2020 11:22:21 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4304321941 for ; Wed, 16 Sep 2020 11:22:21 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="zzdO4jc4"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="n8Oqer9i" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4304321941 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Subject:To:From: Message-ID:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=P3c3DznueNJKaiBI2qhDwKslFJLxzcPTCQCEuxQGRsA=; b=zzdO4jc4iB8h7tX3Hnv4V52yl OfdyDF4g/jrPHbq+DysHFGCvAYShuQGtGayz0+Lmlqwo6QgK9O2nZn57YTAyi+4n+3EQJbxoUPMmN z+jaty7oOZz6ZpH+RvmT+nYg2D5Fgez7FSeJ22WR7yoBNM/AEOkNXwdmSjxDeeRz/KowsxybH3+LM pVe+RFq+nbF4oP9tmGuOpNyBYsXQ6AvzdLicC1HmxBhF3gTumWop/hwV+DrIv07JA/+RckCjHGy4n VzVrs6r22lKupC1bcreKzM51fVWqYo4/MzwB6sLwceDZb2qWaAamBA6C1Ma/JeMoMbYzIhnqio/t5 0/7VCE7qQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kIVUQ-00056l-1b; Wed, 16 Sep 2020 11:20:42 +0000 Received: from mail.kernel.org ([198.145.29.99]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kIVUN-00056F-PZ for linux-arm-kernel@lists.infradead.org; Wed, 16 Sep 2020 11:20:40 +0000 Received: from disco-boy.misterjones.org (disco-boy.misterjones.org [51.254.78.96]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id B69F120684; Wed, 16 Sep 2020 11:20:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1600255237; bh=WiPDLj8v8FbgaKwYbzA0o/4g5mUTN/xOFlhfX1cJ69g=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=n8Oqer9iQ+OJ7Mt1CKYBCp/JO8YaBaA77VEtG4IYPJ62u3bRICHYgMOwZtsLqspea 33aVeSPwHdvTLnRY8KacCJ9r3pHX0nF7Nqpt/LQoxC9AD0MWmyo8osvHeTvmXfkiJU FQgWu7iMUupmOW8YmCDNnCwN45gjAw5+KDYkDUb8= Received: from 78.163-31-62.static.virginmediabusiness.co.uk ([62.31.163.78] helo=wait-a-minute.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kIVUJ-00CKp1-Ls; Wed, 16 Sep 2020 12:20:35 +0100 Date: Wed, 16 Sep 2020 12:20:34 +0100 Message-ID: <87k0wuq871.wl-maz@kernel.org> From: Marc Zyngier To: Andrew Scull Subject: Re: [PATCH v4 10/19] KVM: arm64: Restore hyp when panicking in guest context In-Reply-To: <20200915104643.2543892-11-ascull@google.com> References: <20200915104643.2543892-1-ascull@google.com> <20200915104643.2543892-11-ascull@google.com> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL/10.8 EasyPG/1.0.0 Emacs/26.3 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") X-SA-Exim-Connect-IP: 62.31.163.78 X-SA-Exim-Rcpt-To: ascull@google.com, kvmarm@lists.cs.columbia.edu, james.morse@arm.com, suzuki.poulose@arm.com, julien.thierry.kdev@gmail.com, will@kernel.org, catalin.marinas@arm.com, kernel-team@android.com, sudeep.holla@arm.com, linux-arm-kernel@lists.infradead.org X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200916_072039_956163_741B6426 X-CRM114-Status: GOOD ( 33.20 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kernel-team@android.com, suzuki.poulose@arm.com, catalin.marinas@arm.com, james.morse@arm.com, linux-arm-kernel@lists.infradead.org, Sudeep Holla , will@kernel.org, kvmarm@lists.cs.columbia.edu, julien.thierry.kdev@gmail.com 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 Andrew, On Tue, 15 Sep 2020 11:46:34 +0100, Andrew Scull wrote: > > If the guest context is loaded when a panic is triggered, restore the > hyp context so e.g. the shadow call stack works when hyp_panic() is > called and SP_EL0 is valid when the host's panic() is called. > > Use the hyp context's __hyp_running_vcpu field to track when hyp > transitions to and from the guest vcpu so the exception handlers know > whether the context needs to be restored. > > Signed-off-by: Andrew Scull > --- > arch/arm64/include/asm/kvm_asm.h | 10 ++++++++++ > arch/arm64/kvm/hyp/entry.S | 24 ++++++++++++++++++++++++ > arch/arm64/kvm/hyp/hyp-entry.S | 5 ++--- > arch/arm64/kvm/hyp/include/hyp/switch.h | 4 +++- > arch/arm64/kvm/hyp/nvhe/host.S | 5 +++++ > 5 files changed, 44 insertions(+), 4 deletions(-) > > diff --git a/arch/arm64/include/asm/kvm_asm.h b/arch/arm64/include/asm/kvm_asm.h > index fe51c06d480d..4df2bd8882bc 100644 > --- a/arch/arm64/include/asm/kvm_asm.h > +++ b/arch/arm64/include/asm/kvm_asm.h > @@ -236,6 +236,16 @@ extern char __smccc_workaround_1_smc[__SMCCC_WORKAROUND_1_SMC_SZ]; > ldr \vcpu, [\ctxt, #HOST_CONTEXT_VCPU] > .endm > > +.macro get_loaded_vcpu vcpu, ctxt > + hyp_adr_this_cpu \ctxt, kvm_hyp_ctxt, \vcpu > + ldr \vcpu, [\ctxt, #HOST_CONTEXT_VCPU] > +.endm > + > +.macro set_loaded_vcpu vcpu, ctxt, tmp > + hyp_adr_this_cpu \ctxt, kvm_hyp_ctxt, \tmp > + str \vcpu, [\ctxt, #HOST_CONTEXT_VCPU] > +.endm > + > /* > * KVM extable for unexpected exceptions. > * In the same format _asm_extable, but output to a different section so that > diff --git a/arch/arm64/kvm/hyp/entry.S b/arch/arm64/kvm/hyp/entry.S > index 38cca690a6ff..4787fc82790c 100644 > --- a/arch/arm64/kvm/hyp/entry.S > +++ b/arch/arm64/kvm/hyp/entry.S > @@ -86,6 +86,8 @@ alternative_else_nop_endif > ret > > 1: > + set_loaded_vcpu x0, x1, x2 > + > add x29, x0, #VCPU_CONTEXT > > // Macro ptrauth_switch_to_guest format: > @@ -116,6 +118,26 @@ alternative_else_nop_endif > eret > sb > > +SYM_INNER_LABEL(__guest_exit_panic, SYM_L_GLOBAL) > + // x2-x29,lr: vcpu regs > + // vcpu x0-x1 on the stack > + > + // If the hyp context is loaded, go straight to hyp_panic > + get_loaded_vcpu x0, x1 > + cbz x0, hyp_panic > + > + // The hyp context is saved so make sure it is restored to allow > + // hyp_panic to run at hyp and, subsequently, panic to run in the host. > + // This makes use of __guest_exit to avoid duplication but sets the > + // return address to tail call into hyp_panic. As a side effect, the > + // current state is saved to the guest context but it will only be > + // accurate if the guest had been completely restored. > + hyp_adr_this_cpu x0, kvm_hyp_ctxt, x1 > + adr x1, hyp_panic > + str x1, [x0, #CPU_XREG_OFFSET(30)] > + > + get_vcpu_ptr x1, x0 > + > SYM_INNER_LABEL(__guest_exit, SYM_L_GLOBAL) > // x0: return code > // x1: vcpu > @@ -163,6 +185,8 @@ SYM_INNER_LABEL(__guest_exit, SYM_L_GLOBAL) > // Now restore the hyp regs > restore_callee_saved_regs x2 > > + set_loaded_vcpu xzr, x1, x2 > + > alternative_if ARM64_HAS_RAS_EXTN > // If we have the RAS extensions we can consume a pending error > // without an unmask-SError and isb. The ESB-instruction consumed any > diff --git a/arch/arm64/kvm/hyp/hyp-entry.S b/arch/arm64/kvm/hyp/hyp-entry.S > index f92489250dfc..bc9f53df46f5 100644 > --- a/arch/arm64/kvm/hyp/hyp-entry.S > +++ b/arch/arm64/kvm/hyp/hyp-entry.S > @@ -145,7 +145,7 @@ el2_error: > eret > sb > > -.macro invalid_vector label, target = hyp_panic > +.macro invalid_vector label, target = __guest_exit_panic > .align 2 > SYM_CODE_START(\label) > b \target > @@ -186,10 +186,9 @@ check_preamble_length 661b, 662b > .macro invalid_vect target > .align 7 > 661: > - b \target > nop > + stp x0, x1, [sp, #-16]! > 662: > - ldp x0, x1, [sp], #16 > b \target > > check_preamble_length 661b, 662b > diff --git a/arch/arm64/kvm/hyp/include/hyp/switch.h b/arch/arm64/kvm/hyp/include/hyp/switch.h > index afe714056b97..821721b78ad9 100644 > --- a/arch/arm64/kvm/hyp/include/hyp/switch.h > +++ b/arch/arm64/kvm/hyp/include/hyp/switch.h > @@ -509,6 +509,7 @@ static inline void __set_host_arch_workaround_state(struct kvm_vcpu *vcpu) > > static inline void __kvm_unexpected_el2_exception(void) > { > + extern char __guest_exit_panic[]; > unsigned long addr, fixup; > struct exception_table_entry *entry, *end; > unsigned long elr_el2 = read_sysreg(elr_el2); > @@ -529,7 +530,8 @@ static inline void __kvm_unexpected_el2_exception(void) > return; > } > > - hyp_panic(); > + /* Trigger a panic after restoring the hyp context. */ > + write_sysreg(__guest_exit_panic, elr_el2); > } > > #endif /* __ARM64_KVM_HYP_SWITCH_H__ */ > diff --git a/arch/arm64/kvm/hyp/nvhe/host.S b/arch/arm64/kvm/hyp/nvhe/host.S > index da21fddcef75..9ab7814e6114 100644 > --- a/arch/arm64/kvm/hyp/nvhe/host.S > +++ b/arch/arm64/kvm/hyp/nvhe/host.S > @@ -75,6 +75,11 @@ SYM_FUNC_END(__hyp_do_panic) > > .macro invalid_host_vect > .align 7 > + /* If a guest is loaded, panic out of it. */ > + stp x0, x1, [sp, #-16]! > + get_loaded_vcpu x0, x1 > + cbnz x0, __guest_exit_panic > + add sp, sp, #16 > b hyp_panic > .endm Given that we have switched vectors when entering the guest, is this only to deal with the lack of an ISB when performing the VBAR_EL2 update? Thanks, M. > > -- > 2.28.0.618.gf4bc123cb7-goog > > -- Without deviation from the norm, progress is not possible. _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel