]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Universal/BdsDxe/DeviceMngr/DeviceManager.c
Add assertion check for TmpString against NULL.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / DeviceMngr / DeviceManager.c
index 5406249f450175d7d2451cd9ede470b4a2e8dbe3..40d93c5ae007c43a6482d451257607f98f249cf6 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   The platform device manager reference implementation\r
 \r
-Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<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
@@ -429,7 +429,6 @@ GetMacAddressString(
   Save question id and prompt id to the mac device list.\r
   If the same mac address has saved yet, no need to add more.\r
 \r
-  @param NewQuestionId               New question id.\r
   @param MacAddrString               Mac address string.\r
 \r
   @retval  EFI_SUCCESS               Add the item is successful.\r
@@ -802,7 +801,7 @@ CallDeviceManager (
   //\r
   if (mNextShowFormId == NETWORK_DEVICE_FORM_ID) {\r
     String = HiiGetString (HiiHandle, STRING_TOKEN (STR_FORM_NETWORK_DEVICE_TITLE), NULL);\r
-    NewStringLen = StrLen(mSelectedMacAddrString);\r
+    NewStringLen = StrLen(mSelectedMacAddrString) * 2;\r
     NewStringLen += (StrLen(String) + 2) * 2;\r
     NewStringTitle = AllocatePool (NewStringLen);\r
     UnicodeSPrint (NewStringTitle, NewStringLen, L"%s %s", String, mSelectedMacAddrString);\r
@@ -884,13 +883,13 @@ CallDeviceManager (
         //\r
         if (!AddNetworkMenu) {\r
           AddNetworkMenu = TRUE;\r
-          HiiCreateActionOpCode (\r
+          HiiCreateGotoOpCode (\r
             StartOpCodeHandle,\r
-            (EFI_QUESTION_ID) QUESTION_NETWORK_DEVICE_ID,\r
+            DEVICE_MANAGER_FORM_ID,\r
             STRING_TOKEN (STR_FORM_NETWORK_DEVICE_LIST_TITLE),\r
             STRING_TOKEN (STR_FORM_NETWORK_DEVICE_LIST_HELP),\r
             EFI_IFR_FLAG_CALLBACK,\r
-            0\r
+            (EFI_QUESTION_ID) QUESTION_NETWORK_DEVICE_ID\r
             );\r
         }\r
       } else if (mNextShowFormId == NETWORK_DEVICE_LIST_FORM_ID) {\r
@@ -898,13 +897,13 @@ CallDeviceManager (
         // In network device list form, same mac address device only show one menu.\r
         //\r
         while (AddItemCount > 0) {\r
-            HiiCreateActionOpCode (\r
+            HiiCreateGotoOpCode (\r
               StartOpCodeHandle,\r
-              mMacDeviceList.NodeList[mMacDeviceList.CurListLen - AddItemCount].QuestionId,\r
+              NETWORK_DEVICE_LIST_FORM_ID,\r
               mMacDeviceList.NodeList[mMacDeviceList.CurListLen - AddItemCount].PromptId,\r
               STRING_TOKEN (STR_NETWORK_DEVICE_HELP),\r
               EFI_IFR_FLAG_CALLBACK,\r
-              0\r
+              mMacDeviceList.NodeList[mMacDeviceList.CurListLen - AddItemCount].QuestionId\r
               );\r
             AddItemCount -= 1;\r
           }\r
@@ -912,13 +911,13 @@ CallDeviceManager (
         //\r
         // In network device form, only the selected mac address device need to be show.\r
         //\r
-        HiiCreateActionOpCode (\r
+        HiiCreateGotoOpCode (\r
           StartOpCodeHandle,\r
-          (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET),\r
+          NETWORK_DEVICE_FORM_ID,\r
           Token,\r
           TokenHelp,\r
           EFI_IFR_FLAG_CALLBACK,\r
-          0\r
+          (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET)\r
           );\r
       }\r
     } else {\r
@@ -927,13 +926,13 @@ CallDeviceManager (
       // Not network device process, only need to show at device manger form.\r
       //\r
       if (mNextShowFormId == DEVICE_MANAGER_FORM_ID) {\r
-        HiiCreateActionOpCode (\r
+        HiiCreateGotoOpCode (\r
           StartOpCodeHandle,\r
-          (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET),\r
+          DEVICE_MANAGER_FORM_ID,\r
           Token,\r
           TokenHelp,\r
           EFI_IFR_FLAG_CALLBACK,\r
-          0\r
+          (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET)\r
           );\r
       }\r
     }\r
@@ -955,14 +954,14 @@ CallDeviceManager (
     // If driver health protocol is installed, create Driver Health subtitle and entry\r
     //\r
     HiiCreateSubTitleOpCode (StartOpCodeHandle, STRING_TOKEN (STR_DM_DRIVER_HEALTH_TITLE), 0, 0, 0);\r
-    HiiCreateActionOpCode (\r
-      StartOpCodeHandle,                                // Container for dynamic created opcodes\r
-      DEVICE_MANAGER_KEY_DRIVER_HEALTH,                 // Question ID\r
+    HiiCreateGotoOpCode (\r
+      StartOpCodeHandle,\r
+      DRIVER_HEALTH_FORM_ID,\r
       STRING_TOKEN(STR_DRIVER_HEALTH_ALL_HEALTHY),      // Prompt text\r
       STRING_TOKEN(STR_DRIVER_HEALTH_STATUS_HELP),      // Help text\r
-      EFI_IFR_FLAG_CALLBACK,                            // Question flag\r
-      0                                                 // Action String ID\r
-    );\r
+      EFI_IFR_FLAG_CALLBACK,\r
+      DEVICE_MANAGER_KEY_DRIVER_HEALTH                  // Question ID\r
+      );\r
 \r
     //\r
     // Check All Driver health status\r
@@ -1169,6 +1168,7 @@ CallDriverHealth (
   LIST_ENTRY                  *Link;\r
   EFI_DEVICE_PATH_PROTOCOL    *DriverDevicePath;\r
   UINTN                       Length;\r
+  BOOLEAN                     RebootRequired;\r
 \r
   Index               = 0;\r
   Length              = 0;\r
@@ -1293,44 +1293,36 @@ CallDriverHealth (
                      DriverHealthInfo->MessageList->StringId, \r
                      NULL\r
                      );\r
-       //\r
-       // Assert if can not retrieve the message string\r
-       //\r
-       ASSERT (TmpString != NULL);\r
-       StrnCat (String, TmpString, StrLen (TmpString));\r
-       FreePool (TmpString);\r
     } else {\r
       //\r
       // Update the string will be displayed base on the driver's health status\r
       //\r
       switch(DriverHealthInfo->HealthStatus) {\r
       case EfiDriverHealthStatusRepairRequired:\r
-        Length = StrLen (GetStringById (STRING_TOKEN (STR_REPAIR_REQUIRED)));\r
-        StrnCat (String, GetStringById (STRING_TOKEN (STR_REPAIR_REQUIRED)), Length);\r
+        TmpString = GetStringById (STRING_TOKEN (STR_REPAIR_REQUIRED));\r
         break;\r
       case EfiDriverHealthStatusConfigurationRequired:\r
-        Length = StrLen (GetStringById (STRING_TOKEN (STR_CONFIGURATION_REQUIRED)));\r
-        StrnCat (String, GetStringById (STRING_TOKEN (STR_CONFIGURATION_REQUIRED)), Length);\r
+        TmpString = GetStringById (STRING_TOKEN (STR_CONFIGURATION_REQUIRED));\r
         break;\r
       case EfiDriverHealthStatusFailed:\r
-        Length = StrLen (GetStringById (STRING_TOKEN (STR_OPERATION_FAILED)));\r
-        StrnCat (String, GetStringById (STRING_TOKEN (STR_OPERATION_FAILED)), Length);\r
+        TmpString = GetStringById (STRING_TOKEN (STR_OPERATION_FAILED));\r
         break;\r
       case EfiDriverHealthStatusReconnectRequired:\r
-        Length = StrLen (GetStringById (STRING_TOKEN (STR_RECONNECT_REQUIRED)));\r
-        StrnCat (String, GetStringById (STRING_TOKEN (STR_RECONNECT_REQUIRED)), Length);\r
+        TmpString = GetStringById (STRING_TOKEN (STR_RECONNECT_REQUIRED));\r
         break;\r
       case EfiDriverHealthStatusRebootRequired:\r
-        Length = StrLen (GetStringById (STRING_TOKEN (STR_REBOOT_REQUIRED)));\r
-        StrnCat (String, GetStringById (STRING_TOKEN (STR_REBOOT_REQUIRED)), Length);\r
+        TmpString = GetStringById (STRING_TOKEN (STR_REBOOT_REQUIRED));\r
         break;\r
       default:\r
-        Length = StrLen (GetStringById (STRING_TOKEN (STR_DRIVER_HEALTH_HEALTHY)));\r
-        StrnCat (String, GetStringById (STRING_TOKEN (STR_DRIVER_HEALTH_HEALTHY)), Length);\r
+        TmpString = GetStringById (STRING_TOKEN (STR_DRIVER_HEALTH_HEALTHY));\r
         break;\r
       }\r
     }\r
 \r
+    ASSERT (TmpString != NULL);\r
+    StrCat (String, TmpString);\r
+    FreePool (TmpString);\r
+\r
     Token = HiiSetString (HiiHandle, 0, String, NULL);\r
     FreePool (String);\r
 \r
@@ -1440,15 +1432,20 @@ CallDriverHealth (
         //\r
         // Process the driver's healthy status for the specify module\r
         //\r
+        RebootRequired = FALSE;\r
         ProcessSingleControllerHealth (\r
           DriverHealthInfo->DriverHealth,\r
           DriverHealthInfo->ControllerHandle,      \r
           DriverHealthInfo->ChildHandle,\r
           DriverHealthInfo->HealthStatus,\r
           &(DriverHealthInfo->MessageList),\r
-          DriverHealthInfo->HiiHandle\r
-       );  \r
-       break;\r
+          DriverHealthInfo->HiiHandle,\r
+          &RebootRequired\r
+          );\r
+        if (RebootRequired) {\r
+          gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);\r
+        }\r
+        break;\r
       }\r
       Index++;\r
       Link = GetNextNode (&DriverHealthList, Link);\r
@@ -1935,15 +1932,17 @@ PlaformHealthStatusCheck (
                             ChildHandle.  This is an optional parameter that may be NULL.\r
   @param FormHiiHandle      The HII handle for an HII form associated with the \r
                             controller specified by ControllerHandle and ChildHandle.\r
+  @param RebootRequired     Indicate whether a reboot is required to repair the controller.\r
 **/\r
 VOID\r
 ProcessSingleControllerHealth (\r
-    IN  EFI_DRIVER_HEALTH_PROTOCOL         *DriverHealth,\r
-    IN  EFI_HANDLE                         ControllerHandle, OPTIONAL\r
-    IN  EFI_HANDLE                         ChildHandle,      OPTIONAL\r
-    IN  EFI_DRIVER_HEALTH_STATUS           HealthStatus,\r
-    IN  EFI_DRIVER_HEALTH_HII_MESSAGE      **MessageList,    OPTIONAL\r
-    IN  EFI_HII_HANDLE                     FormHiiHandle\r
+  IN  EFI_DRIVER_HEALTH_PROTOCOL         *DriverHealth,\r
+  IN  EFI_HANDLE                         ControllerHandle, OPTIONAL\r
+  IN  EFI_HANDLE                         ChildHandle,      OPTIONAL\r
+  IN  EFI_DRIVER_HEALTH_STATUS           HealthStatus,\r
+  IN  EFI_DRIVER_HEALTH_HII_MESSAGE      **MessageList,    OPTIONAL\r
+  IN  EFI_HII_HANDLE                     FormHiiHandle,\r
+  IN OUT BOOLEAN                         *RebootRequired\r
   )\r
 {\r
   EFI_STATUS                         Status;\r
@@ -1955,8 +1954,8 @@ ProcessSingleControllerHealth (
   // reach a terminal status. The status from EfiDriverHealthStatusRepairRequired after repair \r
   // will be in (Health, Failed, Configuration Required).\r
   //\r
-  while( LocalHealthStatus == EfiDriverHealthStatusConfigurationRequired ||\r
-         LocalHealthStatus == EfiDriverHealthStatusRepairRequired) {\r
+  while(LocalHealthStatus == EfiDriverHealthStatusConfigurationRequired ||\r
+        LocalHealthStatus == EfiDriverHealthStatusRepairRequired) {\r
 \r
     if (LocalHealthStatus == EfiDriverHealthStatusRepairRequired) {\r
       Status = DriverHealth->Repair (\r
@@ -1972,16 +1971,23 @@ ProcessSingleControllerHealth (
     // (Healthy, Reboot Required, Failed, Reconnect Required, Repair Required).   \r
     //\r
     if (LocalHealthStatus == EfiDriverHealthStatusConfigurationRequired) {\r
-      Status = gFormBrowser2->SendForm (\r
-                                gFormBrowser2,\r
-                                &FormHiiHandle,\r
-                                1,\r
-                                &gEfiHiiDriverHealthFormsetGuid,\r
-                                0,\r
-                                NULL,\r
-                                NULL\r
-                                );\r
-      ASSERT( !EFI_ERROR (Status));\r
+      if (FormHiiHandle != NULL) {\r
+        Status = gFormBrowser2->SendForm (\r
+                                  gFormBrowser2,\r
+                                  &FormHiiHandle,\r
+                                  1,\r
+                                  &gEfiHiiDriverHealthFormsetGuid,\r
+                                  0,\r
+                                  NULL,\r
+                                  NULL\r
+                                  );\r
+        ASSERT( !EFI_ERROR (Status));\r
+      } else {\r
+        //\r
+        // Exit the loop in case no FormHiiHandle is supplied to prevent dead-loop\r
+        //\r
+        break;\r
+      }\r
     }\r
 \r
     Status = DriverHealth->GetHealthStatus (\r
@@ -1992,11 +1998,11 @@ ProcessSingleControllerHealth (
                               NULL,\r
                               &FormHiiHandle\r
                               );\r
-   ASSERT_EFI_ERROR (Status);\r
+    ASSERT_EFI_ERROR (Status);\r
 \r
-   if (*MessageList != NULL) {\r
+    if (*MessageList != NULL) {\r
       ProcessMessages (*MessageList);\r
-   }  \r
+    }  \r
   }\r
   \r
   //\r
@@ -2011,7 +2017,7 @@ ProcessSingleControllerHealth (
   // Check for RebootRequired or ReconnectRequired\r
   //\r
   if (LocalHealthStatus == EfiDriverHealthStatusRebootRequired) {\r
-    gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);\r
+    *RebootRequired = TRUE;\r
   }\r
   \r
   //\r
@@ -2020,12 +2026,13 @@ ProcessSingleControllerHealth (
   if (LocalHealthStatus == EfiDriverHealthStatusReconnectRequired) {\r
     Status = gBS->DisconnectController (ControllerHandle, NULL, NULL);\r
     if (EFI_ERROR (Status)) {\r
-        //\r
-        // Disconnect failed.  Need to promote reconnect to a reboot.\r
-        //\r
-        gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);\r
+      //\r
+      // Disconnect failed.  Need to promote reconnect to a reboot.\r
+      //\r
+      *RebootRequired = TRUE;\r
+    } else {\r
+      gBS->ConnectController (ControllerHandle, NULL, NULL, TRUE);\r
     }\r
-    gBS->ConnectController (ControllerHandle, NULL, NULL, TRUE);\r
   }\r
 }\r
 \r
@@ -2118,12 +2125,16 @@ PlatformRepairAll (
 { \r
   DRIVER_HEALTH_INFO          *DriverHealthInfo;\r
   LIST_ENTRY                  *Link;\r
+  BOOLEAN                     RebootRequired;\r
 \r
   ASSERT (DriverHealthList != NULL);\r
 \r
-  Link = GetFirstNode (DriverHealthList);\r
+  RebootRequired = FALSE;\r
 \r
-  while (!IsNull (DriverHealthList, Link)) {   \r
+  for ( Link = GetFirstNode (DriverHealthList)\r
+      ; !IsNull (DriverHealthList, Link)\r
+      ; Link = GetNextNode (DriverHealthList, Link)\r
+      ) {\r
     DriverHealthInfo = DEVICE_MANAGER_HEALTH_INFO_FROM_LINK (Link);\r
     //\r
     // Do driver health status operation by each link node\r
@@ -2131,15 +2142,18 @@ PlatformRepairAll (
     ASSERT (DriverHealthInfo != NULL);\r
 \r
     ProcessSingleControllerHealth ( \r
-        DriverHealthInfo->DriverHealth,\r
-        DriverHealthInfo->ControllerHandle,\r
-        DriverHealthInfo->ChildHandle,\r
-        DriverHealthInfo->HealthStatus,\r
-        &(DriverHealthInfo->MessageList),\r
-        DriverHealthInfo->HiiHandle\r
-        );\r
+      DriverHealthInfo->DriverHealth,\r
+      DriverHealthInfo->ControllerHandle,\r
+      DriverHealthInfo->ChildHandle,\r
+      DriverHealthInfo->HealthStatus,\r
+      &(DriverHealthInfo->MessageList),\r
+      DriverHealthInfo->HiiHandle,\r
+      &RebootRequired\r
+      );\r
+  }\r
 \r
-    Link = GetNextNode (DriverHealthList, Link);\r
+  if (RebootRequired) {\r
+    gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);\r
   }\r
 }\r
 \r