3 Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
21 #include "EfiDriverLib.h"
23 #include EFI_PROTOCOL_DEFINITION (DevicePath)
24 #include EFI_GUID_DEFINITION (Hob)
25 #include EFI_GUID_DEFINITION (StatusCodeDataTypeId)
26 #include EFI_ARCH_PROTOCOL_DEFINITION (StatusCode)
28 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
30 EFI_REPORT_STATUS_CODE gReportStatusCode
= NULL
;
40 EFI_STATUS_CODE_PROTOCOL
*StatusCode
;
42 Status
= gBS
->LocateProtocol (&gEfiStatusCodeRuntimeProtocolGuid
, NULL
, (VOID
**) &StatusCode
);
43 if (!EFI_ERROR (Status
)) {
44 gReportStatusCode
= StatusCode
->ReportStatusCode
;
50 IN EFI_GUID
*ProtocolGuid
,
57 Searches for a Protocol Interface passed from PEI through a HOB
61 ProtocolGuid - The Protocol GUID to search for in the HOB List
62 Interface - A pointer to the interface for the Protocol GUID
66 EFI_SUCCESS - The Protocol GUID was found and its interface is returned in Interface
67 EFI_NOT_FOUND - The Protocol GUID was not found in the HOB List
72 EFI_PEI_HOB_POINTERS GuidHob
;
77 Status
= EfiLibGetSystemConfigurationTable (&gEfiHobListGuid
, (VOID
**) &GuidHob
.Raw
);
78 if (EFI_ERROR (Status
)) {
82 for (Status
= EFI_NOT_FOUND
; EFI_ERROR (Status
);) {
83 if (END_OF_HOB_LIST (GuidHob
)) {
84 Status
= EFI_NOT_FOUND
;
88 if (GET_HOB_TYPE (GuidHob
) == EFI_HOB_TYPE_GUID_EXTENSION
) {
89 if (EfiCompareGuid (ProtocolGuid
, &GuidHob
.Guid
->Name
)) {
91 *Interface
= (VOID
*) *(UINTN
*) ((UINT8
*) (&GuidHob
.Guid
->Name
) + sizeof (EFI_GUID
));
95 GuidHob
.Raw
= GET_NEXT_HOB (GuidHob
);
104 EfiLibReportStatusCode (
105 IN EFI_STATUS_CODE_TYPE Type
,
106 IN EFI_STATUS_CODE_VALUE Value
,
108 IN EFI_GUID
*CallerId OPTIONAL
,
109 IN EFI_STATUS_CODE_DATA
*Data OPTIONAL
115 Report device path through status code.
121 Instance - Instance number
122 CallerId - Caller name
123 DevicePath - Device path that to be reported
129 EFI_OUT_OF_RESOURCES - No enough buffer could be allocated
135 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)
136 if (gReportStatusCode
== NULL
) {
138 // Because we've installed the protocol notification on EfiStatusCodeRuntimeProtocol,
139 // running here indicates that the StatusCode driver has not started yet.
143 // Running here only when StatusCode driver never starts.
145 return EFI_UNSUPPORTED
;
149 // Try to get the PEI version of ReportStatusCode.
151 Status
= GetPeiProtocol (&gEfiStatusCodeRuntimeProtocolGuid
, (VOID
**) &gReportStatusCode
);
152 if (EFI_ERROR (Status
) || (gReportStatusCode
== NULL
)) {
153 return EFI_UNSUPPORTED
;
156 Status
= gReportStatusCode (Type
, Value
, Instance
, CallerId
, Data
);
159 return EFI_UNSUPPORTED
;
162 // Check whether EFI_RUNTIME_SERVICES has Tiano Extension
164 Status
= EFI_UNSUPPORTED
;
165 if (gRT
->Hdr
.Revision
== EFI_SPECIFICATION_VERSION
&&
166 gRT
->Hdr
.HeaderSize
== sizeof (EFI_RUNTIME_SERVICES
) &&
167 gRT
->ReportStatusCode
!= NULL
) {
168 Status
= gRT
->ReportStatusCode (Type
, Value
, Instance
, CallerId
, Data
);
175 ReportStatusCodeWithDevicePath (
176 IN EFI_STATUS_CODE_TYPE Type
,
177 IN EFI_STATUS_CODE_VALUE Value
,
179 IN EFI_GUID
* CallerId OPTIONAL
,
180 IN EFI_DEVICE_PATH_PROTOCOL
* DevicePath
186 Report device path through status code.
192 Instance - Instance number
193 CallerId - Caller name
194 DevicePath - Device path that to be reported
200 EFI_OUT_OF_RESOURCES - No enough buffer could be allocated
205 UINT16 DevicePathSize
;
206 EFI_STATUS_CODE_DATA
*ExtendedData
;
207 EFI_DEVICE_PATH_PROTOCOL
*ExtendedDevicePath
;
210 DevicePathSize
= (UINT16
) EfiDevicePathSize (DevicePath
);
211 Size
= (UINT16
) (DevicePathSize
+ sizeof (EFI_STATUS_CODE_DATA
));
212 ExtendedData
= (EFI_STATUS_CODE_DATA
*) EfiLibAllocatePool (Size
);
213 if (ExtendedData
== NULL
) {
214 return EFI_OUT_OF_RESOURCES
;
217 ExtendedDevicePath
= EfiConstructStatusCodeData (Size
, &gEfiStatusCodeSpecificDataGuid
, ExtendedData
);
218 EfiCopyMem (ExtendedDevicePath
, DevicePath
, DevicePathSize
);
220 Status
= EfiLibReportStatusCode (Type
, Value
, Instance
, CallerId
, (EFI_STATUS_CODE_DATA
*) ExtendedData
);
222 gBS
->FreePool (ExtendedData
);