3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. 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.
18 EFI lib to provide memory journal status code reporting routines.
22 #include <Ppi/StatusCodeMemory.h>
27 PEI_STATUS_CODE_MEMORY_PPI mStatusCodeMemoryPpi
= { 0, 0, 0, 0 };
30 // Function implementations
33 RtMemoryReportStatusCode (
34 IN EFI_STATUS_CODE_TYPE CodeType
,
35 IN EFI_STATUS_CODE_VALUE Value
,
37 IN EFI_GUID
* CallerId
,
38 IN EFI_STATUS_CODE_DATA
* Data OPTIONAL
44 Log a status code to a memory journal. If no memory journal exists,
49 Same as ReportStatusCode AP
53 EFI_SUCCESS This function always returns success
57 EFI_STATUS_CODE_ENTRY
*CurrentEntry
;
61 // We don't care to log debug codes.
63 if ((CodeType
& EFI_STATUS_CODE_TYPE_MASK
) == EFI_DEBUG_CODE
) {
67 // Update the latest entry in the journal.
69 MaxEntry
= mStatusCodeMemoryPpi
.Length
/ sizeof (EFI_STATUS_CODE_ENTRY
);
72 // If we don't have any entries, then we can return.
73 // This effectively means that no memory buffer was passed forward from PEI.
78 CurrentEntry
= (EFI_STATUS_CODE_ENTRY
*) (UINTN
) (mStatusCodeMemoryPpi
.Address
+ (mStatusCodeMemoryPpi
.LastEntry
* sizeof (EFI_STATUS_CODE_ENTRY
)));
80 mStatusCodeMemoryPpi
.LastEntry
= (mStatusCodeMemoryPpi
.LastEntry
+ 1) % MaxEntry
;
81 if (mStatusCodeMemoryPpi
.LastEntry
== mStatusCodeMemoryPpi
.FirstEntry
) {
82 mStatusCodeMemoryPpi
.FirstEntry
= (mStatusCodeMemoryPpi
.FirstEntry
+ 1) % MaxEntry
;
85 CurrentEntry
->Type
= CodeType
;
86 CurrentEntry
->Value
= Value
;
87 CurrentEntry
->Instance
= Instance
;
93 RtMemoryStatusCodeInitialize (
100 Initialization routine.
101 Allocates heap space for storing Status Codes.
102 Installs a PPI to point to that heap space.
103 Installs a callback to switch to memory.
104 Installs a callback to
108 (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)
116 EFI_HOB_GUID_TYPE
*GuidHob
;
117 PEI_STATUS_CODE_MEMORY_PPI
**StatusCodeMemoryPpi
;
119 GuidHob
= GetFirstGuidHob (&gPeiStatusCodeMemoryPpiGuid
);
120 if (GuidHob
== NULL
) {
124 StatusCodeMemoryPpi
= GET_GUID_HOB_DATA (GuidHob
);
127 // Copy data to our structure since the HOB will go away at runtime
129 // BUGBUG: Virtualize for RT
131 mStatusCodeMemoryPpi
.FirstEntry
= (*StatusCodeMemoryPpi
)->FirstEntry
;
132 mStatusCodeMemoryPpi
.LastEntry
= (*StatusCodeMemoryPpi
)->LastEntry
;
133 mStatusCodeMemoryPpi
.Address
= (*StatusCodeMemoryPpi
)->Address
;
134 mStatusCodeMemoryPpi
.Length
= (*StatusCodeMemoryPpi
)->Length
;
138 PlaybackStatusCodes (
139 IN EFI_REPORT_STATUS_CODE ReportStatusCodeFunc
145 Call the input ReportStatusCode function with every status code recorded in
150 ReportStatusCode ReportStatusCode function to call.
159 EFI_STATUS_CODE_ENTRY
*CurrentEntry
;
162 if (ReportStatusCodeFunc
== RtMemoryReportStatusCode
) {
166 // Playback prior status codes to current listeners
168 MaxEntry
= mStatusCodeMemoryPpi
.Length
/ sizeof (EFI_STATUS_CODE_ENTRY
);
169 for (Counter
= mStatusCodeMemoryPpi
.FirstEntry
; Counter
!= mStatusCodeMemoryPpi
.LastEntry
; Counter
++) {
171 // Check if we have to roll back to beginning of queue buffer
173 if (Counter
== MaxEntry
) {
177 // Play current entry
179 CurrentEntry
= (EFI_STATUS_CODE_ENTRY
*) (UINTN
) (mStatusCodeMemoryPpi
.Address
+ (Counter
* sizeof (EFI_STATUS_CODE_ENTRY
)));
180 ReportStatusCodeFunc (
183 CurrentEntry
->Instance
,