Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Dandan Bi <dandan.bi@intel.com> Reviewed-by: Star Zeng <star.zeng@intel.com>
		
			
				
	
	
		
			162 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Publishes ESRT table from Firmware Management Protocol instances
 | |
| 
 | |
|   Copyright (c) 2016, Microsoft Corporation
 | |
|   Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
 | |
| 
 | |
|   All rights reserved.
 | |
|   Redistribution and use in source and binary forms, with or without
 | |
|   modification, are permitted provided that the following conditions are met:
 | |
|   1. Redistributions of source code must retain the above copyright notice,
 | |
|   this list of conditions and the following disclaimer.
 | |
|   2. Redistributions in binary form must reproduce the above copyright notice,
 | |
|   this list of conditions and the following disclaimer in the documentation
 | |
|   and/or other materials provided with the distribution.
 | |
| 
 | |
|   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | |
|   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | |
|   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | |
|   IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 | |
|   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 | |
|   BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | |
|   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 | |
|   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 | |
|   OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 | |
|   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include <Uefi.h>
 | |
| #include <Library/BaseLib.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Protocol/FirmwareManagement.h>
 | |
| #include <Guid/SystemResourceTable.h>
 | |
| 
 | |
| /**
 | |
|   Function to print a single ESRT Entry (ESRE) to the debug console.
 | |
| 
 | |
|   Print Format:
 | |
|   | 00000000-0000-0000-0000-000000000000 | SSSSSSSSSSSS | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000000 | 0x00000000 |
 | |
| 
 | |
|   @param[in]  Entry  - Pointer to an ESRE entry
 | |
|   @retval  EFI_SUCCESS
 | |
|                         EFI_INVALID_PARAMETER
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| PrintOutEsrtEntry (
 | |
|   IN EFI_SYSTEM_RESOURCE_ENTRY  *Entry
 | |
|   )
 | |
| {
 | |
|   if (Entry == NULL) {
 | |
|     DEBUG ((DEBUG_INFO, "| ERROR:  Invalid resource entry pointer                           "));
 | |
|     DEBUG ((DEBUG_INFO, "                                                    |\n"));
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // GUID FW Class (36 chars plus table formatting)
 | |
|   //
 | |
|   DEBUG ((DEBUG_INFO, "| %g |", &Entry->FwClass));
 | |
| 
 | |
|   //
 | |
|   // Entry Type (12 chars plus table formatting)
 | |
|   //
 | |
|   switch (Entry->FwType) {
 | |
|   case (ESRT_FW_TYPE_SYSTEMFIRMWARE) :
 | |
|     DEBUG ((DEBUG_INFO, " System FW    |"));
 | |
|     break;
 | |
|   case (ESRT_FW_TYPE_DEVICEFIRMWARE) :
 | |
|     DEBUG ((DEBUG_INFO, " Device FW    |"));
 | |
|     break;
 | |
|   case (ESRT_FW_TYPE_UEFIDRIVER) :
 | |
|     DEBUG ((DEBUG_INFO, " Uefi Driver  |"));
 | |
|     break;
 | |
|   case (ESRT_FW_TYPE_UNKNOWN) :
 | |
|     DEBUG ((DEBUG_INFO, " Unknown Type |"));
 | |
|     break;
 | |
|   default:
 | |
|     DEBUG ((DEBUG_INFO, " ? 0x%8X |", Entry->FwType));
 | |
|     break;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // FW Version (10 char UINT32 string plus table formatting)
 | |
|   // Lowest Supported Version (10 char UINT32 string plus table formatting)
 | |
|   // Capsule Flags (10 char UINT32 string plus table formatting)
 | |
|   // Last Attempt Version (10 char UINT32 string plus table formatting)
 | |
|   // Last Attempt Status (10 char UINT32 string plus table formatting)
 | |
|   //
 | |
|   DEBUG ((DEBUG_INFO,
 | |
|     " 0x%8X | 0x%8X | 0x%8X | 0x%8X | 0x%8X |\n",
 | |
|     Entry->FwVersion,
 | |
|     Entry->LowestSupportedFwVersion,
 | |
|     Entry->CapsuleFlags,
 | |
|     Entry->LastAttemptVersion,
 | |
|     Entry->LastAttemptStatus
 | |
|     ));
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Function to print the ESRT table to the debug console.
 | |
| 
 | |
|   @param[in]  Table  - Pointer to the ESRT table
 | |
| **/
 | |
| VOID
 | |
| EFIAPI
 | |
| PrintTable (
 | |
|   IN EFI_SYSTEM_RESOURCE_TABLE  *Table
 | |
|   )
 | |
| {
 | |
|   EFI_SYSTEM_RESOURCE_ENTRY  *Entry;
 | |
|   UINTN                      Index;
 | |
| 
 | |
|   Entry = (EFI_SYSTEM_RESOURCE_ENTRY *)(((UINT8 *)Table) + sizeof (EFI_SYSTEM_RESOURCE_TABLE));
 | |
| 
 | |
|   //
 | |
|   // Print ESRT table information
 | |
|   //
 | |
|   DEBUG ((DEBUG_INFO, "ESRT Table Information:\n"));
 | |
|   if (Table == NULL) {
 | |
|     DEBUG ((DEBUG_INFO, "ERROR:  Invalid table pointer\n"));
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   DEBUG ((DEBUG_INFO, "+--------------------------------------------------------+\n"));
 | |
|   DEBUG ((DEBUG_INFO, "| Firmware Resource Count          : 0x%08x          |\n",  Table->FwResourceCount));
 | |
|   DEBUG ((DEBUG_INFO, "| Firmware Resource Count Max      : 0x%08x          |\n",  Table->FwResourceCountMax));
 | |
|   DEBUG ((DEBUG_INFO, "| Firmware Resource Entry Version  : 0x%016x  |\n",         Table->FwResourceVersion));
 | |
|   DEBUG ((DEBUG_INFO, "+--------------------------------------------------------+\n"));
 | |
| 
 | |
|   //
 | |
|   // Print table entry information
 | |
|   //
 | |
|   DEBUG ((DEBUG_INFO, "ESRT Table Entries:\n"));
 | |
|   if (Table->FwResourceVersion != EFI_SYSTEM_RESOURCE_TABLE_FIRMWARE_RESOURCE_VERSION) {
 | |
|     DEBUG ((DEBUG_INFO, "ERROR:  Unsupported Resource Entry Version\n"));
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   DEBUG ((DEBUG_INFO, "+--------------------------------------+--------------+------------"));
 | |
|   DEBUG ((DEBUG_INFO, "+------------+------------+------------+------------+\n"));
 | |
|   DEBUG ((DEBUG_INFO, "|                                      |              |            "));
 | |
|   DEBUG ((DEBUG_INFO, "| Lowest     |            | Last       | Last       |\n"));
 | |
|   DEBUG ((DEBUG_INFO, "|                                      | Firmware     |            "));
 | |
|   DEBUG ((DEBUG_INFO, "| Supported  | Capsule    | Attempted  | Attempted  |\n"));
 | |
|   DEBUG ((DEBUG_INFO, "| CLASS GUID                           | Type         | Version    "));
 | |
|   DEBUG ((DEBUG_INFO, "| Version    | Flags      | Version    | Status     |\n"));
 | |
|   DEBUG ((DEBUG_INFO, "+--------------------------------------+--------------+------------"));
 | |
|   DEBUG ((DEBUG_INFO, "+------------+------------+------------+------------+\n"));
 | |
| 
 | |
|   for (Index = 0; Index < Table->FwResourceCount; Index++) {
 | |
|     PrintOutEsrtEntry (&(Entry[Index]));
 | |
|   }
 | |
| 
 | |
|   DEBUG ((DEBUG_INFO, "+--------------------------------------+--------------+------------"));
 | |
|   DEBUG ((DEBUG_INFO, "+------------+------------+------------+------------+\n"));
 | |
| }
 | |
| 
 |