git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10414 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			152 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Data Hub filter driver that takes DEBUG () info from Data Hub and writes it
 | |
|   to StdErr if it exists.
 | |
| 
 | |
| Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
 | |
| 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.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include <FrameworkDxe.h>
 | |
| #include <Guid/DataHubStatusCodeRecord.h>
 | |
| #include <Guid/StatusCodeDataTypeId.h>
 | |
| #include <Guid/StatusCodeDataTypeDebug.h>
 | |
| #include <Protocol/DataHub.h>
 | |
| #include <Protocol/SimpleTextOut.h>
 | |
| 
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/UefiDriverEntryPoint.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| #include <Library/UefiBootServicesTableLib.h>
 | |
| 
 | |
| EFI_DATA_HUB_PROTOCOL *mDataHub = NULL;
 | |
| 
 | |
| EFI_EVENT             mDataHubStdErrEvent;
 | |
| 
 | |
| /**
 | |
|   Event handler registered with the Data Hub to parse EFI_DEBUG_CODE. This
 | |
|   handler reads the Data Hub and sends any DEBUG info to StdErr.
 | |
| 
 | |
|   @param Event      The event that occured, not used
 | |
|   @param Context    DataHub Protocol Pointer
 | |
| **/
 | |
| VOID
 | |
| EFIAPI
 | |
| DataHubStdErrEventHandler (
 | |
|   IN EFI_EVENT Event,
 | |
|   IN VOID      *Context
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS                           Status;
 | |
|   EFI_DATA_HUB_PROTOCOL                *DataHub;
 | |
|   EFI_DATA_RECORD_HEADER               *Record;
 | |
|   DATA_HUB_STATUS_CODE_DATA_RECORD     *DataRecord;
 | |
|   UINT64                               Mtc;
 | |
|   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL      *Sto;
 | |
|   INT32                                OldAttribute;
 | |
| 
 | |
|   DataHub = (EFI_DATA_HUB_PROTOCOL *) Context;
 | |
| 
 | |
|   //
 | |
|   // If StdErr is not yet initialized just return a DEBUG print in the BDS
 | |
|   // after consoles are connect will make sure data gets flushed properly
 | |
|   // when StdErr is availible.
 | |
|   //
 | |
|   if (gST == NULL) {
 | |
|     return ;
 | |
|   }
 | |
| 
 | |
|   if (gST->StdErr == NULL) {
 | |
|     return ;
 | |
|   }
 | |
|   
 | |
|   //
 | |
|   // Mtc of zero means return the next record that has not been read by the
 | |
|   // event handler.
 | |
|   //
 | |
|   Mtc = 0;
 | |
|   do {
 | |
|     Status = DataHub->GetNextRecord (DataHub, &Mtc, &mDataHubStdErrEvent, &Record);
 | |
|     if (!EFI_ERROR (Status)) {
 | |
|       if (CompareGuid (&Record->DataRecordGuid, &gEfiDataHubStatusCodeRecordGuid)) {
 | |
|         DataRecord = (DATA_HUB_STATUS_CODE_DATA_RECORD *) (((CHAR8 *) Record) + Record->HeaderSize);
 | |
| 
 | |
|         if (DataRecord->Data.HeaderSize > 0) {
 | |
|           if (CompareGuid (&DataRecord->Data.Type, &gEfiStatusCodeDataTypeDebugGuid)) {
 | |
|             //
 | |
|             // If the Data record is from a DEBUG () then send it to Standard Error
 | |
|             //
 | |
|             Sto           = gST->StdErr;
 | |
|             OldAttribute  = Sto->Mode->Attribute;
 | |
|             Sto->SetAttribute (Sto, EFI_TEXT_ATTR (EFI_MAGENTA, EFI_BLACK));
 | |
|             Sto->OutputString (Sto, (CHAR16 *) (DataRecord + 1));
 | |
|             Sto->SetAttribute (Sto, OldAttribute);
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   } while ((Mtc != 0) && !EFI_ERROR (Status));
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Register an event handler with the Data Hub to parse EFI_DEBUG_CODE. This
 | |
|   handler reads the Data Hub and sends any DEBUG info to StdErr.
 | |
| 
 | |
|   @param ImageHandle                Image handle of this driver.
 | |
|   @param SystemTable                Pointer to EFI system table.
 | |
| 
 | |
|   @retval EFI_SUCCESS               The event handler was registered.
 | |
|   @retval EFI_OUT_OF_RESOURCES      The event hadler was not registered due to lack of system resources.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| DataHubStdErrInitialize (
 | |
|   IN EFI_HANDLE         ImageHandle,
 | |
|   IN EFI_SYSTEM_TABLE   *SystemTable
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS  Status;
 | |
|   UINT64      DataClass;
 | |
| 
 | |
|   gBS->LocateProtocol (&gEfiDataHubProtocolGuid, NULL, (VOID **) &mDataHub);
 | |
|   //
 | |
|   // Should never fail due to Depex grammer.
 | |
|   //
 | |
|   ASSERT (mDataHub != NULL);
 | |
| 
 | |
|   //
 | |
|   // Create an event and register it with the filter driver
 | |
|   //
 | |
|   Status = gBS->CreateEvent (
 | |
|                   EVT_NOTIFY_SIGNAL,
 | |
|                   TPL_CALLBACK,
 | |
|                   DataHubStdErrEventHandler,
 | |
|                   mDataHub,
 | |
|                   &mDataHubStdErrEvent
 | |
|                   );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
| 
 | |
|   DataClass = EFI_DATA_RECORD_CLASS_DEBUG | EFI_DATA_RECORD_CLASS_ERROR;
 | |
|   Status = mDataHub->RegisterFilterDriver (
 | |
|                       mDataHub,
 | |
|                       mDataHubStdErrEvent,
 | |
|                       TPL_CALLBACK,
 | |
|                       DataClass,
 | |
|                       NULL
 | |
|                       );
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     gBS->CloseEvent (mDataHubStdErrEvent);
 | |
|   }
 | |
| 
 | |
|   return Status;
 | |
| }
 | |
| 
 |