]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
MdeModulePkg/Ip4Dxe: Clean up IP4 interface if failed to open ARP protocol.
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / Setup.c
index 451fd037073cf8caf85cf39037f8abce2dde1ff2..c2cfa5c5c829c582f0bbc804d30e8f0f838f89ed 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Entry and initialization module for the browser.\r
 \r
-Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2007 - 2017, 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
@@ -53,7 +53,8 @@ LIST_ENTRY      gBrowserStorageList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserSto
 LIST_ENTRY      gBrowserSaveFailFormSetList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserSaveFailFormSetList);\r
 \r
 BOOLEAN               mSystemSubmit = FALSE;\r
-BOOLEAN               gResetRequired;\r
+BOOLEAN               gResetRequiredFormLevel;\r
+BOOLEAN               gResetRequiredSystemLevel = FALSE;\r
 BOOLEAN               gExitRequired;\r
 BOOLEAN               gFlagReconnect;\r
 BOOLEAN               gCallbackReconnect;\r
@@ -499,7 +500,7 @@ SendForm (
   SaveBrowserContext ();\r
 \r
   gFlagReconnect = FALSE;\r
-  gResetRequired = FALSE;\r
+  gResetRequiredFormLevel = FALSE;\r
   gExitRequired  = FALSE;\r
   gCallbackReconnect = FALSE;\r
   Status         = EFI_SUCCESS;\r
@@ -579,7 +580,7 @@ SendForm (
 \r
   if (ActionRequest != NULL) {\r
     *ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
-    if (gResetRequired) {\r
+    if (gResetRequiredFormLevel) {\r
       *ActionRequest = EFI_BROWSER_ACTION_REQUEST_RESET;\r
     }\r
   }\r
@@ -1367,6 +1368,71 @@ ConfigRespToStorage (
   return Status;\r
 }\r
 \r
+/**\r
+  Get bit field value from the buffer and then set the value for the question.\r
+  Note: Data type UINT32 can cover all the bit field value.\r
+\r
+  @param  Question        The question refer to bit field.\r
+  @param  Buffer          Point to the buffer which the question value get from.\r
+\r
+**/\r
+VOID\r
+GetBitsQuestionValue (\r
+  IN  FORM_BROWSER_STATEMENT *Question,\r
+  IN  UINT8                  *Buffer\r
+  )\r
+{\r
+  UINTN    StartBit;\r
+  UINTN    EndBit;\r
+  UINT32   RetVal;\r
+  UINT32   BufferValue;\r
+\r
+  StartBit = Question->BitVarOffset % 8;\r
+  EndBit = StartBit + Question->BitStorageWidth - 1;\r
+\r
+  CopyMem ((UINT8 *) &BufferValue, Buffer, Question->StorageWidth);\r
+\r
+  RetVal = BitFieldRead32 (BufferValue, StartBit, EndBit);\r
+\r
+  //\r
+  // Set question value.\r
+  // Note: Since Question with BufferValue (orderedlist, password, string)are not supported to refer bit field.\r
+  // Only oneof/checkbox/oneof can support bit field.So we can copy the value to the Hiivalue of Question directly.\r
+  //\r
+  CopyMem ((UINT8 *) &Question->HiiValue.Value, (UINT8 *) &RetVal, Question->StorageWidth);\r
+}\r
+\r
+/**\r
+  Set bit field value to the buffer.\r
+  Note: Data type UINT32 can cover all the bit field value.\r
+\r
+  @param  Question        The question refer to bit field.\r
+  @param  Buffer          Point to the buffer which the question value set to.\r
+  @param  Value           The bit field value need to set.\r
+\r
+**/\r
+VOID\r
+SetBitsQuestionValue (\r
+  IN     FORM_BROWSER_STATEMENT *Question,\r
+  IN OUT UINT8                  *Buffer,\r
+  IN     UINT32                 Value\r
+  )\r
+{\r
+  UINT32   Operand;\r
+  UINTN    StartBit;\r
+  UINTN    EndBit;\r
+  UINT32   RetVal;\r
+\r
+  StartBit = Question->BitVarOffset % 8;\r
+  EndBit = StartBit + Question->BitStorageWidth - 1;\r
+\r
+  CopyMem ((UINT8*) &Operand, Buffer, Question->StorageWidth);\r
+\r
+  RetVal = BitFieldWrite32 (Operand, StartBit, EndBit, Value);\r
+\r
+  CopyMem (Buffer, (UINT8*) &RetVal, Question->StorageWidth);\r
+}\r
+\r
 /**\r
   Convert the buffer value to HiiValue.\r
 \r
@@ -1394,6 +1460,9 @@ BufferToValue (
   BOOLEAN                      IsString;\r
   UINTN                        Length;\r
   EFI_STATUS                   Status;\r
+  UINT8                        *Buffer;\r
+\r
+  Buffer = NULL;\r
 \r
   IsString = (BOOLEAN) ((Question->HiiValue.Type == EFI_IFR_TYPE_STRING) ?  TRUE : FALSE);\r
   if (Question->Storage->Type == EFI_HII_VARSTORE_BUFFER || \r
@@ -1415,7 +1484,15 @@ BufferToValue (
     //\r
     // Other type of Questions\r
     //\r
-    Dst = (UINT8 *) &Question->HiiValue.Value;\r
+    if (Question->QuestionReferToBitField) {\r
+      Buffer = (UINT8 *)AllocateZeroPool (Question->StorageWidth);\r
+      if (Buffer == NULL) {\r
+        return EFI_OUT_OF_RESOURCES;\r
+      }\r
+      Dst = Buffer;\r
+    } else {\r
+      Dst = (UINT8 *) &Question->HiiValue.Value;\r
+    }\r
   }\r
 \r
   //\r
@@ -1473,6 +1550,11 @@ BufferToValue (
 \r
   *StringPtr = TempChar;\r
 \r
+  if (Buffer != NULL && Question->QuestionReferToBitField) {\r
+    GetBitsQuestionValue (Question, Buffer);\r
+    FreePool (Buffer);\r
+  }\r
+\r
   return Status;\r
 }\r
 \r
@@ -1677,13 +1759,23 @@ GetQuestionValue (
       if (GetValueFrom == GetSetValueWithEditBuffer) {\r
         //\r
         // Copy from storage Edit buffer\r
+        // If the Question refer to bit filed, get the value in the related bit filed.\r
         //\r
-        CopyMem (Dst, Storage->EditBuffer + Question->VarStoreInfo.VarOffset, StorageWidth);\r
+        if (Question->QuestionReferToBitField) {\r
+          GetBitsQuestionValue (Question, Storage->EditBuffer + Question->VarStoreInfo.VarOffset);\r
+        } else {\r
+          CopyMem (Dst, Storage->EditBuffer + Question->VarStoreInfo.VarOffset, StorageWidth);\r
+        }\r
       } else {\r
         //\r
         // Copy from storage Edit buffer\r
+        // If the Question refer to bit filed, get the value in the related bit filed.\r
         //\r
-        CopyMem (Dst, Storage->Buffer + Question->VarStoreInfo.VarOffset, StorageWidth);\r
+        if (Question->QuestionReferToBitField) {\r
+          GetBitsQuestionValue (Question, Storage->Buffer + Question->VarStoreInfo.VarOffset);\r
+        } else {\r
+          CopyMem (Dst, Storage->Buffer + Question->VarStoreInfo.VarOffset, StorageWidth);\r
+        }\r
       }\r
     } else {\r
       Value = NULL;\r
@@ -1949,13 +2041,23 @@ SetQuestionValue (
       if (SetValueTo == GetSetValueWithEditBuffer) {\r
         //\r
         // Copy to storage edit buffer\r
-        //      \r
-        CopyMem (Storage->EditBuffer + Question->VarStoreInfo.VarOffset, Src, StorageWidth);\r
+        // If the Question refer to bit filed, copy the value in related bit filed to storage edit buffer.\r
+        //\r
+        if (Question->QuestionReferToBitField) {\r
+          SetBitsQuestionValue (Question, Storage->EditBuffer + Question->VarStoreInfo.VarOffset, (UINT32)(*Src));\r
+        } else {\r
+          CopyMem (Storage->EditBuffer + Question->VarStoreInfo.VarOffset, Src, StorageWidth);\r
+        }\r
       } else if (SetValueTo == GetSetValueWithBuffer) {\r
         //\r
-        // Copy to storage edit buffer\r
-        //     \r
-        CopyMem (Storage->Buffer + Question->VarStoreInfo.VarOffset, Src, StorageWidth);\r
+        // Copy to storage buffer\r
+        // If the Question refer to bit filed, copy the value in related bit filed to storage buffer.\r
+        //\r
+        if (Question->QuestionReferToBitField) {\r
+          SetBitsQuestionValue (Question, Storage->Buffer + Question->VarStoreInfo.VarOffset, (UINT32)(*Src));\r
+        } else {\r
+          CopyMem (Storage->Buffer + Question->VarStoreInfo.VarOffset, Src, StorageWidth);\r
+        }\r
       }\r
     } else {\r
       if (IsString) {\r
@@ -1972,7 +2074,14 @@ SetQuestionValue (
         TemName = (CHAR16 *) Src;\r
         TemString = Value;\r
         for (; *TemName != L'\0'; TemName++) {\r
-          TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);\r
+          UnicodeValueToStringS (\r
+            TemString,\r
+            BufferLen - ((UINTN)TemString - (UINTN)Value),\r
+            PREFIX_ZERO | RADIX_HEX,\r
+            *TemName,\r
+            4\r
+            );\r
+          TemString += StrnLenS (TemString, (BufferLen - ((UINTN)TemString - (UINTN)Value)) / sizeof (CHAR16));\r
         }\r
       } else {\r
         BufferLen = StorageWidth * 2 + 1;\r
@@ -1984,7 +2093,14 @@ SetQuestionValue (
         TemBuffer = Src + StorageWidth - 1;\r
         TemString = Value;\r
         for (Index = 0; Index < StorageWidth; Index ++, TemBuffer --) {\r
-          TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);\r
+          UnicodeValueToStringS (\r
+            TemString,\r
+            BufferLen * sizeof (CHAR16) - ((UINTN)TemString - (UINTN)Value),\r
+            PREFIX_ZERO | RADIX_HEX,\r
+            *TemBuffer,\r
+            2\r
+            );\r
+          TemString += StrnLenS (TemString, BufferLen - ((UINTN)TemString - (UINTN)Value) / sizeof (CHAR16));\r
         }\r
       }\r
 \r
@@ -2034,7 +2150,14 @@ SetQuestionValue (
       TemName = (CHAR16 *) Src;\r
       TemString = Value;\r
       for (; *TemName != L'\0'; TemName++) {\r
-        TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);\r
+        UnicodeValueToStringS (\r
+          TemString,\r
+          MaxLen * sizeof (CHAR16) - ((UINTN)TemString - (UINTN)ConfigResp),\r
+          PREFIX_ZERO | RADIX_HEX,\r
+          *TemName,\r
+          4\r
+          );\r
+        TemString += StrnLenS (TemString, MaxLen - ((UINTN)TemString - (UINTN)ConfigResp) / sizeof (CHAR16));\r
       }\r
     } else {\r
       //\r
@@ -2043,7 +2166,14 @@ SetQuestionValue (
       TemBuffer = Src + StorageWidth - 1;\r
       TemString = Value;\r
       for (Index = 0; Index < StorageWidth; Index ++, TemBuffer --) {\r
-        TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);\r
+        UnicodeValueToStringS (\r
+          TemString,\r
+          MaxLen * sizeof (CHAR16) - ((UINTN)TemString - (UINTN)ConfigResp),\r
+          PREFIX_ZERO | RADIX_HEX,\r
+          *TemBuffer,\r
+          2\r
+          );\r
+        TemString += StrnLenS (TemString, MaxLen - ((UINTN)TemString - (UINTN)ConfigResp) / sizeof (CHAR16));\r
       }\r
     }\r
 \r
@@ -2650,7 +2780,8 @@ UpdateFlagForForm (
     //\r
     if (SetFlag && OldValue && !Question->ValueChanged) {\r
       if ((Question->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0) {\r
-        gResetRequired = TRUE;\r
+        gResetRequiredFormLevel = TRUE;\r
+        gResetRequiredSystemLevel = TRUE;\r
       }\r
 \r
       if ((Question->QuestionFlags & EFI_IFR_FLAG_RECONNECT_REQUIRED) != 0) {\r
@@ -3535,6 +3666,7 @@ SubmitForSystem (
 {\r
   EFI_STATUS              Status;\r
   LIST_ENTRY              *Link;\r
+  LIST_ENTRY              *FormLink;\r
   LIST_ENTRY              *StorageLink;\r
   FORMSET_STORAGE         *FormSetStorage;\r
   FORM_BROWSER_FORM       *Form;\r
@@ -3625,10 +3757,10 @@ SubmitForSystem (
         }\r
       }\r
 \r
-      Link = GetFirstNode (&LocalFormSet->FormListHead);\r
-      while (!IsNull (&LocalFormSet->FormListHead, Link)) {\r
-        Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
-        Link = GetNextNode (&LocalFormSet->FormListHead, Link);\r
+      FormLink = GetFirstNode (&LocalFormSet->FormListHead);\r
+      while (!IsNull (&LocalFormSet->FormListHead, FormLink)) {\r
+        Form = FORM_BROWSER_FORM_FROM_LINK (FormLink);\r
+        FormLink = GetNextNode (&LocalFormSet->FormListHead, FormLink);\r
         //\r
         // Call callback with Changed type to inform the driver.\r
         //\r
@@ -5888,7 +6020,7 @@ SaveBrowserContext (
   // Save FormBrowser context\r
   //\r
   Context->Selection            = gCurrentSelection;\r
-  Context->ResetRequired        = gResetRequired;\r
+  Context->ResetRequired        = gResetRequiredFormLevel;\r
   Context->FlagReconnect        = gFlagReconnect;\r
   Context->CallbackReconnect    = gCallbackReconnect;\r
   Context->ExitRequired         = gExitRequired;\r
@@ -5961,7 +6093,7 @@ RestoreBrowserContext (
   // Restore FormBrowser context\r
   //\r
   gCurrentSelection     = Context->Selection;\r
-  gResetRequired        = Context->ResetRequired;\r
+  gResetRequiredFormLevel = Context->ResetRequired;\r
   gFlagReconnect        = Context->FlagReconnect;\r
   gCallbackReconnect    = Context->CallbackReconnect;\r
   gExitRequired         = Context->ExitRequired;\r
@@ -6436,7 +6568,8 @@ ExecuteAction (
   // Executet the reset action.\r
   //\r
   if ((Action & BROWSER_ACTION_RESET) != 0) {\r
-    gResetRequired = TRUE;\r
+    gResetRequiredFormLevel = TRUE;\r
+    gResetRequiredSystemLevel = TRUE;\r
   }\r
 \r
   //\r
@@ -6536,6 +6669,6 @@ IsResetRequired (
   VOID\r
   )\r
 {\r
-  return gResetRequired;\r
+  return gResetRequiredSystemLevel;\r
 }\r
 \r