Received: by 2002:a17:90a:37e8:0:0:0:0 with SMTP id v95csp7141032pjb; Wed, 16 Oct 2019 00:43:56 -0700 (PDT) X-Google-Smtp-Source: APXvYqyZKex9Q7vanL5KIT9LuBKFq8DoVBf07ON3jOsjiDulf5B51uWDMHTQCf68Y5BIN6g6yWfa X-Received: by 2002:aa7:d905:: with SMTP id a5mr37611608edr.88.1571211835922; Wed, 16 Oct 2019 00:43:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1571211835; cv=none; d=google.com; s=arc-20160816; b=vyzFeom5O/G1srSQjWrGho2OGAiMxu/7mJxIOnLYdUpOQyKjhQWJH6q6W1g8xKDtbU rV+SDhV4JZ66XuTWBO7Usb/y2nIJRcYaMPNJF8jDJ6ejI/G12SmxxkA+KW80qsUlaoEZ QFC65GbWMEfyDOVnsF2b5SBn5GdN4iTEVdVrW0F6tUOZTG554dRWECSoJFYxw8pnI5t7 mv969kMXL21cBnoXV0OORYkL4a2FOQjlnKc3vuHfNsw7N/+Zo7xsU0cfr+nG47EXiuSn 1WmaYawHBlr+Id5I33HeKGUtQF9mBsHESQd+OOXXHqDtN1bIhXoMHaO7vnPYn+TGpFNx 37mQ== 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:from:references:to:subject:cc; bh=nXYAtMOwZm8zs8FOKft6AGGyywikQy7yej0B6PuFfW0=; b=vezGQhS2ReQkwl4F1MDvvmspulw6ku9YzKW9ngpp/3NzOKElN/2hYVjel88vQvgsD6 qSkwo51601SG9dij+2skDiTuaeFTzg5t52hmwtKJWWIozjJRoIU6wb5gUcINKWNTF5yu ZdvW9FdDsmwa2H+UYXofxufQSJQVYhezA9LIb6js7mU0aA9rNHoIYWMkV6gnuMTy5LFn 4gEbVW6McKLMpjSe51Bv8TqMTY6/Dktte95tPnyJOjbvSAffAYbAXzZlTBOvkhX2wmus ADwg4Iyzq2fVds1TANY64qemJDk5ep5G16mn2DkA9da8UXMAuZ/BRpbJBaQbH+qIZWeQ pNHg== 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=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a3si4402901ejs.2.2019.10.16.00.43.32; Wed, 16 Oct 2019 00:43:55 -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=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390140AbfJPA1m (ORCPT + 99 others); Tue, 15 Oct 2019 20:27:42 -0400 Received: from mga09.intel.com ([134.134.136.24]:10007 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728269AbfJPA1m (ORCPT ); Tue, 15 Oct 2019 20:27:42 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 15 Oct 2019 17:27:41 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.67,301,1566889200"; d="scan'208";a="194679814" Received: from allen-box.sh.intel.com (HELO [10.239.159.136]) ([10.239.159.136]) by fmsmga008.fm.intel.com with ESMTP; 15 Oct 2019 17:27:39 -0700 Cc: baolu.lu@linux.intel.com Subject: Re: [PATCH] iommu/vt-d: Check VT-d RMRR region in BIOS is reported as reserved To: Yian Chen , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, linux-ia64@vger.kernel.org, David Woodhouse , Joerg Roedel , Ashok Raj , Sohil Mehta , Tony Luck References: <20191015164932.18185-1-yian.chen@intel.com> From: Lu Baolu Message-ID: Date: Wed, 16 Oct 2019 08:25:17 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.9.0 MIME-Version: 1.0 In-Reply-To: <20191015164932.18185-1-yian.chen@intel.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, On 10/16/19 12:49 AM, Yian Chen wrote: > VT-d RMRR (Reserved Memory Region Reporting) regions are reserved > for device use only and should not be part of allocable memory pool of OS. > > BIOS e820_table reports complete memory map to OS, including OS usable > memory ranges and BIOS reserved memory ranges etc. > > x86 BIOS may not be trusted to include RMRR regions as reserved type > of memory in its e820 memory map, hence validate every RMRR entry > with the e820 memory map to make sure the RMRR regions will not be > used by OS for any other purposes. > > ia64 EFI is working fine so implement RMRR validation as a dummy function > > Reviewed-by: Sohil Mehta > Signed-off-by: Yian Chen This patch looks good to me. Reviewed-by: Lu Baolu > --- > arch/ia64/include/asm/iommu.h | 5 +++++ > arch/x86/include/asm/iommu.h | 18 ++++++++++++++++++ > drivers/iommu/intel-iommu.c | 8 +++++++- > 3 files changed, 30 insertions(+), 1 deletion(-) > > diff --git a/arch/ia64/include/asm/iommu.h b/arch/ia64/include/asm/iommu.h > index 7904f591a79b..eb0db20c9d4c 100644 > --- a/arch/ia64/include/asm/iommu.h > +++ b/arch/ia64/include/asm/iommu.h > @@ -2,6 +2,8 @@ > #ifndef _ASM_IA64_IOMMU_H > #define _ASM_IA64_IOMMU_H 1 > > +#include > + > /* 10 seconds */ > #define DMAR_OPERATION_TIMEOUT (((cycles_t) local_cpu_data->itc_freq)*10) > > @@ -9,6 +11,9 @@ extern void no_iommu_init(void); > #ifdef CONFIG_INTEL_IOMMU > extern int force_iommu, no_iommu; > extern int iommu_detected; > + > +static inline int __init > +arch_rmrr_sanity_check(struct acpi_dmar_reserved_memory *rmrr) { return 0; } > #else > #define no_iommu (1) > #define iommu_detected (0) > diff --git a/arch/x86/include/asm/iommu.h b/arch/x86/include/asm/iommu.h > index b91623d521d9..95fa65a5f0dc 100644 > --- a/arch/x86/include/asm/iommu.h > +++ b/arch/x86/include/asm/iommu.h > @@ -2,10 +2,28 @@ > #ifndef _ASM_X86_IOMMU_H > #define _ASM_X86_IOMMU_H > > +#include > + > +#include > + > extern int force_iommu, no_iommu; > extern int iommu_detected; > > /* 10 seconds */ > #define DMAR_OPERATION_TIMEOUT ((cycles_t) tsc_khz*10*1000) > > +static inline int __init > +arch_rmrr_sanity_check(struct acpi_dmar_reserved_memory *rmrr) > +{ > + u64 start = rmrr->base_address; > + u64 end = rmrr->end_address + 1; > + > + if (e820__mapped_all(start, end, E820_TYPE_RESERVED)) > + return 0; > + > + pr_err(FW_BUG "No firmware reserved region can cover this RMRR [%#018Lx-%#018Lx], contact BIOS vendor for fixes\n", > + start, end - 1); > + return -EFAULT; > +} > + > #endif /* _ASM_X86_IOMMU_H */ > diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c > index 3f974919d3bd..722290014143 100644 > --- a/drivers/iommu/intel-iommu.c > +++ b/drivers/iommu/intel-iommu.c > @@ -4306,13 +4306,19 @@ int __init dmar_parse_one_rmrr(struct acpi_dmar_header *header, void *arg) > { > struct acpi_dmar_reserved_memory *rmrr; > struct dmar_rmrr_unit *rmrru; > + int ret; > + > + rmrr = (struct acpi_dmar_reserved_memory *)header; > + ret = arch_rmrr_sanity_check(rmrr); > + if (ret) > + return ret; > > rmrru = kzalloc(sizeof(*rmrru), GFP_KERNEL); > if (!rmrru) > goto out; > > rmrru->hdr = header; > - rmrr = (struct acpi_dmar_reserved_memory *)header; > + > rmrru->base_address = rmrr->base_address; > rmrru->end_address = rmrr->end_address; > >