From patchwork Thu Dec 7 17:05:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoffer Dall X-Patchwork-Id: 10100363 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 918636056F for ; Thu, 7 Dec 2017 17:20:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7745528502 for ; Thu, 7 Dec 2017 17:20:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6A7222851B; Thu, 7 Dec 2017 17:20:06 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_MED autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 5B21428502 for ; Thu, 7 Dec 2017 17:20:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=1CLedyZ0vfUtlXxUjItEoQjhML4rfYlegDkVLlUpLcM=; b=U7tw/iymdvQYP9sg7VuCYMGKjz vzrWnUI64zouEcNDyQgCkiTQtyazTiOP4OEjd3HhJ2E90jnmyx18BkC+1eLK1riusz9Wb9Kpsq+iw yS7on8MH8FooJkIIyNpadWj6CEG0sTlfP9V7q6JeIpuiiUzrtN6JpO1JomNSvhdulGA/ET6e8T9ma HTrq85iRD9fgliBlUaTuwDpDLC83X+uoFXtEHIeOzyb6K1yxJ98y4IQMKHzwQW+f4yqX74fO7tos4 1lx6YkvSWMe22v1GnFgmNY25XSljmkBoOXGJ9KUqmldb1JQxWwPrT3oKlvX/UZbT9ozG4duXJQtfz aTjCCweg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1eMzq8-0008SG-9B; Thu, 07 Dec 2017 17:20:04 +0000 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1eMzdS-0002ev-HN for linux-arm-kernel@lists.infradead.org; Thu, 07 Dec 2017 17:07:00 +0000 Received: by mail-wm0-x242.google.com with SMTP id b76so14239527wmg.1 for ; Thu, 07 Dec 2017 09:06:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=+QvJ2fWrJYm/QoI5S5EJv/2YKRZjidwCP4Tx2ZTBHg4=; b=IIH63EKeOu5rQ5FVy3tug6DFc5rsqnu7aTzWOq7SgHXnhfmwpUTVKdlbbI7JJyJFKO XUr7AuXbtJOG5cCzZU0SP+uRznwEr8pIA+K/fUBO6nd1MVN6/Kb76A5OcFO7yFqm6/80 7tWIeb4P4sYeHI467kq4twOwickD0PRK8Fmz0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=+QvJ2fWrJYm/QoI5S5EJv/2YKRZjidwCP4Tx2ZTBHg4=; b=JJzDrEEbnMKmPIVL4R1iDebZXvnIekodNEF88mbVKHjgGTDzIEjNa21kdNu+1AD3ia Y2XXRlTFX9vXtXd5/NCH9R+VorIxVZx5kuH4F/3VoucmfXkwZXHzLojYqhFkwevOSmSh w4i31MctYDIE7CyPkyUNndghpz/4iHSHKh7x8S/+NIS8WUHMzney2YbrMwTP5SCgcUo+ BxUjk4qxToedm1upFlb6tnGez3i83anBayY5kUlJMBmp0xVhSxp/2cMIbyy+cQn4EtAv UbcwU0rLJ9z/ZJ+eI814RcbkA76ajAkjfzbe2LHWGPtH9NlqCt8J7yMpueK/Mad/8tlY nwDw== X-Gm-Message-State: AJaThX5z010fFaYjPu3aiCJ0B52cVA4tYRCdmxMcuHks3yk2ZbzMY09R bjiC8RfnbYoxWhTVPHdk6MXziA== X-Google-Smtp-Source: AGs4zMZGUb28yaghFTETRDaelR0amz6ALNIgpCCjh9DvFDA5xgAw3C407S/ZK5N45khsaOu3t9I20g== X-Received: by 10.80.186.111 with SMTP id 44mr37140502eds.261.1512666401247; Thu, 07 Dec 2017 09:06:41 -0800 (PST) Received: from localhost.localdomain (x50d2404e.cust.hiper.dk. [80.210.64.78]) by smtp.gmail.com with ESMTPSA id a16sm2868270edd.19.2017.12.07.09.06.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 07 Dec 2017 09:06:39 -0800 (PST) From: Christoffer Dall To: kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org Subject: [PATCH v2 02/36] KVM: arm64: Rework hyp_panic for VHE and non-VHE Date: Thu, 7 Dec 2017 18:05:56 +0100 Message-Id: <20171207170630.592-3-christoffer.dall@linaro.org> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20171207170630.592-1-christoffer.dall@linaro.org> References: <20171207170630.592-1-christoffer.dall@linaro.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20171207_090658_871388_6E24EEB5 X-CRM114-Status: GOOD ( 18.32 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marc Zyngier , Andrew Jones , Christoffer Dall , Shih-Wei Li , kvm@vger.kernel.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP VHE actually doesn't rely on clearing the VTTBR when returning to the host kernel, and that is the current key mechanism of hyp_panic to figure out how to attempt to return to a state good enough to print a panic statement. Therefore, we split the hyp_panic function into two functions, a VHE and a non-VHE, keeping the non-VHE version intact, but changing the VHE behavior. The vttbr_el2 check on VHE doesn't really make that much sense, because the only situation where we can get here on VHE is when the hypervisor assembly code actually called into hyp_panic, which only happens when VBAR_EL2 has been set to the KVM exception vectors. On VHE, we can always safely disable the traps and restore the host registers at this point, so we simply do that unconditionally and call into the panic function directly. Signed-off-by: Christoffer Dall Acked-by: Marc Zyngier --- Notes: Changes since v1: - Fixed typos in the commit message - Still use the generic __deactivte_traps() function in the hyp panic code until we rework that logic later. arch/arm64/kvm/hyp/switch.c | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/arch/arm64/kvm/hyp/switch.c b/arch/arm64/kvm/hyp/switch.c index 6fcb37e220b5..71700ecee308 100644 --- a/arch/arm64/kvm/hyp/switch.c +++ b/arch/arm64/kvm/hyp/switch.c @@ -419,10 +419,20 @@ int __hyp_text __kvm_vcpu_run(struct kvm_vcpu *vcpu) static const char __hyp_panic_string[] = "HYP panic:\nPS:%08llx PC:%016llx ESR:%08llx\nFAR:%016llx HPFAR:%016llx PAR:%016llx\nVCPU:%p\n"; static void __hyp_text __hyp_call_panic_nvhe(u64 spsr, u64 elr, u64 par, - struct kvm_vcpu *vcpu) + struct kvm_cpu_context *__host_ctxt) { + struct kvm_vcpu *vcpu; unsigned long str_va; + vcpu = __host_ctxt->__hyp_running_vcpu; + + if (read_sysreg(vttbr_el2)) { + __timer_disable_traps(vcpu); + __deactivate_traps(vcpu); + __deactivate_vm(vcpu); + __sysreg_restore_host_state(__host_ctxt); + } + /* * Force the panic string to be loaded from the literal pool, * making sure it is a kernel address and not a PC-relative @@ -436,37 +446,31 @@ static void __hyp_text __hyp_call_panic_nvhe(u64 spsr, u64 elr, u64 par, read_sysreg(hpfar_el2), par, vcpu); } -static void __hyp_text __hyp_call_panic_vhe(u64 spsr, u64 elr, u64 par, - struct kvm_vcpu *vcpu) +static void __hyp_call_panic_vhe(u64 spsr, u64 elr, u64 par, + struct kvm_cpu_context *host_ctxt) { + struct kvm_vcpu *vcpu; + vcpu = host_ctxt->__hyp_running_vcpu; + + __deactivate_traps(vcpu); + __sysreg_restore_host_state(host_ctxt); + panic(__hyp_panic_string, spsr, elr, read_sysreg_el2(esr), read_sysreg_el2(far), read_sysreg(hpfar_el2), par, vcpu); } -static hyp_alternate_select(__hyp_call_panic, - __hyp_call_panic_nvhe, __hyp_call_panic_vhe, - ARM64_HAS_VIRT_HOST_EXTN); - void __hyp_text __noreturn hyp_panic(struct kvm_cpu_context *host_ctxt) { - struct kvm_vcpu *vcpu = NULL; - u64 spsr = read_sysreg_el2(spsr); u64 elr = read_sysreg_el2(elr); u64 par = read_sysreg(par_el1); - if (read_sysreg(vttbr_el2)) { - vcpu = host_ctxt->__hyp_running_vcpu; - __timer_disable_traps(vcpu); - __deactivate_traps(vcpu); - __deactivate_vm(vcpu); - __sysreg_restore_host_state(host_ctxt); - } - - /* Call panic for real */ - __hyp_call_panic()(spsr, elr, par, vcpu); + if (!has_vhe()) + __hyp_call_panic_nvhe(spsr, elr, par, host_ctxt); + else + __hyp_call_panic_vhe(spsr, elr, par, host_ctxt); unreachable(); }