189 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*++
 | |
| 
 | |
| 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:
 | |
|   
 | |
|   RtMemoryStatusCode.c
 | |
|    
 | |
| Abstract:
 | |
| 
 | |
|   EFI lib to provide memory journal status code reporting routines.
 | |
| 
 | |
| --*/
 | |
| 
 | |
| #include <Ppi/StatusCodeMemory.h>
 | |
| 
 | |
| //
 | |
| // Global variables
 | |
| //
 | |
| PEI_STATUS_CODE_MEMORY_PPI  mStatusCodeMemoryPpi = { 0, 0, 0, 0 };
 | |
| 
 | |
| //
 | |
| // Function implementations
 | |
| //
 | |
| EFI_STATUS
 | |
| RtMemoryReportStatusCode (
 | |
|   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:
 | |
| 
 | |
|   Log a status code to a memory journal.  If no memory journal exists, 
 | |
|   we will just return.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   Same as ReportStatusCode AP
 | |
|     
 | |
| Returns:
 | |
| 
 | |
|   EFI_SUCCESS   This function always returns success
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   EFI_STATUS_CODE_ENTRY *CurrentEntry;
 | |
|   UINT32                 MaxEntry;
 | |
| 
 | |
|   //
 | |
|   // We don't care to log debug codes.
 | |
|   //
 | |
|   if ((CodeType & EFI_STATUS_CODE_TYPE_MASK) == EFI_DEBUG_CODE) {
 | |
|     return EFI_SUCCESS;
 | |
|   }
 | |
|   //
 | |
|   // Update the latest entry in the journal.
 | |
|   //
 | |
|   MaxEntry = mStatusCodeMemoryPpi.Length / sizeof (EFI_STATUS_CODE_ENTRY);
 | |
|   if (!MaxEntry) {
 | |
|     //
 | |
|     // If we don't have any entries, then we can return.
 | |
|     // This effectively means that no memory buffer was passed forward from PEI.
 | |
|     //
 | |
|     return EFI_SUCCESS;
 | |
|   }
 | |
| 
 | |
|   CurrentEntry = (EFI_STATUS_CODE_ENTRY *) (UINTN) (mStatusCodeMemoryPpi.Address + (mStatusCodeMemoryPpi.LastEntry * sizeof (EFI_STATUS_CODE_ENTRY)));
 | |
| 
 | |
|   mStatusCodeMemoryPpi.LastEntry = (mStatusCodeMemoryPpi.LastEntry + 1) % MaxEntry;
 | |
|   if (mStatusCodeMemoryPpi.LastEntry == mStatusCodeMemoryPpi.FirstEntry) {
 | |
|     mStatusCodeMemoryPpi.FirstEntry = (mStatusCodeMemoryPpi.FirstEntry + 1) % MaxEntry;
 | |
|   }
 | |
| 
 | |
|   CurrentEntry->Type      = CodeType;
 | |
|   CurrentEntry->Value     = Value;
 | |
|   CurrentEntry->Instance  = Instance;
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| VOID
 | |
| RtMemoryStatusCodeInitialize (
 | |
|   VOID
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Initialization routine.
 | |
|   Allocates heap space for storing Status Codes.
 | |
|   Installs a PPI to point to that heap space.
 | |
|   Installs a callback to switch to memory.
 | |
|   Installs a callback to 
 | |
| 
 | |
| Arguments: 
 | |
| 
 | |
|   (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)
 | |
| 
 | |
| Returns: 
 | |
| 
 | |
|   None
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   EFI_HOB_GUID_TYPE           *GuidHob;
 | |
|   PEI_STATUS_CODE_MEMORY_PPI  **StatusCodeMemoryPpi;
 | |
| 
 | |
|   GuidHob = GetFirstGuidHob (&gPeiStatusCodeMemoryPpiGuid);
 | |
|   if (GuidHob == NULL) {
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   StatusCodeMemoryPpi = GET_GUID_HOB_DATA (GuidHob);
 | |
| 
 | |
|   //
 | |
|   // Copy data to our structure since the HOB will go away at runtime
 | |
|   //
 | |
|   // BUGBUG: Virtualize for RT
 | |
|   //
 | |
|   mStatusCodeMemoryPpi.FirstEntry = (*StatusCodeMemoryPpi)->FirstEntry;
 | |
|   mStatusCodeMemoryPpi.LastEntry  = (*StatusCodeMemoryPpi)->LastEntry;
 | |
|   mStatusCodeMemoryPpi.Address    = (*StatusCodeMemoryPpi)->Address;
 | |
|   mStatusCodeMemoryPpi.Length     = (*StatusCodeMemoryPpi)->Length;
 | |
| }
 | |
| 
 | |
| VOID
 | |
| PlaybackStatusCodes (
 | |
|   IN EFI_REPORT_STATUS_CODE   ReportStatusCodeFunc
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Call the input ReportStatusCode function with every status code recorded in
 | |
|   the journal.
 | |
| 
 | |
| Arguments: 
 | |
| 
 | |
|   ReportStatusCode    ReportStatusCode function to call.
 | |
| 
 | |
| Returns: 
 | |
| 
 | |
|   None
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   UINTN                 MaxEntry;
 | |
|   EFI_STATUS_CODE_ENTRY *CurrentEntry;
 | |
|   UINTN                 Counter;
 | |
| 
 | |
|   if (ReportStatusCodeFunc == RtMemoryReportStatusCode) {
 | |
|     return ;
 | |
|   }
 | |
|   //
 | |
|   // Playback prior status codes to current listeners
 | |
|   //
 | |
|   MaxEntry = mStatusCodeMemoryPpi.Length / sizeof (EFI_STATUS_CODE_ENTRY);
 | |
|   for (Counter = mStatusCodeMemoryPpi.FirstEntry; Counter != mStatusCodeMemoryPpi.LastEntry; Counter++) {
 | |
|     //
 | |
|     // Check if we have to roll back to beginning of queue buffer
 | |
|     //
 | |
|     if (Counter == MaxEntry) {
 | |
|       Counter = 0;
 | |
|     }
 | |
|     //
 | |
|     // Play current entry
 | |
|     //
 | |
|     CurrentEntry = (EFI_STATUS_CODE_ENTRY *) (UINTN) (mStatusCodeMemoryPpi.Address + (Counter * sizeof (EFI_STATUS_CODE_ENTRY)));
 | |
|     ReportStatusCodeFunc (
 | |
|       CurrentEntry->Type,
 | |
|       CurrentEntry->Value,
 | |
|       CurrentEntry->Instance,
 | |
|       NULL,
 | |
|       NULL
 | |
|       );
 | |
|   }
 | |
| }
 |