]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/CapsuleRuntimeDxe: Add cache flush for IA32 and X64
authorZhichao Gao <zhichao.gao@intel.com>
Fri, 22 Mar 2019 03:07:17 +0000 (11:07 +0800)
committerLiming Gao <liming.gao@intel.com>
Tue, 2 Apr 2019 04:49:03 +0000 (12:49 +0800)
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1462

The IA32 and X64 ARCH need cache flush function during capsule update.
And the cache flush is already implemented in arm ARCH, so add this
function CapsuleCacheWriteBack() to IA32 and X64 ARCH. And add a null
version for EBC.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Zhichao Gao <zhichao.gao@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Hao Wu <hao.a.wu@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Liming Gao <liming.gao@intel.com>
MdeModulePkg/Universal/CapsuleRuntimeDxe/Arm/CapsuleReset.c
MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleCache.c [new file with mode: 0644]
MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleCacheNull.c [new file with mode: 0644]
MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleReset.c
MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf

index d79d2fc69324c1c42e466aa6246d19a8e1fa3ffa..ec630ab7a894873c8c148fa40c4665e9a5b314db 100644 (file)
@@ -3,6 +3,7 @@
   PersistAcrossReset capsules\r
 \r
   Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR>\r
+  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>\r
 \r
   This program and the accompanying materials are licensed and made available\r
   under the terms and conditions of the BSD License which accompanies this\r
@@ -16,8 +17,6 @@
 \r
 #include "CapsuleService.h"\r
 \r
-#include <Library/CacheMaintenanceLib.h>\r
-\r
 /**\r
   Whether the platform supports capsules that persist across reset. Note that\r
   some platforms only support such capsules at boot time.\r
@@ -41,35 +40,3 @@ IsPersistAcrossResetCapsuleSupported (
   return FeaturePcdGet (PcdSupportUpdateCapsuleReset) && !EfiAtRuntime ();\r
 }\r
 \r
-/**\r
-  Writes Back a range of data cache lines covering a set of capsules in memory.\r
-\r
-  Writes Back the data cache lines specified by ScatterGatherList.\r
-\r
-  @param  ScatterGatherList Physical address of the data structure that\r
-                            describes a set of capsules in memory\r
-\r
-**/\r
-VOID\r
-CapsuleCacheWriteBack (\r
-  IN  EFI_PHYSICAL_ADDRESS    ScatterGatherList\r
-  )\r
-{\r
-  EFI_CAPSULE_BLOCK_DESCRIPTOR    *Desc;\r
-\r
-  Desc = (EFI_CAPSULE_BLOCK_DESCRIPTOR *)(UINTN)ScatterGatherList;\r
-  do {\r
-    WriteBackDataCacheRange (Desc, sizeof *Desc);\r
-\r
-    if (Desc->Length > 0) {\r
-      WriteBackDataCacheRange ((VOID *)(UINTN)Desc->Union.DataBlock,\r
-                               Desc->Length\r
-                               );\r
-      Desc++;\r
-    } else if (Desc->Union.ContinuationPointer > 0) {\r
-      Desc = (EFI_CAPSULE_BLOCK_DESCRIPTOR *)(UINTN)Desc->Union.ContinuationPointer;\r
-    }\r
-  } while (Desc->Length > 0 || Desc->Union.ContinuationPointer > 0);\r
-\r
-  WriteBackDataCacheRange (Desc, sizeof *Desc);\r
-}\r
diff --git a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleCache.c b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleCache.c
new file mode 100644 (file)
index 0000000..ab81296
--- /dev/null
@@ -0,0 +1,63 @@
+/** @file\r
+  Flush the cache is required for most architectures while do capsule\r
+  update. It is not support at Runtime.\r
+\r
+  Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR>\r
+  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>\r
+\r
+  This program and the accompanying materials are licensed and made available\r
+  under the terms and conditions of the BSD License which accompanies this\r
+  distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "CapsuleService.h"\r
+\r
+#include <Library/CacheMaintenanceLib.h>\r
+\r
+/**\r
+  Writes Back a range of data cache lines covering a set of capsules in memory.\r
+\r
+  Writes Back the data cache lines specified by ScatterGatherList.\r
+\r
+  @param  ScatterGatherList Physical address of the data structure that\r
+                            describes a set of capsules in memory\r
+\r
+**/\r
+VOID\r
+CapsuleCacheWriteBack (\r
+  IN  EFI_PHYSICAL_ADDRESS    ScatterGatherList\r
+  )\r
+{\r
+  EFI_CAPSULE_BLOCK_DESCRIPTOR    *Desc;\r
+\r
+  if (!EfiAtRuntime ()) {\r
+    Desc = (EFI_CAPSULE_BLOCK_DESCRIPTOR *)(UINTN)ScatterGatherList;\r
+    do {\r
+      WriteBackDataCacheRange (\r
+        (VOID *)(UINTN)Desc,\r
+        (UINTN)sizeof (*Desc)\r
+        );\r
+\r
+      if (Desc->Length > 0) {\r
+        WriteBackDataCacheRange (\r
+          (VOID *)(UINTN)Desc->Union.DataBlock,\r
+          (UINTN)Desc->Length\r
+          );\r
+        Desc++;\r
+      } else if (Desc->Union.ContinuationPointer > 0) {\r
+        Desc = (EFI_CAPSULE_BLOCK_DESCRIPTOR *)(UINTN)Desc->Union.ContinuationPointer;\r
+      }\r
+    } while (Desc->Length > 0 || Desc->Union.ContinuationPointer > 0);\r
+\r
+    WriteBackDataCacheRange (\r
+      (VOID *)(UINTN)Desc,\r
+      (UINTN)sizeof (*Desc)\r
+      );\r
+  }\r
+}\r
+\r
diff --git a/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleCacheNull.c b/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleCacheNull.c
new file mode 100644 (file)
index 0000000..cfb9bb1
--- /dev/null
@@ -0,0 +1,38 @@
+/** @file\r
+  Null function version of cache function.\r
+\r
+  Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR>\r
+  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>\r
+\r
+  This program and the accompanying materials are licensed and made available\r
+  under the terms and conditions of the BSD License which accompanies this\r
+  distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "CapsuleService.h"\r
+\r
+#include <Library/CacheMaintenanceLib.h>\r
+\r
+/**\r
+  Writes Back a range of data cache lines covering a set of capsules in memory.\r
+\r
+  Writes Back the data cache lines specified by ScatterGatherList.\r
+\r
+  Null version, do nothing.\r
+\r
+  @param  ScatterGatherList Physical address of the data structure that\r
+                            describes a set of capsules in memory\r
+\r
+**/\r
+VOID\r
+CapsuleCacheWriteBack (\r
+  IN  EFI_PHYSICAL_ADDRESS    ScatterGatherList\r
+  )\r
+{\r
+}\r
+\r
index 353f6f20903a2feeaa3723f32345c54a37b0c9bf..8990cf2a3577ed15e9d13bd754bcbf749acc6218 100644 (file)
@@ -3,6 +3,7 @@
   PersistAcrossReset capsules\r
 \r
   Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR>\r
+  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>\r
 \r
   This program and the accompanying materials are licensed and made available\r
   under the terms and conditions of the BSD License which accompanies this\r
@@ -32,18 +33,3 @@ IsPersistAcrossResetCapsuleSupported (
   return FeaturePcdGet (PcdSupportUpdateCapsuleReset);\r
 }\r
 \r
-/**\r
-  Writes Back a range of data cache lines covering a set of capsules in memory.\r
-\r
-  Writes Back the data cache lines specified by ScatterGatherList.\r
-\r
-  @param  ScatterGatherList Physical address of the data structure that\r
-                            describes a set of capsules in memory\r
-\r
-**/\r
-VOID\r
-CapsuleCacheWriteBack (\r
-  IN  EFI_PHYSICAL_ADDRESS    ScatterGatherList\r
-  )\r
-{\r
-}\r
index ad7af5fe623a6958b69582566ffd4867cc015c94..a0cb32a06f5c5778490ec408c84452345cb6bf5c 100644 (file)
@@ -4,7 +4,7 @@
 #  It installs the Capsule Architectural Protocol defined in PI1.0a to signify\r
 #  the capsule runtime services are ready.\r
 #\r
-#  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
 #  This program and the accompanying materials\r
 #  are licensed and made available under the terms and conditions of the BSD License\r
 #  which accompanies this distribution.  The full text of the license may be found at\r
 \r
 [Sources.Ia32, Sources.EBC, Sources.ARM, Sources.AARCH64]\r
   SaveLongModeContext.c\r
-  CapsuleReset.c\r
 \r
-[Sources.X64]\r
-  X64/SaveLongModeContext.c\r
+[Sources.Ia32, Sources.X64, Sources.ARM, Sources.AARCH64]\r
+  CapsuleCache.c\r
+\r
+[Sources.Ia32, Sources.X64, Sources.EBC]\r
   CapsuleReset.c\r
 \r
 [Sources.ARM, Sources.AARCH64]\r
-  SaveLongModeContext.c\r
   Arm/CapsuleReset.c\r
 \r
+[Sources.EBC]\r
+  CapsuleCacheNull.c\r
+\r
+[Sources.X64]\r
+  X64/SaveLongModeContext.c\r
+\r
 [Packages]\r
   MdePkg/MdePkg.dec\r
   MdeModulePkg/MdeModulePkg.dec\r
   BaseLib\r
   PrintLib\r
   BaseMemoryLib\r
+  CacheMaintenanceLib\r
 \r
 [LibraryClasses.X64]\r
   UefiLib\r
   BaseMemoryLib\r
 \r
-[LibraryClasses.ARM, LibraryClasses.AARCH64]\r
-  CacheMaintenanceLib\r
-\r
 [Guids]\r
   ## SOMETIMES_PRODUCES   ## Variable:L"CapsuleUpdateData" # (Process across reset capsule image) for capsule updated data\r
   ## SOMETIMES_PRODUCES   ## Variable:L"CapsuleLongModeBuffer" # The long mode buffer used by IA32 Capsule PEIM to call X64 CapsuleCoalesce code to handle >4GB capsule blocks\r