Received: by 2002:a05:6a10:6744:0:0:0:0 with SMTP id w4csp3661174pxu; Mon, 19 Oct 2020 18:53:32 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwmjJdwcUCyBSUMOv3v/WJGPEdT7ZitlKrJCQ0MlAavQsi3cey2Kba9XfNfgLEZakzRcbDp X-Received: by 2002:a17:906:cc83:: with SMTP id oq3mr783205ejb.71.1603158812525; Mon, 19 Oct 2020 18:53:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603158812; cv=none; d=google.com; s=arc-20160816; b=bcB2tVuqaDGLJm2ZatE8pvQ3ABArskekfZkjEmGw2rawz+kRGYS6MpjKyUATJ0O7ec Y2xfMjs874aRttqLyjz2qpBKXEFmX9c6BivHdNKgvOCEmftST74xtEZj9wODsAN5tWyY HLlHD0MskfIjuQnv9UuCjHZbU4fJ79hv+8GIwYqUAE0Z+x6MPQHRxQbY2Oeflr7wvf0q zGhnoMSFmiMRz75swKmfhotlofhqdqiIrCCCR9VFt064jsxVIK6qPIq2KeufFnVKXAuX LWG2TUbipd8lZumygPk9H+wjh7I2tdqKD+jGmP6rPiIbnq0wjEfLFaRciKHhN+TsDv8c srRA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=MHhBXu1bmT8fVdKGzb6uBZz5FMVKs8IKduWdfBhnxJs=; b=wPq2cJsTaXl1W1WdKYb2BDuZgrQAfAr42fzAKckBApL48uU1FfGgrRxW/CBzZ4M4uH +Sa6AKen5ws/VVkdL8gV1cctOHchV7CIxWhlJ1hHFUwtONWrCqfL6Zg1B39qy28XPWfv lEXAc2A3t2MTLT6hoxj9OvqOF9J+Fe9xQPjAE6nA7uBowKDZEyVoAkaIePMVropIg7A/ WnxU/r3u5Jya2Ysr2IW5FWJl74aGM0P/frgy5n007h0EFELnYL93LR9WtiVrVCRyl2jF ZWLeFkdPoXYwVEv4V7OAcgpCkeZnoN6fHe8lZqCQE5Bc7wkwYbSDDkxX+3UBf/lu0gfu 7olQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=8bytes.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id l19si268974ejz.222.2020.10.19.18.53.09; Mon, 19 Oct 2020 18:53:32 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=8bytes.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729975AbgJSPLc (ORCPT + 99 others); Mon, 19 Oct 2020 11:11:32 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47930 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729941AbgJSPL2 (ORCPT ); Mon, 19 Oct 2020 11:11:28 -0400 Received: from theia.8bytes.org (8bytes.org [IPv6:2a01:238:4383:600:38bc:a715:4b6d:a889]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6E04EC0613D0 for ; Mon, 19 Oct 2020 08:11:28 -0700 (PDT) Received: from cap.home.8bytes.org (p549add56.dip0.t-ipconnect.de [84.154.221.86]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by theia.8bytes.org (Postfix) with ESMTPSA id 02745515; Mon, 19 Oct 2020 17:11:24 +0200 (CEST) From: Joerg Roedel To: x86@kernel.org Cc: Joerg Roedel , Joerg Roedel , Thomas Gleixner , Ingo Molnar , Borislav Petkov , "H. Peter Anvin" , Dave Hansen , Andy Lutomirski , Peter Zijlstra , Kees Cook , Arvind Sankar , Martin Radev , Tom Lendacky , linux-kernel@vger.kernel.org Subject: [PATCH 5/5] x86/sev-es: Do not support MMIO to/from encrypted memory Date: Mon, 19 Oct 2020 17:11:21 +0200 Message-Id: <20201019151121.826-6-joro@8bytes.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201019151121.826-1-joro@8bytes.org> References: <20201019151121.826-1-joro@8bytes.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Joerg Roedel MMIO memory is usually not mapped encrypted, so there is no reason to support emulated MMIO when it is mapped encrypted. This prevents a possible hypervisor attack where it maps a RAM page as an MMIO page in the nested page-table, so that any guest access to it will trigger a #VC exception and leak the data on that page to the hypervisor or allows the hypervisor to inject data into the guest. Signed-off-by: Joerg Roedel --- arch/x86/kernel/sev-es.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/arch/x86/kernel/sev-es.c b/arch/x86/kernel/sev-es.c index 4a96726fbaf8..421fe0203c68 100644 --- a/arch/x86/kernel/sev-es.c +++ b/arch/x86/kernel/sev-es.c @@ -374,8 +374,8 @@ static enum es_result vc_read_mem(struct es_em_ctxt *ctxt, return ES_EXCEPTION; } -static bool vc_slow_virt_to_phys(struct ghcb *ghcb, struct es_em_ctxt *ctxt, - unsigned long vaddr, phys_addr_t *paddr) +static enum es_result vc_slow_virt_to_phys(struct ghcb *ghcb, struct es_em_ctxt *ctxt, + unsigned long vaddr, phys_addr_t *paddr) { unsigned long va = (unsigned long)vaddr; unsigned int level; @@ -394,15 +394,19 @@ static bool vc_slow_virt_to_phys(struct ghcb *ghcb, struct es_em_ctxt *ctxt, if (user_mode(ctxt->regs)) ctxt->fi.error_code |= X86_PF_USER; - return false; + return ES_EXCEPTION; } + if (WARN_ON_ONCE(pte_val(*pte) & _PAGE_ENC)) + /* Emulated MMIO to/from encrypted memory not supported */ + return ES_UNSUPPORTED; + pa = (phys_addr_t)pte_pfn(*pte) << PAGE_SHIFT; pa |= va & ~page_level_mask(level); *paddr = pa; - return true; + return ES_OK; } /* Include code shared with pre-decompression boot stage */ @@ -731,6 +735,7 @@ static enum es_result vc_do_mmio(struct ghcb *ghcb, struct es_em_ctxt *ctxt, { u64 exit_code, exit_info_1, exit_info_2; unsigned long ghcb_pa = __pa(ghcb); + enum es_result res; phys_addr_t paddr; void __user *ref; @@ -740,11 +745,12 @@ static enum es_result vc_do_mmio(struct ghcb *ghcb, struct es_em_ctxt *ctxt, exit_code = read ? SVM_VMGEXIT_MMIO_READ : SVM_VMGEXIT_MMIO_WRITE; - if (!vc_slow_virt_to_phys(ghcb, ctxt, (unsigned long)ref, &paddr)) { - if (!read) + res = vc_slow_virt_to_phys(ghcb, ctxt, (unsigned long)ref, &paddr); + if (res != ES_OK) { + if (res == ES_EXCEPTION && !read) ctxt->fi.error_code |= X86_PF_WRITE; - return ES_EXCEPTION; + return res; } exit_info_1 = paddr; -- 2.28.0