From e5516b494a21cc8ca59dec0a2754f1c1ed31bb7e Mon Sep 17 00:00:00 2001 From: yshang1 Date: Mon, 21 Jan 2008 08:25:17 +0000 Subject: Add SmmRuntimeDxeReportStatusCodeLibFramework in IntelFrameworkModulePkg, which supports log message in SMM, DXE, DXE runtime, UEFI and UEFI APPLICATION. In SMM, it logs message to customized OemHookStatusCodeLib. In DXE/DXE_RUNTIME/UEFI/UEFI_APP, it logs message to ReportStatusCode() in framework runtime services table or runtime report status code protocol. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4591 6f19259b-4bc3-4df7-8a09-765794883524 --- .../DxeReportStatusCodeLib.inf | 1 + .../DxeReportStatusCodeLibFramework/DxeSupport.c | 105 ++++++++++++++++ .../ReportStatusCodeLib.c | 100 ++++----------- .../ReportStatusCodeLibInternal.h | 134 +++++++++++++++++++++ 4 files changed, 262 insertions(+), 78 deletions(-) create mode 100644 IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeSupport.c create mode 100644 IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/ReportStatusCodeLibInternal.h (limited to 'IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework') diff --git a/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf b/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf index 8983f3f2e6..1788f0201c 100644 --- a/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf +++ b/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf @@ -33,6 +33,7 @@ [Sources.common] ReportStatusCodeLib.c + DxeSupport.c diff --git a/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeSupport.c b/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeSupport.c new file mode 100644 index 0000000000..7c9a62f49e --- /dev/null +++ b/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeSupport.c @@ -0,0 +1,105 @@ +/** @file + Report Status Code Library for DXE Phase. + + 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. + +**/ + +#include "ReportStatusCodeLibInternal.h" + +/** + Locatet he report status code service. + + @return EFI_REPORT_STATUS_CODE function point to + ReportStatusCode. +**/ +EFI_REPORT_STATUS_CODE +InternalGetReportStatusCode ( + VOID + ) +{ + EFI_STATUS_CODE_PROTOCOL *StatusCodeProtocol; + EFI_STATUS Status; + + if (gRT->Hdr.Revision < 0x20000) { + return ((FRAMEWORK_EFI_RUNTIME_SERVICES*)gRT)->ReportStatusCode; + } else if (gBS != NULL) { + Status = gBS->LocateProtocol (&gEfiStatusCodeRuntimeProtocolGuid, NULL, (VOID**)&StatusCodeProtocol); + if (!EFI_ERROR (Status) && StatusCodeProtocol != NULL) { + return StatusCodeProtocol->ReportStatusCode; + } + } + + return NULL; +} + + +EFI_STATUS +EFIAPI +InternalReportStatusCodeEx ( + IN EFI_STATUS_CODE_TYPE Type, + IN EFI_STATUS_CODE_VALUE Value, + IN UINT32 Instance, + IN CONST EFI_GUID *CallerId OPTIONAL, + IN CONST EFI_GUID *ExtendedDataGuid OPTIONAL, + IN CONST VOID *ExtendedData OPTIONAL, + IN UINTN ExtendedDataSize + ) +{ + EFI_STATUS Status; + EFI_STATUS_CODE_DATA *StatusCodeData; + + ASSERT (!((ExtendedData == NULL) && (ExtendedDataSize != 0))); + ASSERT (!((ExtendedData != NULL) && (ExtendedDataSize == 0))); + + if (gBS == NULL) { + return EFI_UNSUPPORTED; + } + + // + // Allocate space for the Status Code Header and its buffer + // + StatusCodeData = NULL; + gBS->AllocatePool (EfiBootServicesData, sizeof (EFI_STATUS_CODE_DATA) + ExtendedDataSize, (VOID **)&StatusCodeData); + if (StatusCodeData == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // + // Fill in the extended data header + // + StatusCodeData->HeaderSize = sizeof (EFI_STATUS_CODE_DATA); + StatusCodeData->Size = (UINT16)ExtendedDataSize; + if (ExtendedDataGuid == NULL) { + ExtendedDataGuid = &gEfiStatusCodeSpecificDataGuid; + } + CopyGuid (&StatusCodeData->Type, ExtendedDataGuid); + + // + // Fill in the extended data buffer + // + CopyMem (StatusCodeData + 1, ExtendedData, ExtendedDataSize); + + // + // Report the status code + // + if (CallerId == NULL) { + CallerId = &gEfiCallerIdGuid; + } + Status = InternalReportStatusCode (Type, Value, Instance, CallerId, StatusCodeData); + + // + // Free the allocated buffer + // + gBS->FreePool (StatusCodeData); + + return Status; +} + diff --git a/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/ReportStatusCodeLib.c b/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/ReportStatusCodeLib.c index 325d9a607d..d4f0daddc4 100644 --- a/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/ReportStatusCodeLib.c +++ b/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/ReportStatusCodeLib.c @@ -12,21 +12,11 @@ **/ +#include "ReportStatusCodeLibInternal.h" -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include + +EFI_REPORT_STATUS_CODE mReportStatusCode = NULL; /** Internal worker function that reports a status code through the Status Code Protocol @@ -51,7 +41,6 @@ @retval EFI_UNSUPPORTED Status Code Protocol is not available. **/ -STATIC EFI_STATUS InternalReportStatusCode ( IN EFI_STATUS_CODE_TYPE Type, @@ -61,24 +50,13 @@ InternalReportStatusCode ( IN EFI_STATUS_CODE_DATA *Data OPTIONAL ) { - EFI_STATUS Status; - EFI_STATUS_CODE_PROTOCOL *StatusCode; - STATIC EFI_REPORT_STATUS_CODE ReportStatusCode = NULL; - // // If gStatusCode is NULL, then see if a Status Code Protocol instance is present // in the handle database. // - if (ReportStatusCode == NULL) { - if (gBS == NULL) { - return EFI_UNSUPPORTED; - } - Status = gBS->LocateProtocol (&gEfiStatusCodeRuntimeProtocolGuid, NULL, (VOID**)&StatusCode); - if (!EFI_ERROR (Status) && StatusCode != NULL) { - ReportStatusCode = StatusCode->ReportStatusCode; - } else if (gRT->Hdr.Revision < 0x20000) { - ReportStatusCode = ((FRAMEWORK_EFI_RUNTIME_SERVICES*)gRT)->ReportStatusCode; - } else { + if (mReportStatusCode == NULL) { + mReportStatusCode = InternalGetReportStatusCode (); + if (mReportStatusCode == NULL) { return EFI_UNSUPPORTED; } } @@ -87,7 +65,7 @@ InternalReportStatusCode ( // A Status Code Protocol is present in the handle database, so pass in all the // parameters to the ReportStatusCode() service of the Status Code Protocol // - return (*ReportStatusCode) (Type, Value, Instance, (EFI_GUID *)CallerId, Data); + return (*mReportStatusCode) (Type, Value, Instance, (EFI_GUID *)CallerId, Data); } @@ -451,9 +429,10 @@ ReportStatusCodeWithExtendedData ( an instance specified by Instance and a caller ID specified by CallerId. If CallerId is NULL, then a caller ID of gEfiCallerIdGuid is used. - ReportStatusCodeEx()must actively prevent recursion. If ReportStatusCodeEx() - is called while processing another any other Report Status Code Library function, - then ReportStatusCodeEx() must return EFI_DEVICE_ERROR immediately. + ReportStatusCodeEx()must actively prevent recursion. If + ReportStatusCodeEx() is called while processing another any + other Report Status Code Library function, then + ReportStatusCodeEx() must return EFI_DEVICE_ERROR immediately. If ExtendedData is NULL and ExtendedDataSize is not zero, then ASSERT(). If ExtendedData is not NULL and ExtendedDataSize is zero, then ASSERT(). @@ -490,52 +469,17 @@ ReportStatusCodeEx ( IN UINTN ExtendedDataSize ) { - EFI_STATUS Status; - EFI_STATUS_CODE_DATA *StatusCodeData; - - ASSERT (!((ExtendedData == NULL) && (ExtendedDataSize != 0))); - ASSERT (!((ExtendedData != NULL) && (ExtendedDataSize == 0))); - - if (gBS == NULL) { - return EFI_UNSUPPORTED; - } - - // - // Allocate space for the Status Code Header and its buffer - // - StatusCodeData = NULL; - gBS->AllocatePool (EfiBootServicesData, sizeof (EFI_STATUS_CODE_DATA) + ExtendedDataSize, (VOID **)&StatusCodeData); - if (StatusCodeData == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - // - // Fill in the extended data header - // - StatusCodeData->HeaderSize = sizeof (EFI_STATUS_CODE_DATA); - StatusCodeData->Size = (UINT16)ExtendedDataSize; - if (ExtendedDataGuid == NULL) { - ExtendedDataGuid = &gEfiStatusCodeSpecificDataGuid; - } - CopyGuid (&StatusCodeData->Type, ExtendedDataGuid); - - // - // Fill in the extended data buffer - // - CopyMem (StatusCodeData + 1, ExtendedData, ExtendedDataSize); - - // - // Report the status code - // - if (CallerId == NULL) { - CallerId = &gEfiCallerIdGuid; - } - Status = InternalReportStatusCode (Type, Value, Instance, CallerId, StatusCodeData); - - // - // Free the allocated buffer - // - gBS->FreePool (StatusCodeData); + EFI_STATUS Status; + + Status = InternalReportStatusCodeEx ( + Type, + Value, + Instance, + CallerId, + ExtendedDataGuid, + ExtendedData, + ExtendedDataSize + ); return Status; } diff --git a/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/ReportStatusCodeLibInternal.h b/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/ReportStatusCodeLibInternal.h new file mode 100644 index 0000000000..d2dc4c615e --- /dev/null +++ b/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/ReportStatusCodeLibInternal.h @@ -0,0 +1,134 @@ +/** @file + Internal Header file of Report Status Code Library for RUNTIME + DXE Phase. + + 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. + +**/ +#ifndef __REPORT_STATUS_CODE_LIB_INTERNAL__H +#define __REPORT_STATUS_CODE_LIB_INTERNAL__H + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + + +/** + Locatet he report status code service. + + @return EFI_REPORT_STATUS_CODE function point to + ReportStatusCode. +**/ +EFI_REPORT_STATUS_CODE +InternalGetReportStatusCode ( + VOID + ); + +/** + Internal worker function that reports a status code through the Status Code Protocol + + This function checks to see if a Status Code Protocol is present in the handle + database. If a Status Code Protocol is not present, then EFI_UNSUPPORTED is + returned. If a Status Code Protocol is present, then it is cached in gStatusCode, + and the ReportStatusCode() service of the Status Code Protocol is called passing in + Type, Value, Instance, CallerId, and Data. The result of this call is returned. + + @param Type Status code type. + @param Value Status code value. + @param Instance Status code instance number. + @param CallerId Pointer to a GUID that identifies the caller of this + function. This is an optional parameter that may be + NULL. + @param Data Pointer to the extended data buffer. This is an + optional parameter that may be NULL. + + @retval EFI_SUCCESS The status code was reported. + @retval EFI_OUT_OF_RESOURCES There were not enough resources to report the status code. + @retval EFI_UNSUPPORTED Status Code Protocol is not available. + +**/ +EFI_STATUS +InternalReportStatusCode ( + IN EFI_STATUS_CODE_TYPE Type, + IN EFI_STATUS_CODE_VALUE Value, + IN UINT32 Instance, + IN CONST EFI_GUID *CallerId OPTIONAL, + IN EFI_STATUS_CODE_DATA *Data OPTIONAL + ); + +/** + Reports a status code with full parameters. + + The function reports a status code. If ExtendedData is NULL and ExtendedDataSize + is 0, then an extended data buffer is not reported. If ExtendedData is not + NULL and ExtendedDataSize is not 0, then an extended data buffer is allocated. + ExtendedData is assumed not have the standard status code header, so this function + is responsible for allocating a buffer large enough for the standard header and + the extended data passed into this function. The standard header is filled in + with a GUID specified by ExtendedDataGuid. If ExtendedDataGuid is NULL, then a + GUID of gEfiStatusCodeSpecificDatauid is used. The status code is reported with + an instance specified by Instance and a caller ID specified by CallerId. If + CallerId is NULL, then a caller ID of gEfiCallerIdGuid is used. + + ReportStatusCodeEx()must actively prevent recursion. If ReportStatusCodeEx() + is called while processing another any other Report Status Code Library function, + then ReportStatusCodeEx() must return EFI_DEVICE_ERROR immediately. + + If ExtendedData is NULL and ExtendedDataSize is not zero, then ASSERT(). + If ExtendedData is not NULL and ExtendedDataSize is zero, then ASSERT(). + + @param Type Status code type. + @param Value Status code value. + @param Instance Status code instance number. + @param CallerId Pointer to a GUID that identifies the caller of this + function. If this parameter is NULL, then a caller + ID of gEfiCallerIdGuid is used. + @param ExtendedDataGuid Pointer to the GUID for the extended data buffer. + If this parameter is NULL, then a the status code + standard header is filled in with + gEfiStatusCodeSpecificDataGuid. + @param ExtendedData Pointer to the extended data buffer. This is an + optional parameter that may be NULL. + @param ExtendedDataSize The size, in bytes, of the extended data buffer. + + @retval EFI_SUCCESS The status code was reported. + @retval EFI_OUT_OF_RESOURCES There were not enough resources to allocate + the extended data section if it was specified. + @retval EFI_UNSUPPORTED Report status code is not supported + +**/ +EFI_STATUS +EFIAPI +InternalReportStatusCodeEx ( + IN EFI_STATUS_CODE_TYPE Type, + IN EFI_STATUS_CODE_VALUE Value, + IN UINT32 Instance, + IN CONST EFI_GUID *CallerId OPTIONAL, + IN CONST EFI_GUID *ExtendedDataGuid OPTIONAL, + IN CONST VOID *ExtendedData OPTIONAL, + IN UINTN ExtendedDataSize + ); + +extern EFI_REPORT_STATUS_CODE mReportStatusCode; + +#endif // __REPORT_STATUS_CODE_LIB_INTERNAL__H + -- cgit v1.2.3