Reviewed-by: Ray Ni <ray...@intel.com> > -----Original Message----- > From: Tan, Dun <dun....@intel.com> > Sent: Thursday, October 20, 2022 11:01 AM > To: devel@edk2.groups.io > Cc: Dong, Eric <eric.d...@intel.com>; Ni, Ray <ray...@intel.com>; Kumar, > Rahul R <rahul.r.ku...@intel.com> > Subject: [PATCH] UefiCpuPkg: Restore HpetTimer after > CpuExceptionHandlerLib test > > 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....@intel.com> > Cc: Eric Dong <eric.d...@intel.com> > Cc: Ray Ni <ray...@intel.com> > Cc: Rahul Kumar <rahul1.ku...@intel.com> > --- > > UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHan > dlerLibUnitTest.inf | 2 ++ > > UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHan > dlerUnitTest.c | 33 ++++++++++++++++++++++++++++++++- > 2 files changed, 34 insertions(+), 1 deletion(-) > > diff --git > a/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionH > andlerLibUnitTest.inf > b/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionH > andlerLibUnitTest.inf > index e3dbe7b9ab..24f905936c 100644 > --- > a/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionH > andlerLibUnitTest.inf > +++ > b/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionH > andlerLibUnitTest.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/DxeCpuExceptionH > andlerUnitTest.c > b/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionH > andlerUnitTest.c > index 917fc549bf..045f39fa00 100644 > --- > a/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionH > andlerUnitTest.c > +++ > b/UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionH > andlerUnitTest.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
-=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#95625): https://edk2.groups.io/g/devel/message/95625 Mute This Topic: https://groups.io/mt/94446624/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-