summaryrefslogtreecommitdiffstats
path: root/OvmfPkg/LocalApicTimerDxe
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2022-12-09 10:20:27 +0000
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2022-12-23 14:44:48 +0000
commita086f4a63bc0295b0b02f8ee76381c6b437122bf (patch)
tree0b29dd5164aca8a8ce35803c0cc16b077e6f6780 /OvmfPkg/LocalApicTimerDxe
parenta24fbd6061254ca74d6c6ed953dec6f796a45c76 (diff)
downloadedk2-a086f4a63bc0295b0b02f8ee76381c6b437122bf.tar.gz
edk2-a086f4a63bc0295b0b02f8ee76381c6b437122bf.tar.bz2
edk2-a086f4a63bc0295b0b02f8ee76381c6b437122bf.zip
OvmfPkg: Use NestedInterruptTplLib in nested interrupt handlers
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>
Diffstat (limited to 'OvmfPkg/LocalApicTimerDxe')
-rw-r--r--OvmfPkg/LocalApicTimerDxe/LocalApicTimerDxe.c9
-rw-r--r--OvmfPkg/LocalApicTimerDxe/LocalApicTimerDxe.inf1
2 files changed, 7 insertions, 3 deletions
diff --git a/OvmfPkg/LocalApicTimerDxe/LocalApicTimerDxe.c b/OvmfPkg/LocalApicTimerDxe/LocalApicTimerDxe.c
index 3e04b49d6b..67f4dcde37 100644
--- a/OvmfPkg/LocalApicTimerDxe/LocalApicTimerDxe.c
+++ b/OvmfPkg/LocalApicTimerDxe/LocalApicTimerDxe.c
@@ -8,6 +8,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/
+#include <Library/NestedInterruptTplLib.h>
+
#include "LocalApicTimerDxe.h"
//
@@ -58,9 +60,10 @@ TimerInterruptHandler (
IN EFI_SYSTEM_CONTEXT SystemContext
)
{
- EFI_TPL OriginalTPL;
+ STATIC NESTED_INTERRUPT_STATE NestedInterruptState;
+ EFI_TPL OriginalTPL;
- OriginalTPL = gBS->RaiseTPL (TPL_HIGH_LEVEL);
+ OriginalTPL = NestedInterruptRaiseTPL ();
SendApicEoi ();
@@ -71,7 +74,7 @@ TimerInterruptHandler (
mTimerNotifyFunction (mTimerPeriod);
}
- gBS->RestoreTPL (OriginalTPL);
+ NestedInterruptRestoreTPL (OriginalTPL, SystemContext, &NestedInterruptState);
}
/**
diff --git a/OvmfPkg/LocalApicTimerDxe/LocalApicTimerDxe.inf b/OvmfPkg/LocalApicTimerDxe/LocalApicTimerDxe.inf
index 3ad28a148c..b85965c75e 100644
--- a/OvmfPkg/LocalApicTimerDxe/LocalApicTimerDxe.inf
+++ b/OvmfPkg/LocalApicTimerDxe/LocalApicTimerDxe.inf
@@ -27,6 +27,7 @@
UefiBootServicesTableLib
BaseLib
DebugLib
+ NestedInterruptTplLib
UefiDriverEntryPoint
LocalApicLib