public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH] UefiCpuPkg: Restore HpetTimer after CpuExceptionHandlerLib test
@ 2022-10-20  3:00 duntan
  2022-10-27  2:08 ` Ni, Ray
  0 siblings, 1 reply; 6+ messages in thread
From: duntan @ 2022-10-20  3:00 UTC (permalink / raw)
  To: devel; +Cc: Eric Dong, Ray Ni, Rahul Kumar

Disable/Restore HpetTimer before and after running the Dxe
CpuExceptionHandlerLib unit test module. During the UnitTest, a
new Idt is initialized for the test. There is no handler for timer
intrrupt in this new idt. After the test module, HpetTimer does
not work any more since the comparator value register and main
counter value register for timer does not match. To fix this issue,
disable/restore HpetTimer before and after Unit Test if HpetTimer
driver has been dispatched. Besides, send Apic EOI before restore
HpetTimer.

Signed-off-by: Dun Tan <dun.tan@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Rahul Kumar <rahul1.kumar@intel.com>
---
 UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHandlerLibUnitTest.inf |  2 ++
 UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHandlerUnitTest.c      | 33 ++++++++++++++++++++++++++++++++-
 2 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHandlerLibUnitTest.inf b/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHandlerLibUnitTest.inf
index e3dbe7b9ab..24f905936c 100644
--- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHandlerLibUnitTest.inf
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHandlerLibUnitTest.inf
@@ -43,6 +43,7 @@
   HobLib
   UefiBootServicesTableLib
   CpuPageTableLib
+  LocalApicLib
 
 [Guids]
   gEfiHobMemoryAllocStackGuid
@@ -53,6 +54,7 @@
 
 [Protocols]
   gEfiMpServiceProtocolGuid
+  gEfiTimerArchProtocolGuid
 
 [Depex]
   gEfiMpServiceProtocolGuid
diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHandlerUnitTest.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHandlerUnitTest.c
index 917fc549bf..045f39fa00 100644
--- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHandlerUnitTest.c
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHandlerUnitTest.c
@@ -8,6 +8,8 @@
 
 #include "CpuExceptionHandlerTest.h"
 #include <Library/UefiBootServicesTableLib.h>
+#include <Library/LocalApicLib.h>
+#include <Protocol/Timer.h>
 
 /**
   Initialize Bsp Idt with a new Idt table and return the IA32_DESCRIPTOR buffer.
@@ -162,8 +164,12 @@ CpuExceptionHandlerTestEntry (
 {
   EFI_STATUS                  Status;
   UNIT_TEST_FRAMEWORK_HANDLE  Framework;
+  EFI_TIMER_ARCH_PROTOCOL     *TimerArchProtocol;
+  UINT64                      TimerPeriod;
 
-  Framework = NULL;
+  Framework         = NULL;
+  TimerArchProtocol = NULL;
+  TimerPeriod       = 0;
 
   DEBUG ((DEBUG_INFO, "%a v%a\n", UNIT_TEST_APP_NAME, UNIT_TEST_APP_VERSION));
 
@@ -182,11 +188,36 @@ CpuExceptionHandlerTestEntry (
     goto EXIT;
   }
 
+  //
+  // If HpetTimer driver has been dispatched, disable HpetTimer before Unit Test.
+  //
+  gBS->LocateProtocol (&gEfiTimerArchProtocolGuid, NULL, (VOID **)&TimerArchProtocol);
+  if (TimerArchProtocol != NULL) {
+    Status = TimerArchProtocol->GetTimerPeriod (TimerArchProtocol, &TimerPeriod);
+    ASSERT_EFI_ERROR (Status);
+    if (TimerPeriod > 0) {
+      DEBUG ((DEBUG_INFO, "HpetTimer has been dispatched. Disable HpetTimer.\n"));
+      Status = TimerArchProtocol->SetTimerPeriod (TimerArchProtocol, 0);
+      ASSERT_EFI_ERROR (Status);
+    }
+  }
+
   //
   // Execute the tests.
   //
   Status = RunAllTestSuites (Framework);
 
+  //
+  // Restore HpetTimer after Unit Test.
+  // Send APIC EOI before SetTimerPeriod.
+  //
+  if ((TimerArchProtocol != NULL) && (TimerPeriod > 0)) {
+    DEBUG ((DEBUG_INFO, "Restore HpetTimer after DxeCpuExceptionHandlerLib UnitTest.\n"));
+    SendApicEoi ();
+    Status = TimerArchProtocol->SetTimerPeriod (TimerArchProtocol, TimerPeriod);
+    ASSERT_EFI_ERROR (Status);
+  }
+
 EXIT:
   if (Framework) {
     FreeUnitTestFramework (Framework);
-- 
2.31.1.windows.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2022-10-27  3:08 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-20  3:00 [PATCH] UefiCpuPkg: Restore HpetTimer after CpuExceptionHandlerLib test duntan
2022-10-27  2:08 ` Ni, Ray
2022-10-27  2:26   ` [edk2-devel] " Michael D Kinney
2022-10-27  2:32     ` Ni, Ray
     [not found]     ` <1721CC636147BB21.550@groups.io>
2022-10-27  3:03       ` Ni, Ray
2022-10-27  3:08         ` duntan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox