]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Fix a bug which cause the thunk code failed to handle creation of "One Of" and "Order...
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 30 Apr 2008 15:51:00 +0000 (15:51 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 30 Apr 2008 15:51:00 +0000 (15:51 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5156 6f19259b-4bc3-4df7-8a09-765794883524

EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.h

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
index 061937d675e56fc2f80983607afd266fb77df9ae..7324c908ce9799d21de40685ddf67060ebfd1dcd 100644 (file)
@@ -56,7 +56,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
 \r
@@ -64,7 +65,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
 \r