]> 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 a906808ab312a84381afe7d68b88414e188e8751..c14931055cbf4a90e8809a7f547708378c2098a6 100644 (file)
@@ -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
@@ -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