diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicCommonDxe.c b/ArmPkg/Drivers/ArmGicDxe/ArmGicCommonDxe.c index 8e845511d6..e777aee468 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicCommonDxe.c +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicCommonDxe.c @@ -18,6 +18,7 @@ EFI_EVENT EfiExitBootServicesEvent = (EFI_EVENT)NULL; UINTN mGicNumInterrupts = 0; HARDWARE_INTERRUPT_HANDLER *gRegisteredInterruptHandlers = NULL; +EFI_CPU_ARCH_PROTOCOL *gCpuArch; /** Calculate GICD_ICFGRn base address and corresponding bit @@ -98,55 +99,6 @@ RegisterInterruptSource ( } } -STATIC VOID *mCpuArchProtocolNotifyEventRegistration; - -STATIC -VOID -EFIAPI -CpuArchEventProtocolNotify ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - EFI_CPU_ARCH_PROTOCOL *Cpu; - EFI_STATUS Status; - - // Get the CPU protocol that this driver requires. - Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&Cpu); - if (EFI_ERROR (Status)) { - return; - } - - // Unregister the default exception handler. - Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ, NULL); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "%a: Cpu->RegisterInterruptHandler() - %r\n", - __func__, - Status - )); - return; - } - - // Register to receive interrupts - Status = Cpu->RegisterInterruptHandler ( - Cpu, - ARM_ARCH_EXCEPTION_IRQ, - Context - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_ERROR, - "%a: Cpu->RegisterInterruptHandler() - %r\n", - __func__, - Status - )); - } - - gBS->CloseEvent (Event); -} - EFI_STATUS InstallAndRegisterInterruptService ( IN EFI_HARDWARE_INTERRUPT_PROTOCOL *InterruptProtocol, @@ -159,12 +111,24 @@ InstallAndRegisterInterruptService ( CONST UINTN RihArraySize = (sizeof (HARDWARE_INTERRUPT_HANDLER) * mGicNumInterrupts); + // Locate the CPU arch protocol - cannot fail because of DEPEX + Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&gCpuArch); + ASSERT_EFI_ERROR (Status); + // Initialize the array for the Interrupt Handlers gRegisteredInterruptHandlers = AllocateZeroPool (RihArraySize); if (gRegisteredInterruptHandlers == NULL) { return EFI_OUT_OF_RESOURCES; } + // Register to receive interrupts + Status = gCpuArch->RegisterInterruptHandler (gCpuArch, ARM_ARCH_EXCEPTION_IRQ, InterruptHandler); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Cpu->RegisterInterruptHandler() - %r\n", __func__, Status)); + FreePool (gRegisteredInterruptHandlers); + return Status; + } + Status = gBS->InstallMultipleProtocolInterfaces ( &gHardwareInterruptHandle, &gHardwareInterruptProtocolGuid, @@ -177,17 +141,6 @@ InstallAndRegisterInterruptService ( return Status; } - // - // Install the interrupt handler as soon as the CPU arch protocol appears. - // - EfiCreateProtocolNotifyEvent ( - &gEfiCpuArchProtocolGuid, - TPL_CALLBACK, - CpuArchEventProtocolNotify, - InterruptHandler, - &mCpuArchProtocolNotifyEventRegistration - ); - // Register for an ExitBootServicesEvent Status = gBS->CreateEvent ( EVT_SIGNAL_EXIT_BOOT_SERVICES, diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h index 57732661d2..4ae46e7c90 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h @@ -23,6 +23,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent extern UINTN mGicNumInterrupts; extern HARDWARE_INTERRUPT_HANDLER *gRegisteredInterruptHandlers; +extern EFI_CPU_ARCH_PROTOCOL *gCpuArch; // Common API EFI_STATUS diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf index 26cc1b740b..688993b89d 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf @@ -51,7 +51,7 @@ [Protocols] gHardwareInterruptProtocolGuid ## PRODUCES gHardwareInterrupt2ProtocolGuid ## PRODUCES - gEfiCpuArchProtocolGuid ## CONSUMES ## NOTIFY + gEfiCpuArchProtocolGuid ## CONSUMES [Pcd.common] gArmTokenSpaceGuid.PcdGicDistributorBase @@ -59,4 +59,4 @@ gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase [Depex] - TRUE + gEfiCpuArchProtocolGuid diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicV2Dxe.inf b/ArmPkg/Drivers/ArmGicDxe/ArmGicV2Dxe.inf index 21db74c07a..37407f30e9 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicV2Dxe.inf +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicV2Dxe.inf @@ -41,11 +41,11 @@ [Protocols] gHardwareInterruptProtocolGuid ## PRODUCES gHardwareInterrupt2ProtocolGuid ## PRODUCES - gEfiCpuArchProtocolGuid ## CONSUMES ## NOTIFY + gEfiCpuArchProtocolGuid ## CONSUMES [Pcd.common] gArmTokenSpaceGuid.PcdGicDistributorBase gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase [Depex] - TRUE + gEfiCpuArchProtocolGuid diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf b/ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf index 9136677084..a74018217f 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf @@ -47,11 +47,11 @@ [Protocols] gHardwareInterruptProtocolGuid ## PRODUCES gHardwareInterrupt2ProtocolGuid ## PRODUCES - gEfiCpuArchProtocolGuid ## CONSUMES ## NOTIFY + gEfiCpuArchProtocolGuid ## CONSUMES [Pcd.common] gArmTokenSpaceGuid.PcdGicDistributorBase gArmTokenSpaceGuid.PcdGicRedistributorsBase [Depex] - TRUE + gEfiCpuArchProtocolGuid