Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp6012272ybc; Wed, 27 Nov 2019 13:22:27 -0800 (PST) X-Google-Smtp-Source: APXvYqzG9cXHY2fH/cFGQRm1xXFRnYKh6rmOq4QJKbzArs8SmSlMUAlGB31o6FjRf+ixdqlibWzp X-Received: by 2002:a17:906:b797:: with SMTP id dt23mr25519510ejb.241.1574889747761; Wed, 27 Nov 2019 13:22:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574889747; cv=none; d=google.com; s=arc-20160816; b=kRP8Aq8s0TbqtPRk3rYbjP86oU8kLjeKzyMXYCSZbEhRI4K0axo2+oTkyBI7AnhXof 8cQDnsv3nzLUVd9XUrWmixqKVbrDGoThghIIdND/N1egOoDcua50CIe/WEnObQPrbgBw 3IXVGDyE+hanyvJUHpQZEq5xr14kvOol1HCNM4C8iWpquLf7s4HVVMBfyclhlaXcjW2y D9w2asRmlKzQpkjNga5B4ynbxBNba6iDx8C8VmZQA6dgQafXtv5Tz/x0zTZiGgd0x2pt mMKjD1pWePYkyqXMjB+vVbX7TTKkSc/nGqkNr8qPX9jTALkfvJYrNQIud+8MwA4GoZQ5 RQBQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=ZIpTc4Iok4327eRggen9MXYRSNLx5zXhufHUvYolmZU=; b=N3oFWFXNc8gNUrmXdAoxM+UFljDFfEKJi5aFBt83Z/rNcHIJrVJC7R7Puibk0Jn6GS 1fZRY+cVLHfk8Eo7mqTDyyRhshB6tCxejUqwGR9rnWa8zMhvrAIQhTk5YnHkPkQkb2W/ EN+0gLVSvk/LtrG6vLjGAfBAb0sanYXnqrDxwYYZ/ou7jJVoKRCZKO+FQsOR5HFS4JWG OVQINaN+9ftSKYZ7Plao5xGFXkxzYOTaX8y1irK2Yv3OolWl60kCYISl31G+yc2z1NZi l5uFjUhWWa9O51UCNG6877T1taavH0IuZrFOqNUhiW59ac+dV+mTsRmufH30fj5vJgEy OlaQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=IS0yCXEa; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j23si10765046eja.393.2019.11.27.13.22.04; Wed, 27 Nov 2019 13:22:27 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=IS0yCXEa; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728506AbfK0VRi (ORCPT + 99 others); Wed, 27 Nov 2019 16:17:38 -0500 Received: from mail.kernel.org ([198.145.29.99]:43200 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733284AbfK0VM2 (ORCPT ); Wed, 27 Nov 2019 16:12:28 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (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 CFDD5215E5; Wed, 27 Nov 2019 21:12:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1574889148; bh=ezbFv245e3UXk+bOz7/RRYSyfswY6TcgjUeambJ20VA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IS0yCXEayJS/FuS2Ly/YHyj+EK5wWsIGdhy46u4RcXClC1cKkfywBLODY2IMO1JAd 8oTOgfuGZU/OGxaic0UlSP8hKHWJPKw2qUNrV2E0awIz0NwmeC6fMKna+k8XOxsZnu G8KN7GjaHFGWggq4oqm2aZbW5wtCB9BdpMD3NlcA= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Michael Ellerman Subject: [PATCH 5.3 95/95] KVM: PPC: Book3S HV: Flush link stack on guest exit to host kernel Date: Wed, 27 Nov 2019 21:32:52 +0100 Message-Id: <20191127203003.310860131@linuxfoundation.org> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191127202845.651587549@linuxfoundation.org> References: <20191127202845.651587549@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Michael Ellerman commit af2e8c68b9c5403f77096969c516f742f5bb29e0 upstream. On some systems that are vulnerable to Spectre v2, it is up to software to flush the link stack (return address stack), in order to protect against Spectre-RSB. When exiting from a guest we do some house keeping and then potentially exit to C code which is several stack frames deep in the host kernel. We will then execute a series of returns without preceeding calls, opening up the possiblity that the guest could have poisoned the link stack, and direct speculative execution of the host to a gadget of some sort. To prevent this we add a flush of the link stack on exit from a guest. Signed-off-by: Michael Ellerman Signed-off-by: Greg Kroah-Hartman --- arch/powerpc/include/asm/asm-prototypes.h | 2 ++ arch/powerpc/kernel/security.c | 9 +++++++++ arch/powerpc/kvm/book3s_hv_rmhandlers.S | 30 ++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) --- a/arch/powerpc/include/asm/asm-prototypes.h +++ b/arch/powerpc/include/asm/asm-prototypes.h @@ -141,9 +141,11 @@ void _kvmppc_save_tm_pr(struct kvm_vcpu extern s32 patch__call_flush_count_cache; extern s32 patch__flush_count_cache_return; extern s32 patch__flush_link_stack_return; +extern s32 patch__call_kvm_flush_link_stack; extern s32 patch__memset_nocache, patch__memcpy_nocache; extern long flush_count_cache; +extern long kvm_flush_link_stack; #ifdef CONFIG_PPC_TRANSACTIONAL_MEM void kvmppc_save_tm_hv(struct kvm_vcpu *vcpu, u64 msr, bool preserve_nv); --- a/arch/powerpc/kernel/security.c +++ b/arch/powerpc/kernel/security.c @@ -400,6 +400,9 @@ static void toggle_count_cache_flush(boo if (!enable) { patch_instruction_site(&patch__call_flush_count_cache, PPC_INST_NOP); +#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE + patch_instruction_site(&patch__call_kvm_flush_link_stack, PPC_INST_NOP); +#endif pr_info("link-stack-flush: software flush disabled.\n"); link_stack_flush_enabled = false; no_count_cache_flush(); @@ -410,6 +413,12 @@ static void toggle_count_cache_flush(boo patch_branch_site(&patch__call_flush_count_cache, (u64)&flush_count_cache, BRANCH_SET_LINK); +#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE + // This enables the branch from guest_exit_cont to kvm_flush_link_stack + patch_branch_site(&patch__call_kvm_flush_link_stack, + (u64)&kvm_flush_link_stack, BRANCH_SET_LINK); +#endif + pr_info("link-stack-flush: software flush enabled.\n"); link_stack_flush_enabled = true; --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S @@ -11,6 +11,7 @@ */ #include +#include #include #include #include @@ -1458,6 +1459,13 @@ guest_exit_cont: /* r9 = vcpu, r12 = tr 1: #endif /* CONFIG_KVM_XICS */ + /* + * Possibly flush the link stack here, before we do a blr in + * guest_exit_short_path. + */ +1: nop + patch_site 1b patch__call_kvm_flush_link_stack + /* If we came in through the P9 short path, go back out to C now */ lwz r0, STACK_SLOT_SHORT_PATH(r1) cmpwi r0, 0 @@ -1933,6 +1941,28 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) mtlr r0 blr +.balign 32 +.global kvm_flush_link_stack +kvm_flush_link_stack: + /* Save LR into r0 */ + mflr r0 + + /* Flush the link stack. On Power8 it's up to 32 entries in size. */ + .rept 32 + bl .+4 + .endr + + /* And on Power9 it's up to 64. */ +BEGIN_FTR_SECTION + .rept 32 + bl .+4 + .endr +END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) + + /* Restore LR */ + mtlr r0 + blr + kvmppc_guest_external: /* External interrupt, first check for host_ipi. If this is * set, we know the host wants us out so let's do it now