X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FCore%2FDxe%2FDxeMain%2FDxeProtocolNotify.c;h=24ccc49a9b8c412fd6dd7ac5d1f396bd210724bb;hp=7e49423fb4dd4d0445ce076b801a623e7352d7c2;hb=0f6b6f755b09f5bb386bb41fa21cc75f58a624d2;hpb=878ddf1fc3540a715f63594ed22b6929e881afb4 diff --git a/EdkModulePkg/Core/Dxe/DxeMain/DxeProtocolNotify.c b/EdkModulePkg/Core/Dxe/DxeMain/DxeProtocolNotify.c index 7e49423fb4..24ccc49a9b 100644 --- a/EdkModulePkg/Core/Dxe/DxeMain/DxeProtocolNotify.c +++ b/EdkModulePkg/Core/Dxe/DxeMain/DxeProtocolNotify.c @@ -1,13 +1,13 @@ /*++ -Copyright (c) 2006, Intel Corporation -All rights reserved. This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +Copyright (c) 2006 - 2007, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. Module Name: @@ -15,8 +15,8 @@ Module Name: Abstract: - This file deals with Architecture Protocol (AP) registration in - the Dxe Core. The mArchProtocols[] array represents a list of + This file deals with Architecture Protocol (AP) registration in + the Dxe Core. The mArchProtocols[] array represents a list of events that represent the Architectural Protocols. --*/ @@ -43,9 +43,9 @@ ARCHITECTURAL_PROTOCOL_ENTRY mArchProtocols[] = { { &gEfiRuntimeArchProtocolGuid, (VOID **)&gRuntime, NULL, NULL, FALSE }, { &gEfiVariableArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE }, { &gEfiVariableWriteArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE }, + { &gEfiCapsuleArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE}, { &gEfiMonotonicCounterArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE }, { &gEfiResetArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE }, -// { &gEfiStatusCodeRuntimeProtocolGuid, (VOID **)&gStatusCode, NULL, NULL, FALSE }, { &gEfiRealTimeClockArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE }, { NULL, (VOID **)NULL, NULL, NULL, FALSE } }; @@ -65,7 +65,7 @@ Arguments: Returns: EFI_SUCCESS - All AP services are available - EFI_NOT_FOUND - At least one AP service is not available + EFI_NOT_FOUND - At least one AP service is not available --*/ { @@ -80,7 +80,7 @@ Returns: return EFI_SUCCESS; } - +STATIC VOID EFIAPI GenericArchProtocolNotify ( @@ -92,14 +92,14 @@ GenericArchProtocolNotify ( Routine Description: Notification event handler registered by CoreNotifyOnArchProtocolInstallation (). This notify function is registered for every architectural protocol. This handler - updates mArchProtocol[] array entry with protocol instance data and sets it's - present flag to TRUE. If any constructor is required it is executed. The EFI + updates mArchProtocol[] array entry with protocol instance data and sets it's + present flag to TRUE. If any constructor is required it is executed. The EFI System Table headers are updated. Arguments: Event - The Event that is being processed, not used. - + Context - Event Context, not used. Returns: @@ -112,21 +112,23 @@ Returns: ARCHITECTURAL_PROTOCOL_ENTRY *Entry; VOID *Protocol; BOOLEAN Found; - + LIST_ENTRY *Link; + LIST_ENTRY TempLinkNode; + Found = FALSE; for (Entry = mArchProtocols; Entry->ProtocolGuid != NULL; Entry++) { - + Status = CoreLocateProtocol (Entry->ProtocolGuid, Entry->Registration, &Protocol); if (EFI_ERROR (Status)) { continue; - } - + } + Found = TRUE; Entry->Present = TRUE; - + // // Update protocol global variable if one exists. Entry->Protocol points to a global variable - // if one exists in the DXE core for this Architectural Protocol + // if one exists in the DXE core for this Architectural Protocol // if (Entry->Protocol != NULL) { *(Entry->Protocol) = Protocol; @@ -144,6 +146,34 @@ Returns: // When runtime architectural protocol is available, updates CRC32 in the Debug Table // CoreUpdateDebugTableCrc32 (); + + // + // Update the Runtime Architectural protocol with the template that the core was + // using so there would not need to be a dependency on the Runtime AP + // + + // + // Copy all the registered Image to new gRuntime protocol + // + for (Link = gRuntimeTemplate.ImageHead.ForwardLink; Link != &gRuntimeTemplate.ImageHead; Link = TempLinkNode.ForwardLink) { + CopyMem (&TempLinkNode, Link, sizeof(LIST_ENTRY)); + InsertTailList (&gRuntime->ImageHead, Link); + } + // + // Copy all the registered Event to new gRuntime protocol + // + for (Link = gRuntimeTemplate.EventHead.ForwardLink; Link != &gRuntimeTemplate.EventHead; Link = TempLinkNode.ForwardLink) { + CopyMem (&TempLinkNode, Link, sizeof(LIST_ENTRY)); + InsertTailList (&gRuntime->EventHead, Link); + } + + // + // Clean up gRuntimeTemplate + // + gRuntimeTemplate.ImageHead.ForwardLink = &gRuntimeTemplate.ImageHead; + gRuntimeTemplate.ImageHead.BackLink = &gRuntimeTemplate.ImageHead; + gRuntimeTemplate.EventHead.ForwardLink = &gRuntimeTemplate.EventHead; + gRuntimeTemplate.EventHead.BackLink = &gRuntimeTemplate.EventHead; } } @@ -181,7 +211,7 @@ Returns: ARCHITECTURAL_PROTOCOL_ENTRY *Entry; for (Entry = mArchProtocols; Entry->ProtocolGuid != NULL; Entry++) { - + // // Create the event // @@ -198,8 +228,8 @@ Returns: // Register for protocol notifactions on this event // Status = CoreRegisterProtocolNotify ( - Entry->ProtocolGuid, - Entry->Event, + Entry->ProtocolGuid, + Entry->Event, &Entry->Registration ); ASSERT_EFI_ERROR(Status); @@ -225,6 +255,7 @@ static const GUID_TO_STRING_PROTOCOL_ENTRY MissingProtocols[] = { { &gEfiRuntimeArchProtocolGuid, (CHAR16 *)L"Runtime" }, { &gEfiVariableArchProtocolGuid, (CHAR16 *)L"Variable" }, { &gEfiVariableWriteArchProtocolGuid, (CHAR16 *)L"Variable Write" }, + { &gEfiCapsuleArchProtocolGuid, (CHAR16 *)L"Capsule" }, { &gEfiMonotonicCounterArchProtocolGuid, (CHAR16 *)L"Monotonic Counter" }, { &gEfiResetArchProtocolGuid, (CHAR16 *)L"Reset" }, // { &gEfiStatusCodeRuntimeProtocolGuid, (CHAR16 *)L"Status Code" }, @@ -262,5 +293,5 @@ Returns: } } } - } + } }