X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FCore%2FDxe%2FDxeMain%2FDxeProtocolNotify.c;h=8f389d02b49ce73738159129b6fe6f61ff21c39c;hp=53f3b3be9bfb9b684d7098cb1b8035ef4a86f5e5;hb=abb234751e4fbe58afc5e7c7e203db2a93aac0f8;hpb=a537f1483c1312f9a937b7ec854396170006ff8d diff --git a/EdkModulePkg/Core/Dxe/DxeMain/DxeProtocolNotify.c b/EdkModulePkg/Core/Dxe/DxeMain/DxeProtocolNotify.c index 53f3b3be9b..8f389d02b4 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,23 +43,9 @@ ARCHITECTURAL_PROTOCOL_ENTRY mArchProtocols[] = { { &gEfiRuntimeArchProtocolGuid, (VOID **)&gRuntime, NULL, NULL, FALSE }, { &gEfiVariableArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE }, { &gEfiVariableWriteArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE }, -#if (EFI_SPECIFICATION_VERSION >= 0x00020000) - // - // UEFI 2.0 added support for Capsule services. DXE CIS ??? Added support for this AP - // { &gEfiCapsuleArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE}, -#endif { &gEfiMonotonicCounterArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE }, { &gEfiResetArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE }, -#if ((EDK_RELEASE_VERSION != 0) && (EFI_SPECIFICATION_VERSION < 0x00020000)) - // - // The ReportStatusCode Runtime service is in conflict with the UEFI 2.0 specificaiton - // Thus gEfiStatusCodeRuntimeProtocolGuid becomes a normal protocol in UEFI 2.0 systems - // It is only included if the EFI 1.10 with Tiano extensions is enabled for backward - // compatability - // - { &gEfiStatusCodeRuntimeProtocolGuid, (VOID **)&gStatusCode, NULL, NULL, FALSE }, -#endif { &gEfiRealTimeClockArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE }, { NULL, (VOID **)NULL, NULL, NULL, FALSE } }; @@ -79,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 --*/ { @@ -94,7 +80,7 @@ Returns: return EFI_SUCCESS; } - +STATIC VOID EFIAPI GenericArchProtocolNotify ( @@ -106,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: @@ -126,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; @@ -158,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; } } @@ -165,10 +181,10 @@ Returns: // It's over kill to do them all every time, but it saves a lot of code. // if (Found) { - CalculateEfiHdrCrc (&gRT->Hdr); - CalculateEfiHdrCrc (&gBS->Hdr); - CalculateEfiHdrCrc (&gST->Hdr); - CalculateEfiHdrCrc (&gDS->Hdr); + CalculateEfiHdrCrc (&gDxeCoreRT->Hdr); + CalculateEfiHdrCrc (&gDxeCoreBS->Hdr); + CalculateEfiHdrCrc (&gDxeCoreST->Hdr); + CalculateEfiHdrCrc (&gDxeCoreDS->Hdr); } } @@ -195,7 +211,7 @@ Returns: ARCHITECTURAL_PROTOCOL_ENTRY *Entry; for (Entry = mArchProtocols; Entry->ProtocolGuid != NULL; Entry++) { - + // // Create the event // @@ -212,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); @@ -239,9 +255,7 @@ static const GUID_TO_STRING_PROTOCOL_ENTRY MissingProtocols[] = { { &gEfiRuntimeArchProtocolGuid, (CHAR16 *)L"Runtime" }, { &gEfiVariableArchProtocolGuid, (CHAR16 *)L"Variable" }, { &gEfiVariableWriteArchProtocolGuid, (CHAR16 *)L"Variable Write" }, - #if (EFI_SPECIFICATION_VERSION >= 0x00020000) { &gEfiCapsuleArchProtocolGuid, (CHAR16 *)L"Capsule" }, - #endif { &gEfiMonotonicCounterArchProtocolGuid, (CHAR16 *)L"Monotonic Counter" }, { &gEfiResetArchProtocolGuid, (CHAR16 *)L"Reset" }, // { &gEfiStatusCodeRuntimeProtocolGuid, (CHAR16 *)L"Status Code" }, @@ -279,5 +293,5 @@ Returns: } } } - } + } }