]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.c
Fix a bug which cause the thunk code failed to handle creation of "One Of" and "Order...
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / OpcodeCreation.c
index 391e698d1e8c6de2c55696a996bfec34802278fb..e71cb9d8b91c87c385f9bcad064d967cb267f140 100644 (file)
@@ -269,7 +269,8 @@ EFI_STATUS
 F2UCreateOneOfOpCode (\r
   IN CONST FRAMEWORK_EFI_IFR_ONE_OF    *FwOpcode,\r
   OUT      EFI_HII_UPDATE_DATA         *UefiData,\r
-  OUT      FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode\r
+  OUT      FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,\r
+  OUT      UINTN                       *DataCount\r
   )\r
 {\r
   EFI_STATUS     Status;\r
@@ -278,7 +279,11 @@ F2UCreateOneOfOpCode (
   FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOneOfOp;\r
   BOOLEAN        HasQuestionId;\r
 \r
+  ASSERT (NextFwOpcode != NULL);\r
+  ASSERT (DataCount != NULL);\r
+\r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
+  *DataCount = 0;\r
 \r
   UOpcode.Header.Length = sizeof(UOpcode);\r
   UOpcode.Header.OpCode = EFI_IFR_ONE_OF_OP;\r
@@ -291,6 +296,7 @@ F2UCreateOneOfOpCode (
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
+  *DataCount += 1;\r
 \r
   //\r
   // Go over the Framework IFR binary to get the QuestionId for generated UEFI One Of Option opcode\r
@@ -318,11 +324,14 @@ F2UCreateOneOfOpCode (
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
+    FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
+    *DataCount += 1;\r
   }\r
 \r
   Status = UCreateEndOfOpcode (UefiData);\r
   if (!EFI_ERROR (Status)) {\r
     *NextFwOpcode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
+    *DataCount += 1;\r
   }\r
 \r
   return Status;\r
@@ -360,7 +369,8 @@ EFI_STATUS
 F2UCreateOrderedListOpCode (\r
   IN CONST FRAMEWORK_EFI_IFR_ORDERED_LIST *FwOpcode,\r
   OUT      EFI_HII_UPDATE_DATA         *UefiData,\r
-  OUT      FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode\r
+  OUT      FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,\r
+  OUT      UINTN                       *DataCount\r
   )\r
 {\r
   EFI_IFR_ORDERED_LIST              UOpcode;\r
@@ -368,6 +378,7 @@ F2UCreateOrderedListOpCode (
   FRAMEWORK_EFI_IFR_OP_HEADER       *FwOpHeader;\r
 \r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
+  *DataCount = 0;\r
 \r
   UOpcode.Header.Length = sizeof(UOpcode);\r
   UOpcode.Header.OpCode = EFI_IFR_ORDERED_LIST_OP;\r
@@ -382,6 +393,7 @@ F2UCreateOrderedListOpCode (
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
+  *DataCount += 1;\r
 \r
   FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
   while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
@@ -389,14 +401,17 @@ F2UCreateOrderedListOpCode (
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
+    FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
+    *DataCount += 1;\r
   }\r
 \r
   Status = UCreateEndOfOpcode (UefiData);\r
   if (!EFI_ERROR (Status)) {\r
     *NextFwOpcode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
+    *DataCount += 1;\r
   }\r
 \r
-  return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
+  return Status;\r
 }\r
 \r
 /*\r
@@ -751,6 +766,7 @@ ThunkFrameworkUpdateDataToUefiUpdateData (
   EFI_HII_UPDATE_DATA                  *UefiUpdateDataBuffer;\r
   UINTN                                Index;\r
   EFI_STATUS                           Status;\r
+  UINTN                                DataCount;\r
   static UINTN                         mOneOfOptionWidth;\r
 \r
   mOneOfOptionWidth = 0;\r
@@ -771,7 +787,12 @@ ThunkFrameworkUpdateDataToUefiUpdateData (
 \r
   FrameworkOpcodeBuffer = (FRAMEWORK_EFI_IFR_OP_HEADER *) &Data->Data;\r
 \r
-  for (Index = 0; Index < Data->DataCount; Index++) {\r
+  for (Index = 0; Index < Data->DataCount; Index += DataCount) {\r
+    //\r
+    // By default Datacount is 1. For FRAMEWORK_EFI_IFR_ONE_OF_OP and FRAMEWORK_EFI_IFR_ORDERED_LIST_OP,\r
+    // DataCount maybe more than 1.\r
+    //\r
+    DataCount = 1;\r
     switch (FrameworkOpcodeBuffer->OpCode) {\r
       case FRAMEWORK_EFI_IFR_SUBTITLE_OP:\r
         Status = F2UCreateSubtitleOpCode ((FRAMEWORK_EFI_IFR_SUBTITLE  *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer);\r
@@ -786,7 +807,7 @@ ThunkFrameworkUpdateDataToUefiUpdateData (
         break;\r
         \r
       case FRAMEWORK_EFI_IFR_ONE_OF_OP:\r
-        Status = F2UCreateOneOfOpCode ((FRAMEWORK_EFI_IFR_ONE_OF *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer, &NextFrameworkOpcodeBuffer);\r
+        Status = F2UCreateOneOfOpCode ((FRAMEWORK_EFI_IFR_ONE_OF *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer, &NextFrameworkOpcodeBuffer, &DataCount);\r
         if (!EFI_ERROR (Status)) {\r
           FrameworkOpcodeBuffer = NextFrameworkOpcodeBuffer;\r
           //\r
@@ -797,7 +818,7 @@ ThunkFrameworkUpdateDataToUefiUpdateData (
         break;\r
 \r
       case FRAMEWORK_EFI_IFR_ORDERED_LIST_OP:\r
-        Status = F2UCreateOrderedListOpCode ((FRAMEWORK_EFI_IFR_ORDERED_LIST *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer, &NextFrameworkOpcodeBuffer);\r
+        Status = F2UCreateOrderedListOpCode ((FRAMEWORK_EFI_IFR_ORDERED_LIST *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer, &NextFrameworkOpcodeBuffer, &DataCount);\r
         if (!EFI_ERROR (Status)) {\r
           FrameworkOpcodeBuffer = NextFrameworkOpcodeBuffer;\r
           //\r