]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg: Use NestedInterruptTplLib in nested interrupt handlers
authorMichael Brown <mcb30@ipxe.org>
Fri, 9 Dec 2022 10:20:27 +0000 (10:20 +0000)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Fri, 23 Dec 2022 14:44:48 +0000 (14:44 +0000)
Prevent stack underrun in the event of a timer interrupt storm in
LocalApicTimerDxe and 8254TimerDxe interrupt handlers by using the
helper functions provided by NestedInterruptTplLib.

This fixes the same problem as addressed in commit 239b50a86
("OvmfPkg: End timer interrupt later to avoid stack overflow under
load"), but does so without breaking nested timer interrupts.

Cc: Paolo Bonzini <pbonzini@redhat.com>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2815
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=4162
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Acked-by: Laszlo Ersek <lersek@redhat.com>
12 files changed:
OvmfPkg/8254TimerDxe/8254Timer.inf
OvmfPkg/8254TimerDxe/Timer.c
OvmfPkg/AmdSev/AmdSevX64.dsc
OvmfPkg/CloudHv/CloudHvX64.dsc
OvmfPkg/IntelTdx/IntelTdxX64.dsc
OvmfPkg/LocalApicTimerDxe/LocalApicTimerDxe.c
OvmfPkg/LocalApicTimerDxe/LocalApicTimerDxe.inf
OvmfPkg/Microvm/MicrovmX64.dsc
OvmfPkg/OvmfPkgIa32.dsc
OvmfPkg/OvmfPkgIa32X64.dsc
OvmfPkg/OvmfPkgX64.dsc
OvmfPkg/OvmfXen.dsc

index 8a07c8247ebe911b8275776fa832a3851a5e2437..8fbab896f01b8dc2828c3c1e05cbae38ff38f2a6 100644 (file)
@@ -24,6 +24,7 @@
   UefiBootServicesTableLib\r
   BaseLib\r
   DebugLib\r
+  NestedInterruptTplLib\r
   UefiDriverEntryPoint\r
   IoLib\r
 \r
index 7feaaaba2b020fb0dc7e406408b33f5b305f52d7..5382b01615dfeb85beaeb8c14035978d95cbf5a9 100644 (file)
@@ -6,6 +6,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 \r
 **/\r
 \r
+#include <Library/NestedInterruptTplLib.h>\r
+\r
 #include "Timer.h"\r
 \r
 //\r
@@ -76,9 +78,10 @@ TimerInterruptHandler (
   IN EFI_SYSTEM_CONTEXT  SystemContext\r
   )\r
 {\r
-  EFI_TPL  OriginalTPL;\r
+  STATIC NESTED_INTERRUPT_STATE  NestedInterruptState;\r
+  EFI_TPL                        OriginalTPL;\r
 \r
-  OriginalTPL = gBS->RaiseTPL (TPL_HIGH_LEVEL);\r
+  OriginalTPL = NestedInterruptRaiseTPL ();\r
 \r
   mLegacy8259->EndOfInterrupt (mLegacy8259, Efi8259Irq0);\r
 \r
@@ -89,7 +92,7 @@ TimerInterruptHandler (
     mTimerNotifyFunction (mTimerPeriod);\r
   }\r
 \r
-  gBS->RestoreTPL (OriginalTPL);\r
+  NestedInterruptRestoreTPL (OriginalTPL, SystemContext, &NestedInterruptState);\r
 }\r
 \r
 /**\r
index 18c2922540f9b31257dc05b2c19740da9dab9f3f..1cafe0d5b32618acbd285d743d50c551783cb1e3 100644 (file)
   PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf\r
   CpuPageTableLib|UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableLib.inf\r
   MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf\r
+  NestedInterruptTplLib|OvmfPkg/Library/NestedInterruptTplLib/NestedInterruptTplLib.inf\r
   QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf\r
   QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.inf\r
 \r
index 98daf98f43a9cc069a43b04a32d1546474308d41..dc2509c39ec9947586a0b87d9ffc80a91f97e790 100644 (file)
   PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf\r
   CpuPageTableLib|UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableLib.inf\r
   MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf\r
+  NestedInterruptTplLib|OvmfPkg/Library/NestedInterruptTplLib/NestedInterruptTplLib.inf\r
   QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf\r
   QemuLoadImageLib|OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf\r
 \r
index ea538fd7831a137db1287fbc9cd44e41deee4b4b..6ec64df91871df72d940876d89dc3ccc06f56e4c 100644 (file)
   PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf\r
   CpuPageTableLib|UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableLib.inf\r
   MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf\r
+  NestedInterruptTplLib|OvmfPkg/Library/NestedInterruptTplLib/NestedInterruptTplLib.inf\r
   QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf\r
   QemuLoadImageLib|OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf\r
 \r
index 3e04b49d6bcffae54e9fb7786b4096cd43c08b13..67f4dcde37e1caa1a59729bb3ac8e80d7afeb464 100644 (file)
@@ -8,6 +8,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 \r
 **/\r
 \r
+#include <Library/NestedInterruptTplLib.h>\r
+\r
 #include "LocalApicTimerDxe.h"\r
 \r
 //\r
@@ -58,9 +60,10 @@ TimerInterruptHandler (
   IN EFI_SYSTEM_CONTEXT  SystemContext\r
   )\r
 {\r
-  EFI_TPL  OriginalTPL;\r
+  STATIC NESTED_INTERRUPT_STATE  NestedInterruptState;\r
+  EFI_TPL                        OriginalTPL;\r
 \r
-  OriginalTPL = gBS->RaiseTPL (TPL_HIGH_LEVEL);\r
+  OriginalTPL = NestedInterruptRaiseTPL ();\r
 \r
   SendApicEoi ();\r
 \r
@@ -71,7 +74,7 @@ TimerInterruptHandler (
     mTimerNotifyFunction (mTimerPeriod);\r
   }\r
 \r
-  gBS->RestoreTPL (OriginalTPL);\r
+  NestedInterruptRestoreTPL (OriginalTPL, SystemContext, &NestedInterruptState);\r
 }\r
 \r
 /**\r
index 3ad28a148c5b0d58d3165b9eb1fe3cb9f8785f52..b85965c75ea37e0b4f2ca644e91bc05db4898669 100644 (file)
@@ -27,6 +27,7 @@
   UefiBootServicesTableLib\r
   BaseLib\r
   DebugLib\r
+  NestedInterruptTplLib\r
   UefiDriverEntryPoint\r
   LocalApicLib\r
 \r
index de3b355254af165994cc328303bdfcd99f49f914..f92a321fc206b36d77d3b8c9f1b33d2a53a43fe3 100644 (file)
   PciExpressLib|OvmfPkg/Library/BaseCachingPciExpressLib/BaseCachingPciExpressLib.inf\r
   CpuPageTableLib|UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableLib.inf\r
   MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf\r
+  NestedInterruptTplLib|OvmfPkg/Library/NestedInterruptTplLib/NestedInterruptTplLib.inf\r
   QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf\r
   QemuLoadImageLib|OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf\r
 \r
index f617aa60ca43d52cfd8673a347bb69917bd09a07..f232de13a7b6ec00229c9dd376a6dbaf04eaf3ac 100644 (file)
 !endif\r
   PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf\r
   MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf\r
+  NestedInterruptTplLib|OvmfPkg/Library/NestedInterruptTplLib/NestedInterruptTplLib.inf\r
   QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf\r
   QemuLoadImageLib|OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf\r
 \r
index cbd5df63a150bc26dc1d7ead5b822ef01a66e509..f21b78299fbfc23643c889734c61a435e11469b7 100644 (file)
   PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf\r
   CpuPageTableLib|UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableLib.inf\r
   MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf\r
+  NestedInterruptTplLib|OvmfPkg/Library/NestedInterruptTplLib/NestedInterruptTplLib.inf\r
   QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf\r
   QemuLoadImageLib|OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf\r
 \r
index 2caa4d2eccd94a42e01e835b0b3219ea6624e47b..e24bb442cbe9dd9b65eaafe834ff429ba047208c 100644 (file)
   PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf\r
   CpuPageTableLib|UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableLib.inf\r
   MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf\r
+  NestedInterruptTplLib|OvmfPkg/Library/NestedInterruptTplLib/NestedInterruptTplLib.inf\r
   QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf\r
   QemuLoadImageLib|OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf\r
 \r
index 2af4682b78aa759192f7bfbca94e1f091e0dc914..bfa08c08e359dacc50a8aa94d988df51d7666c91 100644 (file)
   PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf\r
   CpuPageTableLib|UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableLib.inf\r
   MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf\r
+  NestedInterruptTplLib|OvmfPkg/Library/NestedInterruptTplLib/NestedInterruptTplLib.inf\r
   QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf\r
 \r
 [LibraryClasses.common.UEFI_APPLICATION]\r