mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-31 03:03:46 +01:00 
			
		
		
		
	Code Scrub for Status Code Runtime Dxe driver.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8178 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
		
							parent
							
								
									27e87dab26
								
							
						
					
					
						commit
						a8cbf34506
					
				| @ -1,7 +1,7 @@ | ||||
| /** @file
 | ||||
|   Data Hub status code worker in DXE. | ||||
|   Data Hub status code worker. | ||||
| 
 | ||||
|   Copyright (c) 2006, Intel Corporation | ||||
|   Copyright (c) 2006 - 2009, 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 | ||||
| @ -28,12 +28,14 @@ EFI_DATA_HUB_PROTOCOL     *mDataHubProtocol; | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Return one DATAHUB_STATUSCODE_RECORD space. | ||||
|   The size of free record pool would be extend, if the pool is empty. | ||||
|   Retrieve one record of from free record buffer. This record is removed from | ||||
|   free record buffer. | ||||
| 
 | ||||
|   This function retrieves one record from free record buffer. | ||||
|   If the pool has been exhausted, then new memory would be allocated for it. | ||||
| 
 | ||||
|   @retval  NULL   Can not allocate free memeory for record. | ||||
|   @retval  !NULL  Point to buffer of record. | ||||
|   @return  Pointer to the free record. | ||||
|            NULL means failure to allocate new memeory for free record buffer. | ||||
| 
 | ||||
| **/ | ||||
| DATA_HUB_STATUS_CODE_DATA_RECORD * | ||||
| @ -49,6 +51,9 @@ AcquireRecordBuffer ( | ||||
|   CurrentTpl = gBS->RaiseTPL (TPL_HIGH_LEVEL); | ||||
| 
 | ||||
|   if (!IsListEmpty (&mRecordsBuffer)) { | ||||
|     //
 | ||||
|     // Strip one entry from free record buffer.
 | ||||
|     //
 | ||||
|     Node = GetFirstNode (&mRecordsBuffer); | ||||
|     RemoveEntryList (Node); | ||||
| 
 | ||||
| @ -62,13 +67,20 @@ AcquireRecordBuffer ( | ||||
|       return NULL; | ||||
|     } | ||||
| 
 | ||||
|     //
 | ||||
|     // If free record buffer is exhausted, then allocate 16 new records for it.
 | ||||
|     //
 | ||||
|     gBS->RestoreTPL (CurrentTpl); | ||||
|     Record   = (DATAHUB_STATUSCODE_RECORD *) AllocateZeroPool (sizeof (DATAHUB_STATUSCODE_RECORD) * 16); | ||||
|     if (NULL == Record) { | ||||
|     if (Record == NULL) { | ||||
|       return NULL; | ||||
|     } | ||||
| 
 | ||||
|     CurrentTpl = gBS->RaiseTPL (TPL_HIGH_LEVEL); | ||||
|     //
 | ||||
|     // Here we only insert 15 new records to the free record buffer, for the first record
 | ||||
|     // will be returned immediately.
 | ||||
|     //
 | ||||
|     for (Index = 1; Index < 16; Index++) { | ||||
|       InsertTailList (&mRecordsBuffer, &Record[Index].Node); | ||||
|     } | ||||
| @ -84,11 +96,10 @@ AcquireRecordBuffer ( | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Retrieve one record from Records FIFO. The record would be removed from FIFO and | ||||
|   release to free record buffer. | ||||
|   Retrieve one record from Records FIFO. The record would be removed from FIFO. | ||||
| 
 | ||||
|   @return   !NULL   Point to record, which is ready to be logged. | ||||
|   @return   NULL    the FIFO of record is empty. | ||||
|   @return   Point to record, which is ready to be logged. | ||||
|             NULL means the FIFO of record is empty. | ||||
| 
 | ||||
| **/ | ||||
| DATA_HUB_STATUS_CODE_DATA_RECORD * | ||||
| @ -96,17 +107,19 @@ RetrieveRecord ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   DATA_HUB_STATUS_CODE_DATA_RECORD  *RecordData = NULL; | ||||
|   DATA_HUB_STATUS_CODE_DATA_RECORD  *RecordData; | ||||
|   DATAHUB_STATUSCODE_RECORD         *Record; | ||||
|   LIST_ENTRY                        *Node; | ||||
|   EFI_TPL                           CurrentTpl; | ||||
| 
 | ||||
|   RecordData = NULL; | ||||
| 
 | ||||
|   CurrentTpl = gBS->RaiseTPL (TPL_HIGH_LEVEL); | ||||
| 
 | ||||
|   if (!IsListEmpty (&mRecordsFifo)) { | ||||
|     Node = GetFirstNode (&mRecordsFifo); | ||||
|     Record = CR (Node, DATAHUB_STATUSCODE_RECORD, Node, DATAHUB_STATUS_CODE_SIGNATURE); | ||||
|     ASSERT (NULL != Record); | ||||
|     ASSERT (Record != NULL); | ||||
| 
 | ||||
|     RemoveEntryList (&Record->Node); | ||||
|     RecordData = (DATA_HUB_STATUS_CODE_DATA_RECORD *) Record->Data; | ||||
| @ -118,10 +131,9 @@ RetrieveRecord ( | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   Release Records to FIFO. | ||||
|   Release given record and return it to free record buffer. | ||||
|    | ||||
|   @param RecordData  Point to the record buffer allocated | ||||
|                      from AcquireRecordBuffer. | ||||
|   @param RecordData  Pointer to the record to release. | ||||
| 
 | ||||
| **/ | ||||
| VOID | ||||
| @ -133,7 +145,7 @@ ReleaseRecord ( | ||||
|   EFI_TPL                           CurrentTpl; | ||||
| 
 | ||||
|   Record = CR (RecordData, DATAHUB_STATUSCODE_RECORD, Data[0], DATAHUB_STATUS_CODE_SIGNATURE); | ||||
|   ASSERT (NULL != Record); | ||||
|   ASSERT (Record != NULL); | ||||
| 
 | ||||
|   CurrentTpl = gBS->RaiseTPL (TPL_HIGH_LEVEL); | ||||
| 
 | ||||
| @ -143,36 +155,24 @@ ReleaseRecord ( | ||||
|   gBS->RestoreTPL (CurrentTpl); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Report status code into DataHub. | ||||
| 
 | ||||
|   @param  CodeType      Indicates the type of status code being reported.  Type EFI_STATUS_CODE_TYPE is defined in "Related Definitions" below. | ||||
| 
 | ||||
|   @param  CodeType             Indicates the type of status code being reported. | ||||
|   @param  Value                Describes the current status of a hardware or software entity. | ||||
|                         This included information about the class and subclass that is used to classify the entity | ||||
|                         as well as an operation.  For progress codes, the operation is the current activity. | ||||
|                         For error codes, it is the exception.  For debug codes, it is not defined at this time. | ||||
|                         Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below. | ||||
|                         Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification. | ||||
| 
 | ||||
|   @param  Instance      The enumeration of a hardware or software entity within the system. | ||||
|                         A system may contain multiple entities that match a class/subclass pairing. | ||||
|                         The instance differentiates between them.  An instance of 0 indicates that instance information is unavailable, | ||||
|                         not meaningful, or not relevant.  Valid instance numbers start with 1. | ||||
| 
 | ||||
| 
 | ||||
|                                This included information about the class and subclass that is used to | ||||
|                                classify the entity as well as an operation. | ||||
|   @param  Instance             The enumeration of a hardware or software entity within | ||||
|                                the system. Valid instance numbers start with 1. | ||||
|   @param  CallerId             This optional parameter may be used to identify the caller. | ||||
|                         This parameter allows the status code driver to apply different rules to different callers. | ||||
|                         Type EFI_GUID is defined in InstallProtocolInterface() in the UEFI 2.0 Specification. | ||||
|                                This parameter allows the status code driver to apply different rules to | ||||
|                                different callers. | ||||
|   @param  Data                 This optional parameter may be used to pass additional data. | ||||
| 
 | ||||
| 
 | ||||
|   @param  Data          This optional parameter may be used to pass additional data | ||||
| 
 | ||||
|   @retval EFI_OUT_OF_RESOURCES   Can not acquire record buffer. | ||||
|   @retval EFI_DEVICE_ERROR       EFI serial device can not work after ExitBootService() is called . | ||||
|   @retval EFI_SUCCESS            Success to cache status code and signal log data event. | ||||
|   @retval EFI_SUCCESS          The function completed successfully. | ||||
|   @retval EFI_DEVICE_ERROR     Function is reentered. | ||||
|   @retval EFI_DEVICE_ERROR     Function is called at runtime. | ||||
|   @retval EFI_OUT_OF_RESOURCES Fail to allocate memory for free record buffer. | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| @ -190,12 +190,11 @@ DataHubStatusCodeReportWorker ( | ||||
|   CHAR8                             *Format; | ||||
|   UINTN                             CharCount; | ||||
| 
 | ||||
| 
 | ||||
|   //
 | ||||
|   // Use atom operation to avoid the reentant of report.
 | ||||
|   // If current status is not zero, then the function is reentrancy.
 | ||||
|   //
 | ||||
|   if (1 == InterlockedCompareExchange32 (&mLogDataHubStatus, 0, 0)) { | ||||
|   if (InterlockedCompareExchange32 (&mLogDataHubStatus, 0, 0) == 1) { | ||||
|     return EFI_DEVICE_ERROR; | ||||
|   } | ||||
| 
 | ||||
| @ -234,7 +233,7 @@ DataHubStatusCodeReportWorker ( | ||||
|                     Marker | ||||
|                     ); | ||||
|       //
 | ||||
|       // Change record data type from DebugType to String Type.
 | ||||
|       // Change record data type to DebugType.
 | ||||
|       //
 | ||||
|       CopyGuid (&Record->Data.Type, &gEfiStatusCodeDataTypeDebugGuid); | ||||
|       Record->Data.HeaderSize = Data->HeaderSize; | ||||
| @ -281,7 +280,7 @@ LogDataHubEventCallBack ( | ||||
|   // Use atom operation to avoid the reentant of report.
 | ||||
|   // If current status is not zero, then the function is reentrancy.
 | ||||
|   //
 | ||||
|   if (1 == InterlockedCompareExchange32 (&mLogDataHubStatus, 0, 1)) { | ||||
|   if (InterlockedCompareExchange32 (&mLogDataHubStatus, 0, 1) == 1) { | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
| @ -289,7 +288,10 @@ LogDataHubEventCallBack ( | ||||
|   // Log DataRecord in Data Hub.
 | ||||
|   // Journal records fifo to find all record entry.
 | ||||
|   //
 | ||||
|   while (1) { | ||||
|   while (TRUE) { | ||||
|     //
 | ||||
|     // Retrieve record from record FIFO until no more record can be retrieved.
 | ||||
|     //
 | ||||
|     Record = RetrieveRecord (); | ||||
|     if (Record == NULL) { | ||||
|       break; | ||||
| @ -318,7 +320,6 @@ LogDataHubEventCallBack ( | ||||
|     //
 | ||||
|     // Log DataRecord in Data Hub
 | ||||
|     //
 | ||||
| 
 | ||||
|     mDataHubProtocol->LogData ( | ||||
|                         mDataHubProtocol, | ||||
|                         &gEfiDataHubStatusCodeRecordGuid, | ||||
| @ -339,10 +340,10 @@ LogDataHubEventCallBack ( | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Initialize data hubstatus code. | ||||
|   Create a data hub listener. | ||||
|   Locate Data Hub Protocol and create event for logging data | ||||
|   as initialization for data hub status code worker. | ||||
| 
 | ||||
|   @return  The function always return EFI_SUCCESS | ||||
|   @retval EFI_SUCCESS  Initialization is successful. | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
|  | ||||
| @ -13,7 +13,7 @@ | ||||
|   DXE       -> This driver | ||||
|   RT        -> This driver | ||||
| 
 | ||||
|   Copyright (c) 2006, Intel Corporation                                                          | ||||
|   Copyright (c) 2006 - 2009, 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         | ||||
| @ -27,7 +27,6 @@ | ||||
| #include "DxeStatusCode.h" | ||||
| 
 | ||||
| /**
 | ||||
|    | ||||
|   Dispatch initialization request to sub status code devices based on  | ||||
|   customized feature flags. | ||||
|   | ||||
| @ -41,7 +40,7 @@ InitializationDispatcherWorker ( | ||||
|   EFI_STATUS                        Status; | ||||
|   MEMORY_STATUSCODE_PACKET_HEADER   *PacketHeader; | ||||
|   MEMORY_STATUSCODE_RECORD          *Record; | ||||
|   UINTN                             ExpectedPacketIndex = 0; | ||||
|   UINTN                             ExpectedPacketIndex; | ||||
|   UINTN                             Index; | ||||
|   VOID                              *HobStart; | ||||
| 
 | ||||
| @ -55,6 +54,9 @@ InitializationDispatcherWorker ( | ||||
|     ASSERT_EFI_ERROR (Status); | ||||
|   } | ||||
|   if (FeaturePcdGet (PcdStatusCodeUseHardSerial)) { | ||||
|     //
 | ||||
|     // Call Serial Port Lib API to initialize serial port.
 | ||||
|     //
 | ||||
|     Status = SerialPortInitialize (); | ||||
|     ASSERT_EFI_ERROR (Status); | ||||
|   } | ||||
| @ -67,18 +69,22 @@ InitializationDispatcherWorker ( | ||||
|     ASSERT_EFI_ERROR (Status); | ||||
|   } | ||||
|   if (FeaturePcdGet (PcdStatusCodeUseOEM)) { | ||||
|     //
 | ||||
|     // Call OEM hook status code library API to initialize OEM device for status code.
 | ||||
|     //
 | ||||
|     Status = OemHookStatusCodeInitialize (); | ||||
|     ASSERT_EFI_ERROR (Status); | ||||
|   } | ||||
| 
 | ||||
|   //
 | ||||
|   // Replay Status code which saved in GUID'ed HOB to all supported device. 
 | ||||
|   // Replay Status code which saved in GUID'ed HOB to all supported devices. 
 | ||||
|   //
 | ||||
| 
 | ||||
|   // 
 | ||||
|   // Journal GUID'ed HOBs to find all record entry, if found, 
 | ||||
|   // then output record to support replay device.
 | ||||
|   //
 | ||||
|   ExpectedPacketIndex = 0; | ||||
|   Hob.Raw   = GetFirstGuidHob (&gMemoryStatusCodeRecordGuid); | ||||
|   HobStart  = Hob.Raw; | ||||
|   while (Hob.Raw != NULL) { | ||||
| @ -103,7 +109,6 @@ InitializationDispatcherWorker ( | ||||
|         if (FeaturePcdGet (PcdStatusCodeReplayInRuntimeMemory) && | ||||
|             FeaturePcdGet (PcdStatusCodeUseRuntimeMemory)) { | ||||
|           RtMemoryStatusCodeReportWorker ( | ||||
|             gDxeStatusCode.RtMemoryStatusCodeTable[PHYSICAL_MODE], | ||||
|             Record[Index].CodeType, | ||||
|             Record[Index].Value, | ||||
|             Record[Index].Instance | ||||
| @ -121,6 +126,9 @@ InitializationDispatcherWorker ( | ||||
|         } | ||||
|         if (FeaturePcdGet (PcdStatusCodeReplayInOEM) && | ||||
|             FeaturePcdGet (PcdStatusCodeUseOEM)) { | ||||
|           //
 | ||||
|           // Call OEM hook status code library API to report status code to OEM device
 | ||||
|           //
 | ||||
|           OemHookStatusCodeReport ( | ||||
|             Record[Index].CodeType, | ||||
|             Record[Index].Value, | ||||
| @ -135,7 +143,7 @@ InitializationDispatcherWorker ( | ||||
|       //
 | ||||
|       // See whether there is gap of packet or not
 | ||||
|       //
 | ||||
|       if (NULL != HobStart) { | ||||
|       if (HobStart != NULL) { | ||||
|         HobStart  = NULL; | ||||
|         Hob.Raw   = HobStart; | ||||
|         continue; | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| /** @file
 | ||||
|   Internal include file of Status Code Runtime DXE Driver. | ||||
| 
 | ||||
|   Copyright (c) 2006, Intel Corporation | ||||
|   Copyright (c) 2006 - 2009, 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 | ||||
| @ -11,8 +12,8 @@ | ||||
| 
 | ||||
| **/ | ||||
| 
 | ||||
| #ifndef __DXE_STATUS_CODE_H__ | ||||
| #define __DXE_STATUS_CODE_H__ | ||||
| #ifndef __STATUS_CODE_RUNTIME_DXE_H__ | ||||
| #define __STATUS_CODE_RUNTIME_DXE_H__ | ||||
| 
 | ||||
| 
 | ||||
| #include <FrameworkDxe.h> | ||||
| @ -44,25 +45,11 @@ | ||||
| //
 | ||||
| // Data hub worker definition
 | ||||
| //
 | ||||
| #define MAX_NUMBER_DATAHUB_RECORDS                1000 | ||||
| #define DATAHUB_BYTES_PER_RECORD                  EFI_STATUS_CODE_DATA_MAX_SIZE | ||||
| #define EMPTY_RECORD_TAG                          0xFF | ||||
| #define DATAHUB_STATUS_CODE_SIGNATURE             SIGNATURE_32 ('B', 'D', 'H', 'S') | ||||
| 
 | ||||
| //
 | ||||
| // Address type of pointer.
 | ||||
| // The point type always equal to PHYSICAL_MODE on IA32/X64/EBC architecture
 | ||||
| // Otherwise, VIRTUAL_MODE/PHYSICAL_MODE would be used on Ipf architecture,
 | ||||
| //
 | ||||
| typedef enum { | ||||
|   PHYSICAL_MODE, | ||||
|   VIRTUAL_MODE | ||||
| } PROCESSOR_MODE; | ||||
| 
 | ||||
| typedef struct { | ||||
|   UINTN       Signature; | ||||
|   LIST_ENTRY  Node; | ||||
| 
 | ||||
|   UINT8       Data[sizeof(DATA_HUB_STATUS_CODE_DATA_RECORD) + EFI_STATUS_CODE_DATA_MAX_SIZE]; | ||||
| } DATAHUB_STATUSCODE_RECORD; | ||||
| 
 | ||||
| @ -76,22 +63,40 @@ typedef struct { | ||||
|   UINT32   MaxRecordsNumber; | ||||
| } RUNTIME_MEMORY_STATUSCODE_HEADER; | ||||
| 
 | ||||
| 
 | ||||
| typedef struct { | ||||
|   //
 | ||||
|   // Report operation nest status.
 | ||||
|   // If it is set, then the report operation has nested.
 | ||||
|   //
 | ||||
|   UINT32                            StatusCodeNestStatus; | ||||
|   //
 | ||||
|   // Runtime status code management header, the records buffer is following it.
 | ||||
|   //
 | ||||
|   RUNTIME_MEMORY_STATUSCODE_HEADER  *RtMemoryStatusCodeTable[2]; | ||||
| } DXE_STATUS_CODE_CONTROLLER; | ||||
| 
 | ||||
| extern RUNTIME_MEMORY_STATUSCODE_HEADER  *mRtMemoryStatusCodeTable; | ||||
| 
 | ||||
| /**
 | ||||
|   Report status code to all supported device. | ||||
| 
 | ||||
|   This function implements EFI_STATUS_CODE_PROTOCOL.ReportStatusCode(). | ||||
|   It calls into the workers which dispatches the platform specific listeners. | ||||
| 
 | ||||
|   @param  Type             Indicates the type of status code being reported. | ||||
|   @param  Value            Describes the current status of a hardware or software entity. | ||||
|                            This included information about the class and subclass that is used to | ||||
|                            classify the entity as well as an operation. | ||||
|   @param  Instance         The enumeration of a hardware or software entity within | ||||
|                            the system. Valid instance numbers start with 1. | ||||
|   @param  CallerId         This optional parameter may be used to identify the caller. | ||||
|                            This parameter allows the status code driver to apply different rules to | ||||
|                            different callers. | ||||
|   @param  Data             This optional parameter may be used to pass additional data. | ||||
| 
 | ||||
|   @retval EFI_SUCCESS      The function completed successfully | ||||
|   @retval EFI_DEVICE_ERROR The function should not be completed due to a device error. | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| ReportDispatcher ( | ||||
|   IN EFI_STATUS_CODE_TYPE     CodeType, | ||||
|   IN EFI_STATUS_CODE_VALUE    Value, | ||||
|   IN UINT32                   Instance, | ||||
|   IN EFI_GUID                 *CallerId  OPTIONAL, | ||||
|   IN EFI_STATUS_CODE_DATA     *Data      OPTIONAL | ||||
|   ); | ||||
| 
 | ||||
| /**
 | ||||
|   Dispatch initialization request to sub status code devices based on  | ||||
|   customized feature flags. | ||||
|   | ||||
| @ -103,9 +108,9 @@ InitializationDispatcherWorker ( | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|   Initialize serial status code worker. | ||||
|   Locates Serial I/O Protocol as initialization for serial status code worker. | ||||
|   | ||||
|   @return  The function always return EFI_SUCCESS | ||||
|   @retval EFI_SUCCESS  Serial I/O Protocol is successfully located. | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| @ -117,30 +122,20 @@ EfiSerialStatusCodeInitializeWorker ( | ||||
| /**
 | ||||
|   Convert status code value and extended data to readable ASCII string, send string to serial I/O device. | ||||
|   | ||||
|   @param  CodeType      Indicates the type of status code being reported.  Type EFI_STATUS_CODE_TYPE is defined in "Related Definitions" below. | ||||
| 
 | ||||
|   @param  CodeType         Indicates the type of status code being reported. | ||||
|   @param  Value            Describes the current status of a hardware or software entity. | ||||
|                         This included information about the class and subclass that is used to classify the entity | ||||
|                         as well as an operation.  For progress codes, the operation is the current activity. | ||||
|                         For error codes, it is the exception.  For debug codes, it is not defined at this time. | ||||
|                         Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below. | ||||
|                         Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification. | ||||
| 
 | ||||
|   @param  Instance      The enumeration of a hardware or software entity within the system. | ||||
|                         A system may contain multiple entities that match a class/subclass pairing. | ||||
|                         The instance differentiates between them.  An instance of 0 indicates that instance information is unavailable, | ||||
|                         not meaningful, or not relevant.  Valid instance numbers start with 1. | ||||
| 
 | ||||
| 
 | ||||
|                            This included information about the class and subclass that is used to | ||||
|                            classify the entity as well as an operation. | ||||
|   @param  Instance         The enumeration of a hardware or software entity within | ||||
|                            the system. Valid instance numbers start with 1. | ||||
|   @param  CallerId         This optional parameter may be used to identify the caller. | ||||
|                         This parameter allows the status code driver to apply different rules to different callers. | ||||
|                         Type EFI_GUID is defined in InstallProtocolInterface() in the UEFI 2.0 Specification. | ||||
|                            This parameter allows the status code driver to apply different rules to | ||||
|                            different callers. | ||||
|   @param  Data             This optional parameter may be used to pass additional data. | ||||
| 
 | ||||
| 
 | ||||
|   @param  Data          This optional parameter may be used to pass additional data | ||||
| 
 | ||||
|   @retval EFI_SUCCESS         Success to report status code to serial I/O. | ||||
|   @retval EFI_SUCCESS      Status code reported to serial I/O successfully. | ||||
|   @retval EFI_DEVICE_ERROR EFI serial device cannot work after ExitBootService() is called. | ||||
|   @retval EFI_DEVICE_ERROR EFI serial device cannot work with TPL higher than TPL_CALLBACK. | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| @ -153,9 +148,9 @@ SerialStatusCodeReportWorker ( | ||||
|   ); | ||||
| 
 | ||||
| /**
 | ||||
|   Initialize runtime memory status code. | ||||
|   Initialize runtime memory status code table as initialization for runtime memory status code worker | ||||
|   | ||||
|   @return  The function always return EFI_SUCCESS | ||||
|   @retval EFI_SUCCESS  Runtime memory status code table successfully initialized. | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| @ -167,39 +162,31 @@ RtMemoryStatusCodeInitializeWorker ( | ||||
|   Report status code into runtime memory. If the runtime pool is full, roll back to the  | ||||
|   first record and overwrite it. | ||||
|   | ||||
|   @param  RtMemoryStatusCodeTable | ||||
|                         Point to Runtime memory table header. | ||||
| 
 | ||||
|   @param  CodeType      Indicates the type of status code being reported.  Type EFI_STATUS_CODE_TYPE is defined in "Related Definitions" below. | ||||
| 
 | ||||
|   @param  CodeType                Indicates the type of status code being reported. | ||||
|   @param  Value                   Describes the current status of a hardware or software entity. | ||||
|                         This included information about the class and subclass that is used to classify the entity | ||||
|                         as well as an operation.  For progress codes, the operation is the current activity. | ||||
|                         For error codes, it is the exception.  For debug codes, it is not defined at this time. | ||||
|                         Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below. | ||||
|                         Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification. | ||||
|                                   This included information about the class and subclass that is used to | ||||
|                                   classify the entity as well as an operation. | ||||
|   @param  Instance                The enumeration of a hardware or software entity within | ||||
|                                   the system. Valid instance numbers start with 1. | ||||
|   @param  CallerId                This optional parameter may be used to identify the caller. | ||||
|                                   This parameter allows the status code driver to apply different rules to | ||||
|                                   different callers. | ||||
|   | ||||
|   @param  Instance      The enumeration of a hardware or software entity within the system. | ||||
|                         A system may contain multiple entities that match a class/subclass pairing. | ||||
|                         The instance differentiates between them.  An instance of 0 indicates that instance information is unavailable, | ||||
|                         not meaningful, or not relevant.  Valid instance numbers start with 1. | ||||
| 
 | ||||
|   @return               The function always return EFI_SUCCESS. | ||||
|   @retval EFI_SUCCESS             Status code successfully recorded in runtime memory status code table. | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| RtMemoryStatusCodeReportWorker ( | ||||
|   RUNTIME_MEMORY_STATUSCODE_HEADER      *RtMemoryStatusCodeTable, | ||||
|   IN EFI_STATUS_CODE_TYPE               CodeType, | ||||
|   IN EFI_STATUS_CODE_VALUE              Value, | ||||
|   IN UINT32                             Instance | ||||
|   ); | ||||
| 
 | ||||
| /**
 | ||||
|   Initialize data hubstatus code. | ||||
|   Create a data hub listener. | ||||
|   Locate Data Hub Protocol and create event for logging data | ||||
|   as initialization for data hub status code worker. | ||||
| 
 | ||||
|   @return  The function always return EFI_SUCCESS | ||||
|   @retval EFI_SUCCESS  Initialization is successful. | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| @ -211,31 +198,21 @@ DataHubStatusCodeInitializeWorker ( | ||||
| /**
 | ||||
|   Report status code into DataHub. | ||||
| 
 | ||||
|   @param  CodeType      Indicates the type of status code being reported.  Type EFI_STATUS_CODE_TYPE is defined in "Related Definitions" below. | ||||
| 
 | ||||
|   @param  CodeType             Indicates the type of status code being reported. | ||||
|   @param  Value                Describes the current status of a hardware or software entity. | ||||
|                         This included information about the class and subclass that is used to classify the entity | ||||
|                         as well as an operation.  For progress codes, the operation is the current activity. | ||||
|                         For error codes, it is the exception.  For debug codes, it is not defined at this time. | ||||
|                         Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below. | ||||
|                         Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification. | ||||
| 
 | ||||
|   @param  Instance      The enumeration of a hardware or software entity within the system. | ||||
|                         A system may contain multiple entities that match a class/subclass pairing. | ||||
|                         The instance differentiates between them.  An instance of 0 indicates that instance information is unavailable, | ||||
|                         not meaningful, or not relevant.  Valid instance numbers start with 1. | ||||
| 
 | ||||
| 
 | ||||
|                                This included information about the class and subclass that is used to | ||||
|                                classify the entity as well as an operation. | ||||
|   @param  Instance             The enumeration of a hardware or software entity within | ||||
|                                the system. Valid instance numbers start with 1. | ||||
|   @param  CallerId             This optional parameter may be used to identify the caller. | ||||
|                         This parameter allows the status code driver to apply different rules to different callers. | ||||
|                         Type EFI_GUID is defined in InstallProtocolInterface() in the UEFI 2.0 Specification. | ||||
|                                This parameter allows the status code driver to apply different rules to | ||||
|                                different callers. | ||||
|   @param  Data                 This optional parameter may be used to pass additional data. | ||||
| 
 | ||||
| 
 | ||||
|   @param  Data          This optional parameter may be used to pass additional data | ||||
| 
 | ||||
|   @retval EFI_OUT_OF_RESOURCES   Can not acquire record buffer. | ||||
|   @retval EFI_DEVICE_ERROR       EFI serial device can not work after ExitBootService() is called . | ||||
|   @retval EFI_SUCCESS            Success to cache status code and signal log data event. | ||||
|   @retval EFI_SUCCESS          The function completed successfully. | ||||
|   @retval EFI_DEVICE_ERROR     Function is reentered. | ||||
|   @retval EFI_DEVICE_ERROR     Function is called at runtime. | ||||
|   @retval EFI_OUT_OF_RESOURCES Fail to allocate memory for free record buffer. | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| @ -248,9 +225,15 @@ DataHubStatusCodeReportWorker ( | ||||
|   ); | ||||
| 
 | ||||
| 
 | ||||
| //
 | ||||
| // Declaration for callback Event.
 | ||||
| //
 | ||||
| /**
 | ||||
|   Virtual address change notification call back. It converts global pointer | ||||
|   to virtual address. | ||||
| 
 | ||||
|   @param  Event         Event whose notification function is being invoked. | ||||
|   @param  Context       Pointer to the notification function's context, which is | ||||
|                         always zero in current implementation. | ||||
| 
 | ||||
| **/ | ||||
| VOID | ||||
| EFIAPI | ||||
| VirtualAddressChangeCallBack ( | ||||
| @ -258,18 +241,4 @@ VirtualAddressChangeCallBack ( | ||||
|   IN VOID       *Context | ||||
|   ); | ||||
| 
 | ||||
| //
 | ||||
| // Declaration for original Entry Point.
 | ||||
| //
 | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| DxeStatusCodeDriverEntry ( | ||||
|   IN EFI_HANDLE           ImageHandle, | ||||
|   IN EFI_SYSTEM_TABLE     *SystemTable | ||||
|   ); | ||||
| 
 | ||||
| //
 | ||||
| // declaration of DXE status code controller.
 | ||||
| //
 | ||||
| extern DXE_STATUS_CODE_CONTROLLER gDxeStatusCode; | ||||
| #endif | ||||
|  | ||||
| @ -1,9 +1,7 @@ | ||||
| #/** @file | ||||
| #  DXE status code driver. | ||||
| #  Status Code Runtime Dxe driver that supports multiple devices and produces | ||||
| #  Status Code Runtime Protocol. | ||||
| # | ||||
| #  Status Code Architectural Protocol implementation as defined in Tiano | ||||
| #  Architecture Specification. This driver has limited functionality | ||||
| #  at runtime and will not log to Data Hub at runtime. | ||||
| #  Copyright (c) 2006 - 2009, Intel Corporation. | ||||
| # | ||||
| #  All rights reserved. This program and the accompanying materials | ||||
| @ -75,15 +73,16 @@ | ||||
| 
 | ||||
| 
 | ||||
| [Guids] | ||||
|   gEfiDataHubStatusCodeRecordGuid               # SOMETIMES_CONSUMED | ||||
|   gMemoryStatusCodeRecordGuid                   # SOMETIMES_CONSUMED | ||||
|   gEfiStatusCodeDataTypeDebugGuid               # PROTOCOL ALWAYS_CONSUMED | ||||
|   gEfiEventExitBootServicesGuid | ||||
|   gEfiDataHubStatusCodeRecordGuid               ## SOMETIMES_CONSUMES (Needed if Data Hub is supported for status code.) | ||||
|   gEfiStatusCodeDataTypeDebugGuid               ## SOMETIMES_CONSUMES (Needed if Data Hub is supported for status code.) | ||||
|   gMemoryStatusCodeRecordGuid                   ## CONSUMES ## HOB | ||||
|   gEfiEventVirtualAddressChangeGuid             ## CONSUMES ## Event | ||||
| 
 | ||||
| 
 | ||||
| [Protocols] | ||||
|   gEfiStatusCodeRuntimeProtocolGuid             # PROTOCOL ALWAYS_CONSUMED | ||||
|   gEfiDataHubProtocolGuid                       # PROTOCOL ALWAYS_CONSUMED | ||||
|   gEfiSerialIoProtocolGuid                      # PROTOCOL ALWAYS_CONSUMED | ||||
|   gEfiStatusCodeRuntimeProtocolGuid             ## PRODUCES | ||||
|   gEfiDataHubProtocolGuid                       ## SOMETIMES_CONSUMES (Needed if Data Hub is supported for status code.) | ||||
|   gEfiSerialIoProtocolGuid                      ## SOMETIMES_CONSUMES (Needed if Serial is supported for status code.) | ||||
| 
 | ||||
| 
 | ||||
| [FeaturePcd.common] | ||||
|  | ||||
| @ -14,47 +14,8 @@ | ||||
| 
 | ||||
| #include "DxeStatusCode.h" | ||||
| 
 | ||||
| //
 | ||||
| // Event for Exit Boot Services Callback
 | ||||
| //
 | ||||
| EFI_EVENT mExitBootServicesEvent = NULL; | ||||
| 
 | ||||
| /**
 | ||||
|   Report status code to all supported device. | ||||
|   Calls into the workers which dispatches the platform specific | ||||
|   listeners. | ||||
| 
 | ||||
|   @param  Type          Indicates the type of status code being reported. | ||||
|                         The type EFI_STATUS_CODE_TYPE is defined in "Related Definitions" below. | ||||
|   @param  Value         Describes the current status of a hardware or software entity. | ||||
|                         This includes information about the class and subclass that is used to classify the entity | ||||
|                         as well as an operation.  For progress codes, the operation is the current activity. | ||||
|                         For error codes, it is the exception.  For debug codes, it is not defined at this time. | ||||
|                         Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below. | ||||
|                         Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification. | ||||
|   @param  Instance      The enumeration of a hardware or software entity within the system. | ||||
|                         A system may contain multiple entities that match a class/subclass pairing. | ||||
|                         The instance differentiates between them.  An instance of 0 indicates that instance | ||||
|                         information is unavailable, not meaningful, or not relevant.  Valid instance numbers start with 1. | ||||
|   @param  CallerId      This optional parameter may be used to identify the caller. | ||||
|                         This parameter allows the status code driver to apply different rules to different callers. | ||||
|   @param  Data          This optional parameter may be used to pass additional data. | ||||
|                         Type EFI_STATUS_CODE_DATA is defined in "Related Definitions" below. | ||||
|                         The contents of this data type may have additional GUID-specific data.  The standard GUIDs and | ||||
|                         their associated data structures are defined in the Intel? Platform Innovation Framework for EFI Status Codes Specification. | ||||
| 
 | ||||
|   @return               Always return EFI_SUCCESS. | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| ReportDispatcher ( | ||||
|   IN EFI_STATUS_CODE_TYPE     Type, | ||||
|   IN EFI_STATUS_CODE_VALUE    Value, | ||||
|   IN UINT32                   Instance, | ||||
|   IN EFI_GUID                 *CallerId  OPTIONAL, | ||||
|   IN EFI_STATUS_CODE_DATA     *Data      OPTIONAL | ||||
|   ); | ||||
| EFI_EVENT    mVirtualAddressChangeEvent = NULL; | ||||
| EFI_HANDLE   mHandle = NULL; | ||||
| 
 | ||||
| //
 | ||||
| // Declaration of status code protocol.
 | ||||
| @ -64,24 +25,21 @@ EFI_STATUS_CODE_PROTOCOL  mEfiStatusCodeProtocol  = { | ||||
| }; | ||||
| 
 | ||||
| //
 | ||||
| // Delaration of DXE status code controller
 | ||||
| // Report operation nest status.
 | ||||
| // If it is set, then the report operation has nested.
 | ||||
| //
 | ||||
| DXE_STATUS_CODE_CONTROLLER gDxeStatusCode = { | ||||
|   //
 | ||||
|   // Initialize nest status as non nested.
 | ||||
|   //
 | ||||
|   0, | ||||
|   {NULL, NULL} | ||||
| }; | ||||
| UINT32  mStatusCodeNestStatus = 0; | ||||
| 
 | ||||
| /**
 | ||||
|   Entry point of DXE Status Code Driver. | ||||
| 
 | ||||
|   Install the ReportStatusCode runtime service. | ||||
|   This function is the entry point of this DXE Status Code Driver. | ||||
|   It installs Status Code Runtime Protocol, and registers event for EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE. | ||||
| 
 | ||||
|   @param ImageHandle     Image handle of the loaded driver | ||||
|   @param SystemTable     Pointer to the System Table | ||||
|   @param  ImageHandle       The firmware allocated handle for the EFI image. | ||||
|   @param  SystemTable       A pointer to the EFI System Table. | ||||
|    | ||||
|   @return                The function always returns success. | ||||
|   @retval EFI_SUCCESS       The entry point is executed successfully. | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| @ -91,7 +49,6 @@ DxeStatusCodeDriverEntry ( | ||||
|   IN EFI_SYSTEM_TABLE   *SystemTable | ||||
|   ) | ||||
| { | ||||
|   EFI_HANDLE  Handle       = NULL; | ||||
|   EFI_STATUS  Status; | ||||
| 
 | ||||
|   //
 | ||||
| @ -100,11 +57,10 @@ DxeStatusCodeDriverEntry ( | ||||
|   InitializationDispatcherWorker (); | ||||
| 
 | ||||
|   //
 | ||||
|   // Install Status Code Architectural Protocol implementation as defined in Tiano
 | ||||
|   // Architecture Specification.
 | ||||
|   // Install Status Code Runtime Protocol implementation as defined in PI Specification.
 | ||||
|   //
 | ||||
|   Status = gBS->InstallMultipleProtocolInterfaces ( | ||||
|                   &Handle, | ||||
|                   &mHandle, | ||||
|                   &gEfiStatusCodeRuntimeProtocolGuid, | ||||
|                   &mEfiStatusCodeProtocol, | ||||
|                   NULL | ||||
| @ -116,39 +72,33 @@ DxeStatusCodeDriverEntry ( | ||||
|                   TPL_NOTIFY, | ||||
|                   VirtualAddressChangeCallBack, | ||||
|                   NULL, | ||||
|                   &gEfiEventExitBootServicesGuid, | ||||
|                   &mExitBootServicesEvent | ||||
|                   &gEfiEventVirtualAddressChangeGuid, | ||||
|                   &mVirtualAddressChangeEvent | ||||
|                   ); | ||||
|   ASSERT_EFI_ERROR (Status); | ||||
| 
 | ||||
|   return Status; | ||||
|   return EFI_SUCCESS; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|   Report status code to all supported device. | ||||
|   Calls into the workers which dispatches the platform specific | ||||
|   listeners. | ||||
| 
 | ||||
|   @param  CodeType      Indicates the type of status code being reported. | ||||
|                         The type EFI_STATUS_CODE_TYPE is defined in "Related Definitions" below. | ||||
|   This function implements EFI_STATUS_CODE_PROTOCOL.ReportStatusCode(). | ||||
|   It calls into the workers which dispatches the platform specific listeners. | ||||
| 
 | ||||
|   @param  Type             Indicates the type of status code being reported. | ||||
|   @param  Value            Describes the current status of a hardware or software entity. | ||||
|                         This includes information about the class and subclass that is used to classify the entity | ||||
|                         as well as an operation.  For progress codes, the operation is the current activity. | ||||
|                         For error codes, it is the exception.  For debug codes, it is not defined at this time. | ||||
|                         Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below. | ||||
|                         Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification. | ||||
|   @param  Instance      The enumeration of a hardware or software entity within the system. | ||||
|                         A system may contain multiple entities that match a class/subclass pairing. | ||||
|                         The instance differentiates between them.  An instance of 0 indicates that instance | ||||
|                         information is unavailable, not meaningful, or not relevant.  Valid instance numbers start with 1. | ||||
|                            This included information about the class and subclass that is used to | ||||
|                            classify the entity as well as an operation. | ||||
|   @param  Instance         The enumeration of a hardware or software entity within | ||||
|                            the system. Valid instance numbers start with 1. | ||||
|   @param  CallerId         This optional parameter may be used to identify the caller. | ||||
|                         This parameter allows the status code driver to apply different rules to different callers. | ||||
|                            This parameter allows the status code driver to apply different rules to | ||||
|                            different callers. | ||||
|   @param  Data             This optional parameter may be used to pass additional data. | ||||
|                         Type EFI_STATUS_CODE_DATA is defined in "Related Definitions" below. | ||||
|                         The contents of this data type may have additional GUID-specific data.  The standard GUIDs and | ||||
|                         their associated data structures are defined in the Intel? Platform Innovation Framework for EFI Status Codes Specification. | ||||
| 
 | ||||
|   @return               Always return EFI_SUCCESS. | ||||
|   @retval EFI_SUCCESS      The function completed successfully | ||||
|   @retval EFI_DEVICE_ERROR The function should not be completed due to a device error. | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| @ -165,7 +115,7 @@ ReportDispatcher ( | ||||
|   // Use atom operation to avoid the reentant of report.
 | ||||
|   // If current status is not zero, then the function is reentrancy.
 | ||||
|   //
 | ||||
|   if (1 == InterlockedCompareExchange32 (&gDxeStatusCode.StatusCodeNestStatus, 0, 1)) { | ||||
|   if (InterlockedCompareExchange32 (&mStatusCodeNestStatus, 0, 1) == 1) { | ||||
|     return EFI_DEVICE_ERROR; | ||||
|   } | ||||
| 
 | ||||
| @ -180,7 +130,6 @@ ReportDispatcher ( | ||||
|   } | ||||
|   if (FeaturePcdGet (PcdStatusCodeUseRuntimeMemory)) { | ||||
|     RtMemoryStatusCodeReportWorker ( | ||||
|       gDxeStatusCode.RtMemoryStatusCodeTable[PHYSICAL_MODE], | ||||
|       CodeType, | ||||
|       Value, | ||||
|       Instance | ||||
| @ -196,6 +145,9 @@ ReportDispatcher ( | ||||
|       ); | ||||
|   } | ||||
|   if (FeaturePcdGet (PcdStatusCodeUseOEM)) { | ||||
|     //
 | ||||
|     // Call OEM hook status code library API to report status code to OEM device
 | ||||
|     //
 | ||||
|     OemHookStatusCodeReport ( | ||||
|       CodeType, | ||||
|       Value, | ||||
| @ -208,7 +160,7 @@ ReportDispatcher ( | ||||
|   //
 | ||||
|   // Restore the nest status of report
 | ||||
|   //
 | ||||
|   InterlockedCompareExchange32 (&gDxeStatusCode.StatusCodeNestStatus, 1, 0); | ||||
|   InterlockedCompareExchange32 (&mStatusCodeNestStatus, 1, 0); | ||||
| 
 | ||||
|   return EFI_SUCCESS; | ||||
| } | ||||
| @ -235,7 +187,7 @@ VirtualAddressChangeCallBack ( | ||||
|   //
 | ||||
|   EfiConvertPointer ( | ||||
|     0, | ||||
|     (VOID **) &gDxeStatusCode.RtMemoryStatusCodeTable[PHYSICAL_MODE] | ||||
|     (VOID **) &mRtMemoryStatusCodeTable | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| /** @file
 | ||||
|   Runtime memory status code worker in DXE. | ||||
|   Runtime memory status code worker. | ||||
| 
 | ||||
|   Copyright (c) 2006, Intel Corporation                                                          | ||||
|   Copyright (c) 2006 - 2009, 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         | ||||
| @ -14,10 +14,12 @@ | ||||
| 
 | ||||
| #include "DxeStatusCode.h" | ||||
| 
 | ||||
| /**
 | ||||
|   Initialize runtime memory status code. | ||||
| RUNTIME_MEMORY_STATUSCODE_HEADER  *mRtMemoryStatusCodeTable; | ||||
| 
 | ||||
|   @return  The function always return EFI_SUCCESS | ||||
| /**
 | ||||
|   Initialize runtime memory status code table as initialization for runtime memory status code worker | ||||
|   | ||||
|   @retval EFI_SUCCESS  Runtime memory status code table successfully initialized. | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| @ -25,26 +27,21 @@ RtMemoryStatusCodeInitializeWorker ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   RUNTIME_MEMORY_STATUSCODE_HEADER  *RtMemoryStatusCodeTable; | ||||
| 
 | ||||
|   //
 | ||||
|   // Allocate runtime memory status code pool.
 | ||||
|   //
 | ||||
|   RtMemoryStatusCodeTable =  | ||||
|     (RUNTIME_MEMORY_STATUSCODE_HEADER *) AllocateRuntimePool ( | ||||
|   mRtMemoryStatusCodeTable = AllocateRuntimePool ( | ||||
|                                sizeof (RUNTIME_MEMORY_STATUSCODE_HEADER) + | ||||
|                                PcdGet16 (PcdStatusCodeRuntimeMemorySize) * | ||||
|                                1024 | ||||
|                                ); | ||||
|   ASSERT (mRtMemoryStatusCodeTable != NULL); | ||||
| 
 | ||||
|   ASSERT (NULL != RtMemoryStatusCodeTable); | ||||
| 
 | ||||
|   RtMemoryStatusCodeTable->RecordIndex                  = 0; | ||||
|   RtMemoryStatusCodeTable->NumberOfRecords              = 0; | ||||
|   RtMemoryStatusCodeTable->MaxRecordsNumber             =  | ||||
|   mRtMemoryStatusCodeTable->RecordIndex      = 0; | ||||
|   mRtMemoryStatusCodeTable->NumberOfRecords  = 0; | ||||
|   mRtMemoryStatusCodeTable->MaxRecordsNumber =  | ||||
|     (PcdGet16 (PcdStatusCodeRuntimeMemorySize) * 1024) / sizeof (MEMORY_STATUSCODE_RECORD); | ||||
| 
 | ||||
|   gDxeStatusCode.RtMemoryStatusCodeTable[PHYSICAL_MODE] = RtMemoryStatusCodeTable; | ||||
|   return EFI_SUCCESS; | ||||
| } | ||||
| 
 | ||||
| @ -53,29 +50,21 @@ RtMemoryStatusCodeInitializeWorker ( | ||||
|   Report status code into runtime memory. If the runtime pool is full, roll back to the  | ||||
|   first record and overwrite it. | ||||
|   | ||||
|   @param  RtMemoryStatusCodeTable       | ||||
|                         Point to Runtime memory table header. | ||||
| 
 | ||||
|   @param  CodeType      Indicates the type of status code being reported.  Type EFI_STATUS_CODE_TYPE is defined in "Related Definitions" below. | ||||
|   | ||||
|   @param  CodeType                Indicates the type of status code being reported. | ||||
|   @param  Value                   Describes the current status of a hardware or software entity. | ||||
|                         This included information about the class and subclass that is used to classify the entity  | ||||
|                         as well as an operation.  For progress codes, the operation is the current activity.  | ||||
|                         For error codes, it is the exception.  For debug codes, it is not defined at this time.  | ||||
|                         Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below.   | ||||
|                         Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification. | ||||
|                                   This included information about the class and subclass that is used to | ||||
|                                   classify the entity as well as an operation. | ||||
|   @param  Instance                The enumeration of a hardware or software entity within | ||||
|                                   the system. Valid instance numbers start with 1. | ||||
|   @param  CallerId                This optional parameter may be used to identify the caller. | ||||
|                                   This parameter allows the status code driver to apply different rules to | ||||
|                                   different callers. | ||||
|   | ||||
|   @param  Instance      The enumeration of a hardware or software entity within the system.   | ||||
|                         A system may contain multiple entities that match a class/subclass pairing.  | ||||
|                         The instance differentiates between them.  An instance of 0 indicates that instance information is unavailable,  | ||||
|                         not meaningful, or not relevant.  Valid instance numbers start with 1. | ||||
|   | ||||
|   @return               The function always return EFI_SUCCESS. | ||||
|   @retval EFI_SUCCESS             Status code successfully recorded in runtime memory status code table. | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| RtMemoryStatusCodeReportWorker ( | ||||
|   RUNTIME_MEMORY_STATUSCODE_HEADER      *RtMemoryStatusCodeTable, | ||||
|   IN EFI_STATUS_CODE_TYPE               CodeType, | ||||
|   IN EFI_STATUS_CODE_VALUE              Value, | ||||
|   IN UINT32                             Instance | ||||
| @ -83,13 +72,11 @@ RtMemoryStatusCodeReportWorker ( | ||||
| { | ||||
|   MEMORY_STATUSCODE_RECORD              *Record; | ||||
| 
 | ||||
|   ASSERT (NULL != RtMemoryStatusCodeTable); | ||||
| 
 | ||||
|   //
 | ||||
|   // Locate current record buffer.
 | ||||
|   //
 | ||||
|   Record                  = (MEMORY_STATUSCODE_RECORD *) (RtMemoryStatusCodeTable + 1); | ||||
|   Record                  = &Record[RtMemoryStatusCodeTable->RecordIndex++]; | ||||
|   Record = (MEMORY_STATUSCODE_RECORD *) (mRtMemoryStatusCodeTable + 1); | ||||
|   Record = &Record[mRtMemoryStatusCodeTable->RecordIndex++]; | ||||
| 
 | ||||
|   //
 | ||||
|   // Save status code.
 | ||||
| @ -99,16 +86,19 @@ RtMemoryStatusCodeReportWorker ( | ||||
|   Record->Instance = Instance; | ||||
| 
 | ||||
|   //
 | ||||
|   // Record total number of records, we compare the number with max records number,
 | ||||
|   // if it is bigger than the max number, then the roll back had happened, the record index points to 
 | ||||
|   // the first record. if it is less then max number, then the zero index is the first record.
 | ||||
|   // If record index equals to max record number, then wrap around record index to zero.
 | ||||
|   //
 | ||||
|   RtMemoryStatusCodeTable->NumberOfRecords++; | ||||
|   if (RtMemoryStatusCodeTable->RecordIndex == RtMemoryStatusCodeTable->MaxRecordsNumber) { | ||||
|   // The reader of status code should compare the number of records with max records number,
 | ||||
|   // If it is equal to or larger than the max number, then the wrap-around had happened,
 | ||||
|   // so the first record is pointed by record index.
 | ||||
|   // If it is less then max number, index of the first record is zero.
 | ||||
|   //
 | ||||
|     // Roll back record index.
 | ||||
|   mRtMemoryStatusCodeTable->NumberOfRecords++; | ||||
|   if (mRtMemoryStatusCodeTable->RecordIndex == mRtMemoryStatusCodeTable->MaxRecordsNumber) { | ||||
|     //
 | ||||
|     RtMemoryStatusCodeTable->RecordIndex = 0; | ||||
|     // Wrap around record index.
 | ||||
|     //
 | ||||
|     mRtMemoryStatusCodeTable->RecordIndex = 0; | ||||
|   } | ||||
| 
 | ||||
|   return EFI_SUCCESS; | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| /** @file
 | ||||
|   Serial I/O status code reporting worker. | ||||
| 
 | ||||
|   Copyright (c) 2006, Intel Corporation                                                          | ||||
|   Copyright (c) 2006 - 2009, 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         | ||||
| @ -17,9 +17,9 @@ | ||||
| EFI_SERIAL_IO_PROTOCOL *mSerialIoProtocol; | ||||
| 
 | ||||
| /**
 | ||||
|   Initialize serial status code worker. | ||||
|   Locates Serial I/O Protocol as initialization for serial status code worker. | ||||
|   | ||||
|   @return  The function always return EFI_SUCCESS | ||||
|   @retval EFI_SUCCESS  Serial I/O Protocol is successfully located. | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| @ -44,30 +44,20 @@ EfiSerialStatusCodeInitializeWorker ( | ||||
| /**
 | ||||
|   Convert status code value and extended data to readable ASCII string, send string to serial I/O device. | ||||
|   | ||||
|   @param  CodeType      Indicates the type of status code being reported.  Type EFI_STATUS_CODE_TYPE is defined in "Related Definitions" below. | ||||
|   | ||||
|   @param  CodeType         Indicates the type of status code being reported. | ||||
|   @param  Value            Describes the current status of a hardware or software entity. | ||||
|                         This included information about the class and subclass that is used to classify the entity  | ||||
|                         as well as an operation.  For progress codes, the operation is the current activity.  | ||||
|                         For error codes, it is the exception.  For debug codes, it is not defined at this time.  | ||||
|                         Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below.   | ||||
|                         Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification. | ||||
|   | ||||
|   @param  Instance      The enumeration of a hardware or software entity within the system.   | ||||
|                         A system may contain multiple entities that match a class/subclass pairing.  | ||||
|                         The instance differentiates between them.  An instance of 0 indicates that instance information is unavailable,  | ||||
|                         not meaningful, or not relevant.  Valid instance numbers start with 1. | ||||
| 
 | ||||
| 
 | ||||
|                            This included information about the class and subclass that is used to | ||||
|                            classify the entity as well as an operation. | ||||
|   @param  Instance         The enumeration of a hardware or software entity within | ||||
|                            the system. Valid instance numbers start with 1. | ||||
|   @param  CallerId         This optional parameter may be used to identify the caller. | ||||
|                         This parameter allows the status code driver to apply different rules to different callers.  | ||||
|                         Type EFI_GUID is defined in InstallProtocolInterface() in the UEFI 2.0 Specification. | ||||
|                            This parameter allows the status code driver to apply different rules to | ||||
|                            different callers. | ||||
|   @param  Data             This optional parameter may be used to pass additional data. | ||||
| 
 | ||||
| 
 | ||||
|   @param  Data          This optional parameter may be used to pass additional data | ||||
|   | ||||
|   @retval EFI_SUCCESS         Success to report status code to serial I/O. | ||||
|   @retval EFI_SUCCESS      Status code reported to serial I/O successfully. | ||||
|   @retval EFI_DEVICE_ERROR EFI serial device cannot work after ExitBootService() is called. | ||||
|   @retval EFI_DEVICE_ERROR EFI serial device cannot work with TPL higher than TPL_CALLBACK. | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| @ -87,17 +77,12 @@ SerialStatusCodeReportWorker ( | ||||
|   UINT32          LineNumber; | ||||
|   UINTN           CharCount; | ||||
|   VA_LIST         Marker; | ||||
|   EFI_TPL         CurrentTpl; | ||||
| 
 | ||||
| 
 | ||||
|   if (FeaturePcdGet (PcdStatusCodeUseEfiSerial)) { | ||||
|     if (EfiAtRuntime ()) { | ||||
|       return EFI_DEVICE_ERROR; | ||||
|     } | ||||
|     CurrentTpl = gBS->RaiseTPL (TPL_HIGH_LEVEL); | ||||
|     gBS->RestoreTPL (CurrentTpl); | ||||
| 
 | ||||
|     if (CurrentTpl > TPL_CALLBACK ) { | ||||
|     if (EfiGetCurrentTpl () > TPL_CALLBACK ) { | ||||
|       return EFI_DEVICE_ERROR; | ||||
|     } | ||||
|   } | ||||
| @ -141,11 +126,6 @@ SerialStatusCodeReportWorker ( | ||||
|                   Instance | ||||
|                   ); | ||||
|     | ||||
|     //
 | ||||
|     // Make sure we don't try to print values that weren't 
 | ||||
|     // intended to be printed, especially NULL GUID pointers.
 | ||||
|     //
 | ||||
|      | ||||
|     if (CallerId != NULL) { | ||||
|       CharCount += AsciiSPrint ( | ||||
|                      &Buffer[CharCount - 1], | ||||
| @ -170,6 +150,9 @@ SerialStatusCodeReportWorker ( | ||||
|                    "\n\r" | ||||
|                    ); | ||||
|   } else if ((CodeType & EFI_STATUS_CODE_TYPE_MASK) == EFI_PROGRESS_CODE) { | ||||
|     //
 | ||||
|     // Print PROGRESS information into output buffer.
 | ||||
|     //
 | ||||
|     CharCount = AsciiSPrint ( | ||||
|                   Buffer,  | ||||
|                   EFI_STATUS_CODE_DATA_MAX_SIZE,  | ||||
| @ -178,6 +161,9 @@ SerialStatusCodeReportWorker ( | ||||
|                   Instance | ||||
|                   ); | ||||
|   } else { | ||||
|     //
 | ||||
|     // Code type is not defined.
 | ||||
|     //
 | ||||
|     CharCount = AsciiSPrint ( | ||||
|                   Buffer,  | ||||
|                   EFI_STATUS_CODE_DATA_MAX_SIZE,  | ||||
| @ -191,7 +177,7 @@ SerialStatusCodeReportWorker ( | ||||
| 
 | ||||
|   if (FeaturePcdGet (PcdStatusCodeUseHardSerial)) { | ||||
|     //
 | ||||
|     // Callout to SerialPort Lib function to do print.
 | ||||
|     // Call SerialPort Lib function to do print.
 | ||||
|     //
 | ||||
|     SerialPortWrite ((UINT8 *) Buffer, CharCount); | ||||
|   } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user