]> 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 83dc2b86c7fad165db4e5a943a4550bb8062faee..c2cfa5c5c829c582f0bbc804d30e8f0f838f89ed 100644 (file)
@@ -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
@@ -2678,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
@@ -5917,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
@@ -5990,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
@@ -6465,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
@@ -6565,6 +6669,6 @@ IsResetRequired (
   VOID\r
   )\r
 {\r
-  return gResetRequired;\r
+  return gResetRequiredSystemLevel;\r
 }\r
 \r