From 53f491d32630b4f9a7f370b12a738929e9c64e0c Mon Sep 17 00:00:00 2001 From: zliu3 Date: Wed, 29 Nov 2006 13:29:14 +0000 Subject: 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 --- .../StatusCode/Dxe/Ipf/DxeStatusCodeIpf.c | 188 ++++++++++++++++++--- 1 file changed, 168 insertions(+), 20 deletions(-) (limited to 'EdkModulePkg/Universal/StatusCode') 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]; // -- cgit v1.2.3