]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/DynamicCommand/DpDynamicCommand/Dp.c
ShellPkg DpDynamicCommand: Use new EfiLocateFirstAcpiTable()
[mirror_edk2.git] / ShellPkg / DynamicCommand / DpDynamicCommand / Dp.c
index 925341303a4280f9804caf51554452d2a37315cf..c14931055cbf4a90e8809a7f547708378c2098a6 100644 (file)
   and start and end time values.\r
   Dp uses this information to group records in different ways.  It also uses\r
   timer information to calculate elapsed time for each measurement.\r
\r
+\r
   Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.\r
   (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
   http://opensource.org/licenses/bsd-license.php\r
\r
+\r
   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 **/\r
@@ -73,7 +73,8 @@ PERF_CUM_DATA CumData[] = {
   PERF_INIT_CUM_DATA (LOAD_IMAGE_TOK),\r
   PERF_INIT_CUM_DATA (START_IMAGE_TOK),\r
   PERF_INIT_CUM_DATA (DRIVERBINDING_START_TOK),\r
-  PERF_INIT_CUM_DATA (DRIVERBINDING_SUPPORT_TOK)\r
+  PERF_INIT_CUM_DATA (DRIVERBINDING_SUPPORT_TOK),\r
+  PERF_INIT_CUM_DATA (DRIVERBINDING_STOP_TOK)\r
 };\r
 \r
 /// Number of items for which we are gathering cumulative statistics.\r
@@ -116,116 +117,6 @@ DumpStatistics( void )
   SHELL_FREE_NON_NULL (StringPtrUnknown);\r
 }\r
 \r
-/**\r
-  This function scan ACPI table in RSDT.\r
-\r
-  @param  Rsdt        ACPI RSDT\r
-  @param  Signature   ACPI table signature\r
-\r
-  @return ACPI table\r
-**/\r
-VOID *\r
-ScanTableInRSDT (\r
-  IN RSDT_TABLE                   *Rsdt,\r
-  IN UINT32                       Signature\r
-  )\r
-{\r
-  UINTN                         Index;\r
-  UINT32                        EntryCount;\r
-  UINT32                        *EntryPtr;\r
-  EFI_ACPI_DESCRIPTION_HEADER   *Table;\r
-\r
-  EntryCount = (Rsdt->Header.Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof(UINT32);\r
-\r
-  EntryPtr = &Rsdt->Entry;\r
-  for (Index = 0; Index < EntryCount; Index ++, EntryPtr ++) {\r
-    Table = (EFI_ACPI_DESCRIPTION_HEADER*)((UINTN)(*EntryPtr));\r
-    if (Table->Signature == Signature) {\r
-      return Table;\r
-    }\r
-  }\r
-\r
-  return NULL;\r
-}\r
-\r
-/**\r
-  This function scan ACPI table in XSDT.\r
-\r
-  @param  Xsdt       ACPI XSDT\r
-  @param  Signature  ACPI table signature\r
-\r
-  @return ACPI table\r
-**/\r
-VOID *\r
-ScanTableInXSDT (\r
-  IN XSDT_TABLE                   *Xsdt,\r
-  IN UINT32                       Signature\r
-  )\r
-{\r
-  UINTN                        Index;\r
-  UINT32                       EntryCount;\r
-  UINT64                       EntryPtr;\r
-  UINTN                        BasePtr;\r
-  EFI_ACPI_DESCRIPTION_HEADER  *Table;\r
-\r
-  EntryCount = (Xsdt->Header.Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof(UINT64);\r
-\r
-  BasePtr = (UINTN)(&(Xsdt->Entry));\r
-  for (Index = 0; Index < EntryCount; Index ++) {\r
-    CopyMem (&EntryPtr, (VOID *)(BasePtr + Index * sizeof(UINT64)), sizeof(UINT64));\r
-    Table = (EFI_ACPI_DESCRIPTION_HEADER*)((UINTN)(EntryPtr));\r
-    if (Table->Signature == Signature) {\r
-      return Table;\r
-    }\r
-  }\r
-\r
-  return NULL;\r
-}\r
-\r
-/**\r
-  This function scan ACPI table in RSDP.\r
-\r
-  @param  Rsdp       ACPI RSDP\r
-  @param  Signature  ACPI table signature\r
-\r
-  @return ACPI table\r
-**/\r
-VOID *\r
-FindAcpiPtr (\r
-  IN EFI_ACPI_5_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp,\r
-  IN UINT32                                       Signature\r
-  )\r
-{\r
-  EFI_ACPI_DESCRIPTION_HEADER                    *AcpiTable;\r
-  RSDT_TABLE                                     *Rsdt;\r
-  XSDT_TABLE                                     *Xsdt;\r
-\r
-  AcpiTable = NULL;\r
-\r
-  //\r
-  // Check ACPI2.0 table\r
-  //\r
-  Rsdt = (RSDT_TABLE *)(UINTN)Rsdp->RsdtAddress;\r
-  Xsdt = NULL;\r
-  if ((Rsdp->Revision >= 2) && (Rsdp->XsdtAddress < (UINT64)(UINTN)-1)) {\r
-    Xsdt = (XSDT_TABLE *)(UINTN)Rsdp->XsdtAddress;\r
-  }\r
-  //\r
-  // Check Xsdt\r
-  //\r
-  if (Xsdt != NULL) {\r
-    AcpiTable = ScanTableInXSDT (Xsdt, Signature);\r
-  }\r
-  //\r
-  // Check Rsdt\r
-  //\r
-  if ((AcpiTable == NULL) && (Rsdt != NULL)) {\r
-    AcpiTable = ScanTableInRSDT (Rsdt, Signature);\r
-  }\r
-\r
-  return AcpiTable;\r
-}\r
-\r
 /**\r
   Get Boot performance table form Acpi table.\r
 \r
@@ -234,31 +125,11 @@ EFI_STATUS
 GetBootPerformanceTable (\r
   )\r
 {\r
-  EFI_STATUS                  Status;\r
-  VOID                        *AcpiTable;\r
   FIRMWARE_PERFORMANCE_TABLE  *FirmwarePerformanceTable;\r
 \r
-  AcpiTable = NULL;\r
-\r
-  Status = EfiGetSystemConfigurationTable (\r
-             &gEfiAcpi20TableGuid,\r
-             &AcpiTable\r
-             );\r
-  if (EFI_ERROR (Status)) {\r
-    Status = EfiGetSystemConfigurationTable (\r
-               &gEfiAcpi10TableGuid,\r
-               &AcpiTable\r
-                 );\r
-  }\r
-  if (EFI_ERROR(Status) || AcpiTable == NULL) {\r
-    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_GET_ACPI_TABLE_FAIL), mDpHiiHandle);\r
-    return Status;\r
-  }\r
-\r
-  FirmwarePerformanceTable = FindAcpiPtr (\r
-                      (EFI_ACPI_5_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)AcpiTable,\r
-                      EFI_ACPI_5_0_FIRMWARE_PERFORMANCE_DATA_TABLE_SIGNATURE\r
-                      );\r
+  FirmwarePerformanceTable = (FIRMWARE_PERFORMANCE_TABLE *) EfiLocateFirstAcpiTable (\r
+                                                              EFI_ACPI_5_0_FIRMWARE_PERFORMANCE_DATA_TABLE_SIGNATURE\r
+                                                              );\r
   if (FirmwarePerformanceTable == NULL) {\r
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_GET_ACPI_FPDT_FAIL), mDpHiiHandle);\r
     return EFI_NOT_FOUND;\r
@@ -741,10 +612,10 @@ InitSummaryData (
 \r
 /**\r
   Dump performance data.\r
-  \r
+\r
   @param[in]  ImageHandle     The image handle.\r
   @param[in]  SystemTable     The system table.\r
-  \r
+\r
   @retval SHELL_SUCCESS            Command completed successfully.\r
   @retval SHELL_INVALID_PARAMETER  Command usage error.\r
   @retval SHELL_ABORTED            The user aborts the operation.\r
@@ -775,6 +646,7 @@ RunDp (
   UINTN                     NameSize;\r
   SHELL_STATUS              ShellStatus;\r
   TIMER_INFO                TimerInfo;\r
+  UINT64                    Intermediate;\r
 \r
   StringPtr   = NULL;\r
   SummaryMode = FALSE;\r
@@ -799,6 +671,9 @@ RunDp (
   if (EFI_ERROR(Status)) {\r
     ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_INVALID_ARG), mDpHiiHandle);\r
     return SHELL_INVALID_PARAMETER;\r
+  } else if (ShellCommandLineGetCount(ParamPackage) > 1){\r
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_TOO_MANY), mDpHiiHandle);\r
+    return SHELL_INVALID_PARAMETER;\r
   }\r
 \r
   //\r
@@ -812,24 +687,80 @@ RunDp (
   mShowId     = ShellCommandLineGetFlag (ParamPackage, L"-i");\r
   CumulativeMode = ShellCommandLineGetFlag (ParamPackage, L"-c");\r
 \r
+  if (AllMode && RawMode) {\r
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_CONFLICT_ARG), mDpHiiHandle, L"-A", L"-R");\r
+    return SHELL_INVALID_PARAMETER;\r
+  }\r
+\r
   // Options with Values\r
-  CmdLineArg  = ShellCommandLineGetValue (ParamPackage, L"-n");\r
-  if (CmdLineArg == NULL) {\r
-    Number2Display = DEFAULT_DISPLAYCOUNT;\r
-  } else {\r
-    Number2Display = StrDecimalToUintn(CmdLineArg);\r
-    if (Number2Display == 0) {\r
-      Number2Display = MAXIMUM_DISPLAYCOUNT;\r
+  if (ShellCommandLineGetFlag (ParamPackage, L"-n")) {\r
+    CmdLineArg  = ShellCommandLineGetValue (ParamPackage, L"-n");\r
+    if (CmdLineArg == NULL) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_TOO_FEW), mDpHiiHandle);\r
+      return SHELL_INVALID_PARAMETER;\r
+    } else {\r
+      if (!(RawMode || AllMode)) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_NO_RAW_ALL), mDpHiiHandle);\r
+        return SHELL_INVALID_PARAMETER;\r
+      }\r
+      Status = ShellConvertStringToUint64(CmdLineArg, &Intermediate, FALSE, TRUE);\r
+      if (EFI_ERROR (Status)) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_INVALID_NUM_ARG), mDpHiiHandle, L"-n");\r
+        return SHELL_INVALID_PARAMETER;\r
+      } else {\r
+        Number2Display = (UINTN)Intermediate;\r
+        if (Number2Display == 0 || Number2Display > MAXIMUM_DISPLAYCOUNT) {\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_INVALID_RANGE), mDpHiiHandle, L"-n", 0, MAXIMUM_DISPLAYCOUNT);\r
+          return SHELL_INVALID_PARAMETER;\r
+        }\r
+      }\r
     }\r
+  } else {\r
+    Number2Display = DEFAULT_DISPLAYCOUNT;\r
   }\r
 \r
-  CmdLineArg  = ShellCommandLineGetValue (ParamPackage, L"-t");\r
-  if (CmdLineArg == NULL) {\r
-    mInterestThreshold = DEFAULT_THRESHOLD;  // 1ms := 1,000 us\r
+  if (ShellCommandLineGetFlag (ParamPackage, L"-t")) {\r
+    CmdLineArg  = ShellCommandLineGetValue (ParamPackage, L"-t");\r
+    if (CmdLineArg == NULL) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_TOO_FEW), mDpHiiHandle);\r
+      return SHELL_INVALID_PARAMETER;\r
+    } else {\r
+      Status = ShellConvertStringToUint64(CmdLineArg, &Intermediate, FALSE, TRUE);\r
+      if (EFI_ERROR (Status)) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_INVALID_NUM_ARG), mDpHiiHandle, L"-t");\r
+        return SHELL_INVALID_PARAMETER;\r
+      } else {\r
+        mInterestThreshold = Intermediate;\r
+      }\r
+    }\r
   } else {\r
-    mInterestThreshold = StrDecimalToUint64(CmdLineArg);\r
+    mInterestThreshold = DEFAULT_THRESHOLD;  // 1ms := 1,000 us\r
   }\r
 \r
+  if (ShellCommandLineGetFlag (ParamPackage, L"-c")) {\r
+    CustomCumulativeToken = ShellCommandLineGetValue (ParamPackage, L"-c");\r
+    if (CustomCumulativeToken == NULL) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_TOO_FEW), mDpHiiHandle);\r
+      return SHELL_INVALID_PARAMETER;\r
+    } else {\r
+      CustomCumulativeData = AllocateZeroPool (sizeof (PERF_CUM_DATA));\r
+      if (CustomCumulativeData == NULL) {\r
+        ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+        goto Done;\r
+      }\r
+      CustomCumulativeData->MinDur = PERF_MAXDUR;\r
+      CustomCumulativeData->MaxDur = 0;\r
+      CustomCumulativeData->Count  = 0;\r
+      CustomCumulativeData->Duration = 0;\r
+      NameSize = StrLen (CustomCumulativeToken) + 1;\r
+      CustomCumulativeData->Name   = AllocateZeroPool (NameSize);\r
+      if (CustomCumulativeData->Name == NULL) {\r
+        ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+        goto Done;\r
+      }\r
+      UnicodeStrToAsciiStrS (CustomCumulativeToken, CustomCumulativeData->Name, NameSize);\r
+    }\r
+  }\r
 \r
   //\r
   // DP dump performance data by parsing FPDT table in ACPI table.\r
@@ -873,29 +804,6 @@ RunDp (
   //\r
   InitSummaryData ();\r
 \r
-  //\r
-  // Init the custom cumulative data.\r
-  //\r
-  CustomCumulativeToken = ShellCommandLineGetValue (ParamPackage, L"-c");\r
-  if (CustomCumulativeToken != NULL) {\r
-    CustomCumulativeData = AllocateZeroPool (sizeof (PERF_CUM_DATA));\r
-    if (CustomCumulativeData == NULL) {\r
-      ShellStatus = SHELL_OUT_OF_RESOURCES;\r
-      goto Done;\r
-    }\r
-    CustomCumulativeData->MinDur = PERF_MAXDUR;\r
-    CustomCumulativeData->MaxDur = 0;\r
-    CustomCumulativeData->Count  = 0;\r
-    CustomCumulativeData->Duration = 0;\r
-    NameSize = StrLen (CustomCumulativeToken) + 1;\r
-    CustomCumulativeData->Name   = AllocateZeroPool (NameSize);\r
-    if (CustomCumulativeData->Name == NULL) {\r
-      ShellStatus = SHELL_OUT_OF_RESOURCES;\r
-      goto Done;\r
-    }\r
-    UnicodeStrToAsciiStrS (CustomCumulativeToken, CustomCumulativeData->Name, NameSize);\r
-  }\r
-\r
   //\r
   // Timer specific processing\r
   //\r
@@ -952,7 +860,7 @@ RunDp (
 ****    Cooked (Default)\r
 ****************************************************************************/\r
   GatherStatistics (CustomCumulativeData);\r
-  if (CumulativeMode) {                       \r
+  if (CumulativeMode) {\r
     ProcessCumulative (CustomCumulativeData);\r
   } else if (AllMode) {\r
     Status = DumpAllTrace( Number2Display, ExcludeMode);\r