From patchwork Thu May 17 17:49:43 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 915639 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=kvm-ppc-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="sCJa0+BR"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40mzNc1Nphz9s4n for ; Fri, 18 May 2018 03:50:24 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751293AbeEQRuX (ORCPT ); Thu, 17 May 2018 13:50:23 -0400 Received: from mail-pg0-f65.google.com ([74.125.83.65]:45688 "EHLO mail-pg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750924AbeEQRuW (ORCPT ); Thu, 17 May 2018 13:50:22 -0400 Received: by mail-pg0-f65.google.com with SMTP id w3-v6so2129433pgv.12 for ; Thu, 17 May 2018 10:50:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=xanoKYtXaukMdrXtGZ+ty2+XLna8BZ7SeK8MapZ3WQw=; b=sCJa0+BRaZW/YFW+3M9GWJAR9s4e7Y2GN0CwpuME3f5/aqE5OEYNLY7qBZr1QVaAFA /2T9kSVgN3xG0XZiXXQVhaNdW+LE9UFog3TV7mOyufN/aWOExKfcXMibO0cR0fXjCwpf nnP+vZ6UWH79pnbSmKPg/cxsSJrvqp2yLR08o4EVuOMtCnk+y4qUrFqwVa38qYHfWGK1 K6Gm8gHe7DO5bi/3Rgfflw80NEWjwSAv/HgVjToamhZScbOtJQXgFlt+9xB0iRI8vP/u QDqu3bPNwtPm2PF6lebJIOnOykInlhzylfGx638dRxTr2qL6u54SwBzorTqOa+EDhsYd OV8Q== 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=xanoKYtXaukMdrXtGZ+ty2+XLna8BZ7SeK8MapZ3WQw=; b=KEVi0K/tcL+qkkBwDjHolj0uR4FGWI84b7sAW/2+YL5ovDwQy11PITp+VnrQX1lNIR QHUWga/GNEFdMXyHqZIuUHY6SZTeyIogZQSX64IM8/EF/TDSSadKc8KtU2ZaGDr4m5Ic 0+Yh57ICdPrOkEwFd2NsfHpY7MmLxt8NGd3XuSAWQ236hVyVRANvmRHJUT0pSiXDX+bu YsKS2E0w4l1ODgiEumiQ9ZZGgUbpIhhCX9H/uX1pSa8SyylR92XHobfnnvmwdGQ/T7qF HJUSjDK4agezem+nbI/QsEnX+0yGbUFuA/g5tWgedf/It8k6YdyWgef3DoUyyKIgdg9h GoWw== X-Gm-Message-State: ALKqPwe8/PD+hSiIqJpGbhxAfpxEpc/8Sl3Yt6fK9pNKDEprAV2o04VH /rpqFxLfpalfNaAY348udFCiEQ== X-Google-Smtp-Source: AB8JxZrrRWilSUiuMVSzszP7wj6iR1dEB54kzbdS2tTTQXCGTDjvu6w25sdb/E/PGP5rgKbOeLRHiw== X-Received: by 2002:a63:3c44:: with SMTP id i4-v6mr2803470pgn.309.1526579421591; Thu, 17 May 2018 10:50:21 -0700 (PDT) Received: from roar.au.ibm.com (59-102-70-78.tpgi.com.au. [59.102.70.78]) by smtp.gmail.com with ESMTPSA id v15-v6sm10853967pfa.107.2018.05.17.10.50.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 17 May 2018 10:50:20 -0700 (PDT) From: Nicholas Piggin To: kvm-ppc@vger.kernel.org Cc: Nicholas Piggin Subject: [PATCH 1/2] KVM: PPC: Book3S: HV: Fix kvmppc_bad_host_intr for real mode interrupts Date: Fri, 18 May 2018 03:49:43 +1000 Message-Id: <20180517174944.6005-2-npiggin@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180517174944.6005-1-npiggin@gmail.com> References: <20180517174944.6005-1-npiggin@gmail.com> Sender: kvm-ppc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm-ppc@vger.kernel.org When CONFIG_RELOCATABLE=n, the Linux real mode interrupt handlers call into KVM using real address. This needs to be translated to the kernel linear effective address before the MMU is switched on. kvmppc_bad_host_intr misses adding these bits, so when it is used to handle a system reset interrupt (that always gets delivered in real mode), it results in an instruction access fault immediately after the MMU is turned on. Fix this by ensuring the stop 2 address bits are set when the MMU is turned on. Signed-off-by: Nicholas Piggin --- arch/powerpc/kvm/book3s_hv_rmhandlers.S | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index d4c7bb3e777e..3b56fe1fc1b2 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S @@ -3555,6 +3555,8 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_TYPE_RADIX) bcl 20, 31, .+4 5: mflr r3 addi r3, r3, 9f - 5b + li r4,-1 + rldimi r3,r4,62,0 /* ensure 0xc000000000000000 bits are set */ ld r4, PACAKMSR(r13) mtspr SPRN_SRR0, r3 mtspr SPRN_SRR1, r4 From patchwork Thu May 17 17:49:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 915640 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=kvm-ppc-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="T/k6oMoa"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40mzNf3H9vz9s52 for ; Fri, 18 May 2018 03:50:26 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751396AbeEQRu0 (ORCPT ); Thu, 17 May 2018 13:50:26 -0400 Received: from mail-pg0-f66.google.com ([74.125.83.66]:39723 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750924AbeEQRuZ (ORCPT ); Thu, 17 May 2018 13:50:25 -0400 Received: by mail-pg0-f66.google.com with SMTP id e1-v6so2141116pga.6 for ; Thu, 17 May 2018 10:50:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=iobKV/thoocfMNhXbthqqa8/BWo9KpX277tLs0hPCUM=; b=T/k6oMoaxc2y/OA9Fk5vd/iomzUVtnFn8zBxZ9bqwFL3Ab1tPDb9F21XwVpkh4S5Ad ST4OujWxK8AIfR9R80mxDRqszOooJwoic0A84IAw1ngxICyC+atY0py0QPRYeRt5KLWJ K4vRp8VdClPODg4bDMWq0Ee1iAR7WuFUXyFYR31BIAn7MubV96aSEZ4siECBI9ksyJlD d1BS64iMsQsPm8LOaDuX/VA7khekfssgnVddPwFdI4QJiZv7wRgl5PA7TgsPsxVMdOAp nZAhOcg6+oPA3zGG7z2ovLM0NIoUzBevLGfcJfoYUTtzmrOyOSFyhR+LnRwrADbBiXkm siIg== 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=iobKV/thoocfMNhXbthqqa8/BWo9KpX277tLs0hPCUM=; b=ap7LaVEKFCHH07M69ILMZB8vBUpuqrSEJhCWnnJDmdo2pbVuEJYCOhpdXClg3xNJBA OmIGrH4JMSbcTJEYuPUriq7iyusVR9XNtx384yzzemBtYhDdVvQg22905a6II6SUjabo 1ETET1TlEwBMTWySrdLM3vRlXp2ZlJKZ2WOZ0LhZL3W4yr1ei6miAzx04NMjzqAS4ZBx oKq16UkPENALcecpiXwJTG67qtUNXrc62kgz/9FGEjYLTs760oy4EbUfJRlxgO6lIliO 5SpXcU8ka1KOP0N2BtjgjLJE6NP3eAQeqQ8FGTMBw4O/GCEt27pzI0t2ScQZhqfa97K9 CUlA== X-Gm-Message-State: ALKqPwchatqI58MbMlAJOQx9sP8rbwuiO2DyOUTJ6VV4Osm0gaHFvPY8 ZsIlDS5b/dzoK8ZbPnLSM0Tq4A== X-Google-Smtp-Source: AB8JxZrLvuGdRmfY1W1ZAgqB63YZgAhtpGBx60I58pU2WV2W8K2wv6kvlB+5WGUYVGuYl1rjPppmvQ== X-Received: by 2002:a62:f713:: with SMTP id h19-v6mr5933467pfi.165.1526579424645; Thu, 17 May 2018 10:50:24 -0700 (PDT) Received: from roar.au.ibm.com (59-102-70-78.tpgi.com.au. [59.102.70.78]) by smtp.gmail.com with ESMTPSA id v15-v6sm10853967pfa.107.2018.05.17.10.50.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 17 May 2018 10:50:23 -0700 (PDT) From: Nicholas Piggin To: kvm-ppc@vger.kernel.org Cc: Nicholas Piggin Subject: [PATCH 2/2] KVM: PPC: Book3S HV: send kvmppc_bad_interrupt NMIs to Linux handlers Date: Fri, 18 May 2018 03:49:44 +1000 Message-Id: <20180517174944.6005-3-npiggin@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180517174944.6005-1-npiggin@gmail.com> References: <20180517174944.6005-1-npiggin@gmail.com> Sender: kvm-ppc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm-ppc@vger.kernel.org It's possible to take a SRESET or MCE in these paths due to a bug in the host code or a NMI IPI, etc. A recent bug attempting to load a virtual address from real mode gave th complete but cryptic error, abridged: Oops: Bad interrupt in KVM entry/exit code, sig: 6 [#1] LE SMP NR_CPUS=2048 NUMA PowerNV CPU: 53 PID: 6582 Comm: qemu-system-ppc Not tainted NIP: c0000000000155ac LR: c0000000000c2430 CTR: c000000000015580 REGS: c000000fff76dd80 TRAP: 0200 Not tainted MSR: 9000000000201003 CR: 48082222 XER: 00000000 CFAR: 0000000102900ef0 DAR: d00017fffd941a28 DSISR: 00000040 SOFTE: 3 NIP [c0000000000155ac] perf_trace_tlbie+0x2c/0x1a0 LR [c0000000000c2430] do_tlbies+0x230/0x2f0 Sending the NMIs through the Linux handlers gives a nicer output: Severe Machine check interrupt [Not recovered] NIP [c0000000000155ac]: perf_trace_tlbie+0x2c/0x1a0 Initiator: CPU Error type: Real address [Load (bad)] Effective address: d00017fffcc01a28 opal: Machine check interrupt unrecoverable: MSR(RI=0) opal: Hardware platform error: Unrecoverable Machine Check exception CPU: 0 PID: 6700 Comm: qemu-system-ppc Tainted: G M NIP: c0000000000155ac LR: c0000000000c23c0 CTR: c000000000015580 REGS: c000000fff9e9d80 TRAP: 0200 Tainted: G M MSR: 9000000000201001 CR: 48082222 XER: 00000000 CFAR: 000000010cbc1a30 DAR: d00017fffcc01a28 DSISR: 00000040 SOFTE: 3 NIP [c0000000000155ac] perf_trace_tlbie+0x2c/0x1a0 LR [c0000000000c23c0] do_tlbies+0x1c0/0x280 Signed-off-by: Nicholas Piggin --- Since RFC: - Do not clear MSR_RI bit by hand to prevent the Linux exception handlers returning. Catch that with the panic instead (in the case of the MCE in the changelog, it has the SRR1[RI] bit clear anyway, so no change). arch/powerpc/kvm/book3s_hv_builtin.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/kvm/book3s_hv_builtin.c b/arch/powerpc/kvm/book3s_hv_builtin.c index de18299f92b7..3f3244d2b99e 100644 --- a/arch/powerpc/kvm/book3s_hv_builtin.c +++ b/arch/powerpc/kvm/book3s_hv_builtin.c @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -633,7 +634,19 @@ int kvmppc_rm_h_eoi(struct kvm_vcpu *vcpu, unsigned long xirr) void kvmppc_bad_interrupt(struct pt_regs *regs) { - die("Bad interrupt in KVM entry/exit code", regs, SIGABRT); + /* + * 100 could happen at any time, 200 can happen due to invalid real + * address access for example (or any time due to a hardware problem). + */ + if (TRAP(regs) == 0x100) { + get_paca()->in_nmi++; + system_reset_exception(regs); + get_paca()->in_nmi--; + } else if (TRAP(regs) == 0x200) { + machine_check_exception(regs); + } else { + die("Bad interrupt in KVM entry/exit code", regs, SIGABRT); + } panic("Bad KVM trap"); }