Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp520164imm; Wed, 26 Sep 2018 02:36:08 -0700 (PDT) X-Google-Smtp-Source: ACcGV60x6ssdOm7n8HNgyJTAduCjNCsTHzWfC3eQeDhTf8wOA1TkJfQzKEMY/qDtCpuRu5OHjEOh X-Received: by 2002:a65:6654:: with SMTP id z20-v6mr4943780pgv.186.1537954568924; Wed, 26 Sep 2018 02:36:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537954568; cv=none; d=google.com; s=arc-20160816; b=pJHaqCR6o2ylxLowmpl1O+DfUmFsQ/oDWXoYNEN/a3ZsLSFkAk8iEFiQtn9YApgk3E wD4duAGFmVyDSliZQM7OJ6ZE384bBA3WZHapeY7oC/9yPsRviymsomNVCrwjD3rCzxmN VMQixKMleOpnBzWiCELGP0ziu8G5ye2c1PLKM54wfVg+RvSn/NIs0OFGSyiip6PNiMTm 41OEOA+uI7R71LQvr8vqmB50HW0VNDfFpleS7Yzz4cVSEbFW23sq15ZrFRJNdr9Kgmrf B5y2WfvM0iPLPmRYYJ60TuNPO2MG1RccfwE6i2qxDJ9012LqCYYuTP84zbtZBV0GuApL Ha6g== 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 :content-language:in-reply-to:mime-version:user-agent:date :message-id:references:cc:to:from:subject; bh=hrfGlg3l7oGRG2jF+vTv7zdP9yBvjYeaJcSrqpoN6+U=; b=R58Si7j3FSzFvwIBI1w9NycTvQ1BLxTzIZE+RDh6TSiFvNTvsvQvLMqs+e85VQpVo9 2Ag7I5+AMiCpsTrWuLlfw5BJvzODpHE3H8EA47yw5BYZckLYqkAydGnwhwQLyqAeYYHc 1ZvXdu5EixbcSNsZ2Ubyj9BeMGPladpPMSbYbegYMg7I8j8EH7Ozb0D//la/YjFVtVCF gl9gKYJLUagBI1zD4O7yeLCxUEk+DzU1Sak4qQbkndJ3BO48zSpAAyrAxb8/5ZAhpehl DblnTdMnp+8kvqrQrt8pIGcU0mTxo3NXroWlXHvDMoulHncedtYXz+nzYHgfg4ykTWt6 S09A== ARC-Authentication-Results: i=1; mx.google.com; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a8-v6si4810278pgh.396.2018.09.26.02.35.24; Wed, 26 Sep 2018 02:36:08 -0700 (PDT) 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; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727587AbeIZPqn (ORCPT + 99 others); Wed, 26 Sep 2018 11:46:43 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55414 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726401AbeIZPqm (ORCPT ); Wed, 26 Sep 2018 11:46:42 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0B77BC05D3F6; Wed, 26 Sep 2018 09:34:39 +0000 (UTC) Received: from localhost.localdomain (ovpn-12-101.pek2.redhat.com [10.72.12.101]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BFB245DD92; Wed, 26 Sep 2018 09:34:25 +0000 (UTC) Subject: Re: [PATCH 1/4 v8] x86/ioremap: add a function ioremap_encrypted() to remap kdump old memory From: lijiang To: Baoquan He Cc: linux-kernel@vger.kernel.org, joro@8bytes.org, mingo@redhat.com, ebiederm@xmission.com, hpa@zytor.com, tglx@linutronix.de, Dave Young , "Lendacky, Thomas" , kexec@lists.infradead.org References: <20180907081805.368-1-lijiang@redhat.com> <20180907081805.368-2-lijiang@redhat.com> <20180926022123.GA2555@MiWiFi-R3L-srv> Message-ID: Date: Wed, 26 Sep 2018 17:34:21 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Wed, 26 Sep 2018 09:34:39 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When SME is enabled on AMD machine, the memory is encrypted in the first kernel. In this case, SME also needs to be enabled in kdump kernel, and we have to remap the old memory with the memory encryption mask. Here we only talk about the case that SME is active in the first kernel, and only care it's active too in kdump kernel. there are four cases we need considered. a. dump vmcore It is encrypted in the first kernel, and needs be read out in kdump kernel. b. crash notes When dumping vmcore, the people usually need to read the useful information from notes, and the notes is also encrypted. c. iommu device table It is allocated by kernel, need fill its pointer into mmio of amd iommu. It's encrypted in the first kernel, need read the old content to analyze and get useful information. d. mmio of amd iommu Register reported by amd firmware, it's not RAM, we don't encrypt in both the first kernel and kdump kernel. To achieve the goal, the solution is: 1. add a new bool parameter "encrypted" to __ioremap_caller() It is a low level function, and check the newly added parameter, if it's true and in kdump kernel, will remap the memory with sme mask. 2. add a new function ioremap_encrypted() to explicitly passed in a "true" value for "encrypted". For above a, b, c, we will call ioremap_encrypted(); 3. adjust all existed ioremap wrapper functions, passed in "false" for encrypted to make them an before. ioremap_encrypted()\ ioremap_cache() | ioremap_prot() | ioremap_wt() |->__ioremap_caller() ioremap_wc() | ioremap_uc() | ioremap_nocache() / Signed-off-by: Lianbo Jiang --- Changes since v7: 1. Only modify patch log(suggested by Baoquan He) arch/x86/include/asm/io.h | 3 +++ arch/x86/mm/ioremap.c | 25 +++++++++++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h index 6de64840dd22..f8795f9581c7 100644 --- a/arch/x86/include/asm/io.h +++ b/arch/x86/include/asm/io.h @@ -192,6 +192,9 @@ extern void __iomem *ioremap_cache(resource_size_t offset, unsigned long size); #define ioremap_cache ioremap_cache extern void __iomem *ioremap_prot(resource_size_t offset, unsigned long size, unsigned long prot_val); #define ioremap_prot ioremap_prot +extern void __iomem *ioremap_encrypted(resource_size_t phys_addr, + unsigned long size); +#define ioremap_encrypted ioremap_encrypted /** * ioremap - map bus memory into CPU space diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index c63a545ec199..e01e6c695add 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "physaddr.h" @@ -131,7 +132,8 @@ static void __ioremap_check_mem(resource_size_t addr, unsigned long size, * caller shouldn't need to know that small detail. */ static void __iomem *__ioremap_caller(resource_size_t phys_addr, - unsigned long size, enum page_cache_mode pcm, void *caller) + unsigned long size, enum page_cache_mode pcm, + void *caller, bool encrypted) { unsigned long offset, vaddr; resource_size_t last_addr; @@ -199,7 +201,7 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr, * resulting mapping. */ prot = PAGE_KERNEL_IO; - if (sev_active() && mem_flags.desc_other) + if ((sev_active() && mem_flags.desc_other) || encrypted) prot = pgprot_encrypted(prot); switch (pcm) { @@ -291,7 +293,7 @@ void __iomem *ioremap_nocache(resource_size_t phys_addr, unsigned long size) enum page_cache_mode pcm = _PAGE_CACHE_MODE_UC_MINUS; return __ioremap_caller(phys_addr, size, pcm, - __builtin_return_address(0)); + __builtin_return_address(0), false); } EXPORT_SYMBOL(ioremap_nocache); @@ -324,7 +326,7 @@ void __iomem *ioremap_uc(resource_size_t phys_addr, unsigned long size) enum page_cache_mode pcm = _PAGE_CACHE_MODE_UC; return __ioremap_caller(phys_addr, size, pcm, - __builtin_return_address(0)); + __builtin_return_address(0), false); } EXPORT_SYMBOL_GPL(ioremap_uc); @@ -341,7 +343,7 @@ EXPORT_SYMBOL_GPL(ioremap_uc); void __iomem *ioremap_wc(resource_size_t phys_addr, unsigned long size) { return __ioremap_caller(phys_addr, size, _PAGE_CACHE_MODE_WC, - __builtin_return_address(0)); + __builtin_return_address(0), false); } EXPORT_SYMBOL(ioremap_wc); @@ -358,14 +360,21 @@ EXPORT_SYMBOL(ioremap_wc); void __iomem *ioremap_wt(resource_size_t phys_addr, unsigned long size) { return __ioremap_caller(phys_addr, size, _PAGE_CACHE_MODE_WT, - __builtin_return_address(0)); + __builtin_return_address(0), false); } EXPORT_SYMBOL(ioremap_wt); +void __iomem *ioremap_encrypted(resource_size_t phys_addr, unsigned long size) +{ + return __ioremap_caller(phys_addr, size, _PAGE_CACHE_MODE_WB, + __builtin_return_address(0), true); +} +EXPORT_SYMBOL(ioremap_encrypted); + void __iomem *ioremap_cache(resource_size_t phys_addr, unsigned long size) { return __ioremap_caller(phys_addr, size, _PAGE_CACHE_MODE_WB, - __builtin_return_address(0)); + __builtin_return_address(0), false); } EXPORT_SYMBOL(ioremap_cache); @@ -374,7 +383,7 @@ void __iomem *ioremap_prot(resource_size_t phys_addr, unsigned long size, { return __ioremap_caller(phys_addr, size, pgprot2cachemode(__pgprot(prot_val)), - __builtin_return_address(0)); + __builtin_return_address(0), false); } EXPORT_SYMBOL(ioremap_prot); -- 2.17.1