From 53f491d32630b4f9a7f370b12a738929e9c64e0c Mon Sep 17 00:00:00 2001 From: zliu3 Date: Wed, 29 Nov 2006 13:29:14 +0000 Subject: [PATCH] Added the StatusCode protocol installation for the IPF architecture; removed the CapsuleArchProtocol checking for the IPF architecture git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2036 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Core/Dxe/DxeMain/DxeProtocolNotify.c | 50 ++--- .../StatusCode/Dxe/Ipf/DxeStatusCodeIpf.c | 188 ++++++++++++++++-- 2 files changed, 194 insertions(+), 44 deletions(-) diff --git a/EdkModulePkg/Core/Dxe/DxeMain/DxeProtocolNotify.c b/EdkModulePkg/Core/Dxe/DxeMain/DxeProtocolNotify.c index 53f3b3be9b..0ceb82d2c2 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, 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. --*/ @@ -44,10 +44,12 @@ ARCHITECTURAL_PROTOCOL_ENTRY mArchProtocols[] = { { &gEfiVariableArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE }, { &gEfiVariableWriteArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE }, #if (EFI_SPECIFICATION_VERSION >= 0x00020000) +#ifndef MDE_CPU_IPF // // UEFI 2.0 added support for Capsule services. DXE CIS ??? Added support for this AP // { &gEfiCapsuleArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE}, +#endif #endif { &gEfiMonotonicCounterArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE }, { &gEfiResetArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE }, @@ -79,7 +81,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 --*/ { @@ -106,14 +108,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 +128,21 @@ Returns: ARCHITECTURAL_PROTOCOL_ENTRY *Entry; VOID *Protocol; BOOLEAN Found; - + 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; @@ -195,7 +197,7 @@ Returns: ARCHITECTURAL_PROTOCOL_ENTRY *Entry; for (Entry = mArchProtocols; Entry->ProtocolGuid != NULL; Entry++) { - + // // Create the event // @@ -212,8 +214,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); @@ -279,5 +281,5 @@ Returns: } } } - } + } } diff --git a/EdkModulePkg/Universal/StatusCode/Dxe/Ipf/DxeStatusCodeIpf.c b/EdkModulePkg/Universal/StatusCode/Dxe/Ipf/DxeStatusCodeIpf.c index 614ad5094e..506a2a1a91 100644 --- a/EdkModulePkg/Universal/StatusCode/Dxe/Ipf/DxeStatusCodeIpf.c +++ b/EdkModulePkg/Universal/StatusCode/Dxe/Ipf/DxeStatusCodeIpf.c @@ -1,14 +1,14 @@ /** @file * Status code driver for IPF architecture. - 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, 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: DxeStatusCodeIpf.c @@ -17,17 +17,152 @@ #include "DxeStatusCode.h" +/** + Report status code to all supported device. + Calls into the workers which dispatches the platform specific + listeners. + + @param Type Indicates the type of status code being reported. + The type EFI_STATUS_CODE_TYPE is defined in "Related Definitions" below. + @param Value Describes the current status of a hardware or software entity. + This includes information about the class and subclass that is used to classify the entity + as well as an operation. For progress codes, the operation is the current activity. + For error codes, it is the exception. For debug codes, it is not defined at this time. + Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below. + Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification. + @param Instance The enumeration of a hardware or software entity within the system. + A system may contain multiple entities that match a class/subclass pairing. + The instance differentiates between them. An instance of 0 indicates that instance + information is unavailable, not meaningful, or not relevant. Valid instance numbers start with 1. + @param CallerId This optional parameter may be used to identify the caller. + This parameter allows the status code driver to apply different rules to different callers. + @param Data This optional parameter may be used to pass additional data. + Type EFI_STATUS_CODE_DATA is defined in "Related Definitions" below. + The contents of this data type may have additional GUID-specific data. The standard GUIDs and + their associated data structures are defined in the Intel? Platform Innovation Framework for EFI Status Codes Specification. + + @return Always return EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +ReportDispatcher ( + IN EFI_STATUS_CODE_TYPE Type, + IN EFI_STATUS_CODE_VALUE Value, + IN UINT32 Instance, + IN EFI_GUID *CallerId OPTIONAL, + IN EFI_STATUS_CODE_DATA *Data OPTIONAL + ); + +// +// Declaration of status code protocol. +// +STATIC +EFI_STATUS_CODE_PROTOCOL mEfiStatusCodeProtocol = { + ReportDispatcher +}; + // -// Delaration of DXE status code controller +// Delaration of DXE status code controller // DXE_STATUS_CODE_CONTROLLER gDxeStatusCode = { // - // Initialize nest status as non nested. - // + // Initialize nest status as non nested. + // 0, {NULL, NULL} }; +/** + Report status code to all supported device. + Calls into the workers which dispatches the platform specific + listeners. + + @param CodeType Indicates the type of status code being reported. + The type EFI_STATUS_CODE_TYPE is defined in "Related Definitions" below. + @param Value Describes the current status of a hardware or software entity. + This includes information about the class and subclass that is used to classify the entity + as well as an operation. For progress codes, the operation is the current activity. + For error codes, it is the exception. For debug codes, it is not defined at this time. + Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below. + Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification. + @param Instance The enumeration of a hardware or software entity within the system. + A system may contain multiple entities that match a class/subclass pairing. + The instance differentiates between them. An instance of 0 indicates that instance + information is unavailable, not meaningful, or not relevant. Valid instance numbers start with 1. + @param CallerId This optional parameter may be used to identify the caller. + This parameter allows the status code driver to apply different rules to different callers. + @param Data This optional parameter may be used to pass additional data. + Type EFI_STATUS_CODE_DATA is defined in "Related Definitions" below. + The contents of this data type may have additional GUID-specific data. The standard GUIDs and + their associated data structures are defined in the Intel? Platform Innovation Framework for EFI Status Codes Specification. + + @return Always return EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +ReportDispatcher ( + IN EFI_STATUS_CODE_TYPE CodeType, + IN EFI_STATUS_CODE_VALUE Value, + IN UINT32 Instance, + IN EFI_GUID *CallerId OPTIONAL, + IN EFI_STATUS_CODE_DATA *Data OPTIONAL + ) +{ + // + // Use atom operation to avoid the reentant of report. + // If current status is not zero, then the function is reentrancy. + // + if (1 == InterlockedCompareExchange32 (&gDxeStatusCode.StatusCodeNestStatus, 0, 1)) { + return EFI_DEVICE_ERROR; + } + + if (FeaturePcdGet (PcdStatusCodeUseEfiSerial) || FeaturePcdGet (PcdStatusCodeUseHardSerial)) { + SerialStatusCodeReportWorker ( + CodeType, + Value, + Instance, + CallerId, + Data + ); + } + if (FeaturePcdGet (PcdStatusCodeUseRuntimeMemory)) { + RtMemoryStatusCodeReportWorker ( + gDxeStatusCode.RtMemoryStatusCodeTable[PHYSICAL_MODE], + CodeType, + Value, + Instance + ); + } + if (FeaturePcdGet (PcdStatusCodeUseDataHub)) { + DataHubStatusCodeReportWorker ( + CodeType, + Value, + Instance, + CallerId, + Data + ); + } + if (FeaturePcdGet (PcdStatusCodeUseOEM)) { + OemHookStatusCodeReport ( + CodeType, + Value, + Instance, + CallerId, + Data + ); + } + + // + // Restore the nest status of report + // + InterlockedCompareExchange32 (&gDxeStatusCode.StatusCodeNestStatus, 1, 0); + + return EFI_SUCCESS; +} + + /** Main entry for Extended SAL ReportStatusCode Services @@ -35,15 +170,15 @@ DXE_STATUS_CODE_CONTROLLER gDxeStatusCode = { @param FunctionId Function Id which needed to be called @param Arg2 Efi status code type @param Arg3 Efi status code value - @param Arg4 Instance number + @param Arg4 Instance number @param Arg5 Caller Id @param Arg6 Efi status code data - @param Arg7 Not used - @param Arg8 Not used - @param ExtendedSalProc Esal Proc pointer + @param Arg7 Not used + @param Arg8 Not used + @param ExtendedSalProc Esal Proc pointer @param VirtualMode If this function is called in virtual mode @param Global This module's global variable pointer - + @return Value returned in SAL_RETURN_REGS --*/ @@ -150,19 +285,32 @@ DxeStatusCodeDriverEntry ( IN EFI_SYSTEM_TABLE *SystemTable ) { - EFI_STATUS Status; + EFI_STATUS Status; + EFI_HANDLE Handle = NULL; // // Dispatch initialization request to supported devices // InitializationDispatcherWorker (); + // + // Install Status Code Architectural Protocol implementation as defined in Tiano + // Architecture Specification. + // + Status = gBS->InstallMultipleProtocolInterfaces ( + &Handle, + &gEfiStatusCodeRuntimeProtocolGuid, + &mEfiStatusCodeProtocol, + NULL + ); + ASSERT_EFI_ERROR (Status); + // // Initialize ESAL capabilities. // Status = RegisterEsalClass ( &gEfiExtendedSalStatusCodeServicesProtocolGuid, - &gDxeStatusCode, + &gDxeStatusCode, ReportEsalServiceEntry, StatusCode, NULL @@ -174,7 +322,7 @@ DxeStatusCodeDriverEntry ( /** - Virtual address change notification call back. It converts physical mode global pointer to + Virtual address change notification call back. It converts physical mode global pointer to virtual mode. @param Event Event whose notification function is being invoked. @@ -189,7 +337,7 @@ VirtualAddressChangeCallBack ( IN VOID *Context ) { - gDxeStatusCode.RtMemoryStatusCodeTable[VIRTUAL_MODE] = + gDxeStatusCode.RtMemoryStatusCodeTable[VIRTUAL_MODE] = gDxeStatusCode.RtMemoryStatusCodeTable[PHYSICAL_MODE]; // -- 2.39.2