X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkCompatibilityPkg%2FCompatibility%2FSmmBaseOnSmmBase2Thunk%2FSmmBaseOnSmmBase2Thunk.c;h=4834036a6bef612e7d8d7c71fb39a891fa473e4f;hp=e470da0af034e92f9378a21e34d28cb535f4e1ad;hb=8edfbe027cc9f20624e64a392a160b7c9240e087;hpb=123e0cacd05b2a38d7c5c6e46dcf6bf41ccf8a5b diff --git a/EdkCompatibilityPkg/Compatibility/SmmBaseOnSmmBase2Thunk/SmmBaseOnSmmBase2Thunk.c b/EdkCompatibilityPkg/Compatibility/SmmBaseOnSmmBase2Thunk/SmmBaseOnSmmBase2Thunk.c index e470da0af0..4834036a6b 100644 --- a/EdkCompatibilityPkg/Compatibility/SmmBaseOnSmmBase2Thunk/SmmBaseOnSmmBase2Thunk.c +++ b/EdkCompatibilityPkg/Compatibility/SmmBaseOnSmmBase2Thunk/SmmBaseOnSmmBase2Thunk.c @@ -44,6 +44,7 @@ EFI_HANDLE mSmmBaseHandle = NULL; EFI_SMM_BASE2_PROTOCOL *mSmmBase2 = NULL; EFI_SMM_COMMUNICATION_PROTOCOL *mSmmCommunication = NULL; EFI_SMM_BASE_HELPER_READY_PROTOCOL *mSmmBaseHelperReady = NULL; +BOOLEAN mAtRuntime = FALSE; /** Determine if in SMM mode. @@ -133,7 +134,7 @@ SmmBaseRegister ( IN BOOLEAN LegacyIA32Binary ) { - if (LegacyIA32Binary) { + if (mAtRuntime || LegacyIA32Binary) { return EFI_UNSUPPORTED; } @@ -166,6 +167,10 @@ SmmBaseUnregister ( IN EFI_HANDLE ImageHandle ) { + if (mAtRuntime) { + return EFI_UNSUPPORTED; + } + mCommunicationData.FunctionData.Function = SmmBaseFunctionUnregister; mCommunicationData.FunctionData.Args.UnRegister.ImageHandle = ImageHandle; @@ -308,6 +313,10 @@ SmmBaseSmmAllocatePool ( OUT VOID **Buffer ) { + if (mAtRuntime) { + return EFI_UNSUPPORTED; + } + mCommunicationData.FunctionData.Function = SmmBaseFunctionAllocatePool; mCommunicationData.FunctionData.Args.AllocatePool.PoolType = PoolType; mCommunicationData.FunctionData.Args.AllocatePool.Size = Size; @@ -336,6 +345,10 @@ SmmBaseSmmFreePool ( IN VOID *Buffer ) { + if (mAtRuntime) { + return EFI_UNSUPPORTED; + } + mCommunicationData.FunctionData.Function = SmmBaseFunctionFreePool; mCommunicationData.FunctionData.Args.FreePool.Buffer = Buffer; @@ -408,6 +421,24 @@ EFI_SMM_BASE_PROTOCOL mSmmBase = { SmmBaseGetSmstLocation }; +/** + Notification function on Exit Boot Services Event. + + This function sets a flag indicating it is in Runtime phase. + + @param Event Event whose notification function is being invoked + @param Context Pointer to the notification function's context +**/ +VOID +EFIAPI +SmmBaseExitBootServicesEventNotify ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + mAtRuntime = TRUE; +} + /** Entry Point for SMM Base Protocol on SMM Base2 Protocol Thunk driver. @@ -449,6 +480,19 @@ SmmBaseThunkMain ( Status = gBS->LocateProtocol (&gEfiSmmBaseHelperReadyProtocolGuid, NULL, (VOID **) &mSmmBaseHelperReady); ASSERT_EFI_ERROR (Status); + // + // Create event notification on Exit Boot Services event. + // + Status = gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_NOTIFY, + SmmBaseExitBootServicesEventNotify, + NULL, + &gEfiEventExitBootServicesGuid, + &Event + ); + ASSERT_EFI_ERROR (Status); + // // Create event on SetVirtualAddressMap() to convert mSmmCommunication from a physical address to a virtual address //