/*++ | |
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: | |
RtPlatformStatusCode.c | |
Abstract: | |
Contains NT32 specific implementations required to use status codes. | |
--*/ | |
// | |
// Statements that include other files. | |
// | |
#include "Tiano.h" | |
#include "EfiCommonLib.h" | |
#include "EfiRuntimeLib.h" | |
#include "EfiStatusCode.h" | |
#include "EfiHobLib.h" | |
#include "RtMemoryStatusCodeLib.h" | |
#include "BsDataHubStatusCodeLib.h" | |
// | |
// Consumed protocols | |
// | |
#include EFI_ARCH_PROTOCOL_CONSUMER (StatusCode) | |
// | |
// GUID definitions | |
// | |
#include EFI_GUID_DEFINITION (Hob) | |
// | |
// Globals only work at BootService Time. NOT at Runtime! | |
// | |
EFI_REPORT_STATUS_CODE mPeiReportStatusCode; | |
// | |
// Function implementations | |
// | |
EFI_STATUS | |
EFIAPI | |
RtPlatformReportStatusCode ( | |
IN EFI_STATUS_CODE_TYPE CodeType, | |
IN EFI_STATUS_CODE_VALUE Value, | |
IN UINT32 Instance, | |
IN EFI_GUID * CallerId, | |
IN EFI_STATUS_CODE_DATA * Data OPTIONAL | |
) | |
/*++ | |
Routine Description: | |
Call all status code listeners in the MonoStatusCode. | |
Arguments: | |
Same as ReportStatusCode service | |
Returns: | |
EFI_SUCCESS Always returns success. | |
--*/ | |
{ | |
RtMemoryReportStatusCode (CodeType, Value, Instance, CallerId, Data); | |
if (EfiAtRuntime ()) { | |
// | |
// For now all we do is post code at runtime | |
// | |
return EFI_SUCCESS; | |
} | |
BsDataHubReportStatusCode (CodeType, Value, Instance, CallerId, Data); | |
// | |
// Call back into PEI to get status codes. This is because SecMain contains | |
// status code that reports to Win32. | |
// | |
if (mPeiReportStatusCode != NULL) { | |
return mPeiReportStatusCode (CodeType, Value, Instance, CallerId, Data); | |
} | |
return EFI_SUCCESS; | |
} | |
VOID | |
EFIAPI | |
RtPlatformInitializeStatusCode ( | |
IN EFI_HANDLE ImageHandle, | |
IN EFI_SYSTEM_TABLE *SystemTable | |
) | |
/*++ | |
Routine Description: | |
Initialize the status code listeners. | |
Arguments: | |
(Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT) | |
Returns: | |
None | |
--*/ | |
{ | |
EFI_STATUS Status; | |
VOID *HobList; | |
VOID *Pointer; | |
RtMemoryInitializeStatusCode (ImageHandle, SystemTable); | |
BsDataHubInitializeStatusCode (ImageHandle, SystemTable); | |
// | |
// Play any prior status codes to the data hub. | |
// | |
PlaybackStatusCodes (BsDataHubReportStatusCode); | |
// | |
// If PEI has a ReportStatusCode callback find it and use it before StdErr | |
// is connected. | |
// | |
mPeiReportStatusCode = NULL; | |
Status = EfiLibGetSystemConfigurationTable (&gEfiHobListGuid, &HobList); | |
if (!EFI_ERROR (Status)) { | |
Status = GetNextGuidHob (&HobList, &gEfiStatusCodeRuntimeProtocolGuid, &Pointer, NULL); | |
if (!EFI_ERROR (Status)) { | |
mPeiReportStatusCode = (EFI_REPORT_STATUS_CODE) (*(UINTN *) Pointer); | |
} | |
} | |
} |