Currently the PCD Value only support 13 Guid,When use more 13 pcd will cause the build tool fail, Need calculate the required memory,then allocate it. REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3718 Cc: Bob Feng <bob.c.feng@intel.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Yuwei Chen <yuwei.chen@intel.com> Signed-off-by: Xiaolu Jiang <xiaolu.jiang@intel.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn> Reviewed-by: Bob Feng <bob.c.feng@intel.com>
		
			
				
	
	
		
			195 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			195 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Definition for Device Path Tool.
 | 
						|
 | 
						|
Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>
 | 
						|
SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include "UefiDevicePathLib.h"
 | 
						|
 | 
						|
//
 | 
						|
// Utility Name
 | 
						|
//
 | 
						|
#define UTILITY_NAME  "DevicePath"
 | 
						|
 | 
						|
//
 | 
						|
// Utility version information
 | 
						|
//
 | 
						|
#define UTILITY_MAJOR_VERSION 0
 | 
						|
#define UTILITY_MINOR_VERSION 1
 | 
						|
 | 
						|
EFI_GUID gEfiDebugPortProtocolGuid = DEVICE_PATH_MESSAGING_DEBUGPORT;
 | 
						|
EFI_GUID gEfiPcAnsiGuid = EFI_PC_ANSI_GUID;
 | 
						|
EFI_GUID gEfiVT100Guid = EFI_VT_100_GUID;
 | 
						|
EFI_GUID gEfiVT100PlusGuid = EFI_VT_100_PLUS_GUID;
 | 
						|
EFI_GUID gEfiVTUTF8Guid = EFI_VT_UTF8_GUID;
 | 
						|
EFI_GUID gEfiUartDevicePathGuid = EFI_UART_DEVICE_PATH_GUID;
 | 
						|
EFI_GUID gEfiSasDevicePathGuid = EFI_SAS_DEVICE_PATH_GUID;
 | 
						|
EFI_GUID gEfiVirtualDiskGuid = EFI_VIRTUAL_DISK_GUID;
 | 
						|
EFI_GUID gEfiVirtualCdGuid = EFI_VIRTUAL_CD_GUID;
 | 
						|
EFI_GUID gEfiPersistentVirtualDiskGuid = EFI_PERSISTENT_VIRTUAL_DISK_GUID;
 | 
						|
EFI_GUID gEfiPersistentVirtualCdGuid = EFI_PERSISTENT_VIRTUAL_CD_GUID;
 | 
						|
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
Version (
 | 
						|
  VOID
 | 
						|
)
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Displays the standard utility information to SDTOUT
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  None
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  None
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  fprintf (stdout, "%s Version %d.%d %s \n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION, __BUILD_VERSION);
 | 
						|
}
 | 
						|
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
Usage (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Displays the utility usage syntax to STDOUT
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  None
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  None
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Summary usage
 | 
						|
  //
 | 
						|
  fprintf (stdout, "\nUsage: %s [options]\n\n", UTILITY_NAME);
 | 
						|
 | 
						|
  //
 | 
						|
  // Copyright declaration
 | 
						|
  //
 | 
						|
  fprintf (stdout, "Copyright (c) 2017, Intel Corporation. All rights reserved.\n\n");
 | 
						|
  //
 | 
						|
  // Details Option
 | 
						|
  //
 | 
						|
  fprintf (stdout, "Options:\n");
 | 
						|
  fprintf (stdout, "  DevicePathString      Device Path string is specified, no space character.\n"
 | 
						|
                   "                        Example: \"PciRoot(0)/Pci(0,0)\"\n");
 | 
						|
 | 
						|
  fprintf (stdout, "  --version             Show program's version number and exit.\n");
 | 
						|
  fprintf (stdout, "  -h, --help            Show this help message and exit.\n");
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
PrintMem (
 | 
						|
  CONST VOID *Buffer,
 | 
						|
  UINTN      Count
 | 
						|
  )
 | 
						|
{
 | 
						|
  CONST UINT8 *Bytes;
 | 
						|
  UINTN       Idx;
 | 
						|
 | 
						|
  Bytes = Buffer;
 | 
						|
  for (Idx = 0; Idx < Count; Idx++) {
 | 
						|
    printf("0x%02x ", Bytes[Idx]);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
Ascii2UnicodeString (
 | 
						|
  CHAR8    *String,
 | 
						|
  CHAR16   *UniString
 | 
						|
 )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Write ascii string as unicode string format to FILE
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  String      - Pointer to string that is written to FILE.
 | 
						|
  UniString   - Pointer to unicode string
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  NULL
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  while (*String != '\0') {
 | 
						|
    *(UniString++) = (CHAR16) *(String++);
 | 
						|
  }
 | 
						|
  //
 | 
						|
  // End the UniString with a NULL.
 | 
						|
  //
 | 
						|
  *UniString = '\0';
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, CHAR8 *argv[])
 | 
						|
{
 | 
						|
  CHAR8 * Str;
 | 
						|
  CHAR16* Str16;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL *DevicePath;
 | 
						|
 | 
						|
  if (argc == 1) {
 | 
						|
    Error (NULL, 0, 1001, "Missing options", "No input options specified.");
 | 
						|
    Usage ();
 | 
						|
    return STATUS_ERROR;
 | 
						|
  }
 | 
						|
  if ((stricmp (argv[1], "-h") == 0) || (stricmp (argv[1], "--help") == 0)) {
 | 
						|
    Version ();
 | 
						|
    Usage ();
 | 
						|
    return STATUS_SUCCESS;
 | 
						|
  }
 | 
						|
 | 
						|
  if (stricmp (argv[1], "--version") == 0) {
 | 
						|
    Version ();
 | 
						|
    return STATUS_SUCCESS;
 | 
						|
  }
 | 
						|
  Str = argv[1];
 | 
						|
  if (Str == NULL) {
 | 
						|
    fprintf(stderr, "Invalid option value, Device Path can't be NULL");
 | 
						|
    return STATUS_ERROR;
 | 
						|
  }
 | 
						|
  Str16 = (CHAR16 *)malloc((strlen (Str) + 1) * sizeof (CHAR16));
 | 
						|
  if (Str16 == NULL) {
 | 
						|
    fprintf(stderr, "Resource, memory cannot be allocated");
 | 
						|
    return STATUS_ERROR;
 | 
						|
  }
 | 
						|
  Ascii2UnicodeString(Str, Str16);
 | 
						|
  DevicePath = UefiDevicePathLibConvertTextToDevicePath(Str16);
 | 
						|
  if (DevicePath == NULL) {
 | 
						|
    fprintf(stderr, "Convert fail, Cannot convert text to a device path");
 | 
						|
    free(Str16);
 | 
						|
    return STATUS_ERROR;
 | 
						|
  }
 | 
						|
  while (!((DevicePath->Type == END_DEVICE_PATH_TYPE) && (DevicePath->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE)) )
 | 
						|
  {
 | 
						|
    PrintMem (DevicePath, DevicePath->Length[0] | DevicePath->Length[1] << 8);
 | 
						|
    DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)((UINT8 *)DevicePath + (DevicePath->Length[0] | DevicePath->Length[1] << 8));
 | 
						|
  }
 | 
						|
  PrintMem (DevicePath, DevicePath->Length[0] | DevicePath->Length[1] << 8);
 | 
						|
  putchar('\n');
 | 
						|
  free(Str16);
 | 
						|
  return STATUS_SUCCESS;
 | 
						|
}
 |