]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeSupport.c
Add SmmRuntimeDxeReportStatusCodeLibFramework in IntelFrameworkModulePkg, which suppo...
[mirror_edk2.git] / IntelFrameworkModulePkg / Library / DxeReportStatusCodeLibFramework / DxeSupport.c
CommitLineData
e5516b49 1/** @file\r
2 Report Status Code Library for DXE Phase.\r
3\r
4 Copyright (c) 2006 - 2007, Intel Corporation<BR>\r
5 All rights reserved. This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "ReportStatusCodeLibInternal.h"\r
16\r
17/**\r
18 Locatet he report status code service.\r
19\r
20 @return EFI_REPORT_STATUS_CODE function point to\r
21 ReportStatusCode.\r
22**/\r
23EFI_REPORT_STATUS_CODE\r
24InternalGetReportStatusCode (\r
25 VOID\r
26 )\r
27{\r
28 EFI_STATUS_CODE_PROTOCOL *StatusCodeProtocol;\r
29 EFI_STATUS Status;\r
30\r
31 if (gRT->Hdr.Revision < 0x20000) {\r
32 return ((FRAMEWORK_EFI_RUNTIME_SERVICES*)gRT)->ReportStatusCode;\r
33 } else if (gBS != NULL) {\r
34 Status = gBS->LocateProtocol (&gEfiStatusCodeRuntimeProtocolGuid, NULL, (VOID**)&StatusCodeProtocol);\r
35 if (!EFI_ERROR (Status) && StatusCodeProtocol != NULL) {\r
36 return StatusCodeProtocol->ReportStatusCode;\r
37 }\r
38 }\r
39\r
40 return NULL;\r
41}\r
42\r
43\r
44EFI_STATUS\r
45EFIAPI\r
46InternalReportStatusCodeEx (\r
47 IN EFI_STATUS_CODE_TYPE Type,\r
48 IN EFI_STATUS_CODE_VALUE Value,\r
49 IN UINT32 Instance,\r
50 IN CONST EFI_GUID *CallerId OPTIONAL,\r
51 IN CONST EFI_GUID *ExtendedDataGuid OPTIONAL,\r
52 IN CONST VOID *ExtendedData OPTIONAL,\r
53 IN UINTN ExtendedDataSize\r
54 )\r
55{\r
56 EFI_STATUS Status;\r
57 EFI_STATUS_CODE_DATA *StatusCodeData;\r
58\r
59 ASSERT (!((ExtendedData == NULL) && (ExtendedDataSize != 0)));\r
60 ASSERT (!((ExtendedData != NULL) && (ExtendedDataSize == 0)));\r
61\r
62 if (gBS == NULL) {\r
63 return EFI_UNSUPPORTED;\r
64 }\r
65\r
66 //\r
67 // Allocate space for the Status Code Header and its buffer\r
68 //\r
69 StatusCodeData = NULL;\r
70 gBS->AllocatePool (EfiBootServicesData, sizeof (EFI_STATUS_CODE_DATA) + ExtendedDataSize, (VOID **)&StatusCodeData);\r
71 if (StatusCodeData == NULL) {\r
72 return EFI_OUT_OF_RESOURCES;\r
73 }\r
74\r
75 //\r
76 // Fill in the extended data header\r
77 //\r
78 StatusCodeData->HeaderSize = sizeof (EFI_STATUS_CODE_DATA);\r
79 StatusCodeData->Size = (UINT16)ExtendedDataSize;\r
80 if (ExtendedDataGuid == NULL) {\r
81 ExtendedDataGuid = &gEfiStatusCodeSpecificDataGuid;\r
82 }\r
83 CopyGuid (&StatusCodeData->Type, ExtendedDataGuid);\r
84\r
85 //\r
86 // Fill in the extended data buffer\r
87 //\r
88 CopyMem (StatusCodeData + 1, ExtendedData, ExtendedDataSize);\r
89\r
90 //\r
91 // Report the status code\r
92 //\r
93 if (CallerId == NULL) {\r
94 CallerId = &gEfiCallerIdGuid;\r
95 }\r
96 Status = InternalReportStatusCode (Type, Value, Instance, CallerId, StatusCodeData);\r
97\r
98 //\r
99 // Free the allocated buffer\r
100 //\r
101 gBS->FreePool (StatusCodeData);\r
102\r
103 return Status;\r
104}\r
105\r