summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhichao Gao <zhichao.gao@intel.com>2019-05-09 11:11:55 +0800
committerLiming Gao <liming.gao@intel.com>2019-05-10 08:34:45 +0800
commit30a888b5a0a01eb9ce79b46af9937e997a30ae5c (patch)
tree5bab054ef0ab73c2f56767ddf3cab75a14a418f2
parent0a506fc7ab8b5df2944d2e4602a46fbef57edc82 (diff)
downloadedk2-30a888b5a0a01eb9ce79b46af9937e997a30ae5c.tar.gz
edk2-30a888b5a0a01eb9ce79b46af9937e997a30ae5c.tar.bz2
edk2-30a888b5a0a01eb9ce79b46af9937e997a30ae5c.zip
IntelSiliconPkg/IntelVTdDxe: Do global invalidation before boot
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1547 V2: Abandon V1. Do global invalidation of context-cache and IOTLB at ExitBootServices. V1: Only doing IOTLB invalidation would cause a BSOD 'DRIVER_VERIFIER_DMA_VIOLATION' while changing the second level page entry's attributes. So always do the global invalidation of context-cache and IOTLB. Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Chasel Chiu <chasel.chiu@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Rangasai V Chaganty <rangasai.v.chaganty@intel.com> Signed-off-by: Zhichao Gao <zhichao.gao@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com> Reviewed-by: Chasel Chiu <chasel.chiu@intel.com>
-rw-r--r--IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.c13
-rw-r--r--IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.h32
2 files changed, 43 insertions, 2 deletions
diff --git a/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.c b/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.c
index f221e45938..956ebb2d3d 100644
--- a/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.c
+++ b/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.c
@@ -1,6 +1,6 @@
/** @file
- Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -581,9 +581,20 @@ OnExitBootServices (
IN VOID *Context
)
{
+ UINTN VtdIndex;
+
DEBUG ((DEBUG_INFO, "Vtd OnExitBootServices\n"));
DumpVtdRegsAll ();
+ DEBUG ((DEBUG_INFO, "Invalidate all\n"));
+ for (VtdIndex = 0; VtdIndex < mVtdUnitNumber; VtdIndex++) {
+ FlushWriteBuffer (VtdIndex);
+
+ InvalidateContextCache (VtdIndex);
+
+ InvalidateIOTLB (VtdIndex);
+ }
+
if ((PcdGet8(PcdVTdPolicyPropertyMask) & BIT1) == 0) {
DisableDmar ();
DumpVtdRegsAll ();
diff --git a/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.h b/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.h
index 72426d23c3..a3331db8f7 100644
--- a/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.h
+++ b/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.h
@@ -1,6 +1,6 @@
/** @file
- Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -169,6 +169,36 @@ DisableDmar (
);
/**
+ Flush VTd engine write buffer.
+
+ @param[in] VtdIndex The index used to identify a VTd engine.
+**/
+VOID
+FlushWriteBuffer (
+ IN UINTN VtdIndex
+ );
+
+/**
+ Invalidate VTd context cache.
+
+ @param[in] VtdIndex The index used to identify a VTd engine.
+**/
+EFI_STATUS
+InvalidateContextCache (
+ IN UINTN VtdIndex
+ );
+
+/**
+ Invalidate VTd IOTLB.
+
+ @param[in] VtdIndex The index used to identify a VTd engine.
+**/
+EFI_STATUS
+InvalidateIOTLB (
+ IN UINTN VtdIndex
+ );
+
+/**
Invalid VTd global IOTLB.
@param[in] VtdIndex The index of VTd engine.