I fixed following bugs.
authormikewuping <mikewuping@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 16 Oct 2006 02:48:19 +0000 (02:48 +0000)
committermikewuping <mikewuping@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 16 Oct 2006 02:48:19 +0000 (02:48 +0000)
1. In dependency.c, DXE Dispatcher doesn't check the dependency expression boundary correctly.
2. In page.c, a misspelling code in DXE core memory service code, duplicate code.
3. In gcd.c, according to DXE CIS 0-91 spec, When GcdAllocateType is EfiGcdAllocateMaxAddressSearchBottomUp or EfiGcdAllocateMaxAddressSearchTopDown, then the GCD memory space map is searched from the lowest address up to BaseAddress (or from BaseAddress down to the lowest address) looking for unallocated memory ranges of Length bytes. Here, BaseAddress itself is inclusive, that is, any range in [0, BaseAddress] is allowable. But current code BaseAddress to be exclusive.
4. In Ebcinit.c, EbcDebugRegisterPeriodicCallback() not check whether it is already registered.
5. In Ebcinit.c, EbcDebugRegisterExceptionCallback() not check whether it is already registered.
6. In Ebcinit.c, EbcDebugSignalException() does not assign value to EbcContext.ControlFlags.
7. In Ebcinit.c, EBC: StatusCodeValue should use EFI_SOFTWARE_EBC_EXCEPTION.
8. In Ebcinit.c, EbcDebugRegisterExceptionCallback() does not check ExceptionType
9. In ElTorito.c, BlockIo and DiskIo failed in SCT when there is CD in CD-ROM.
10. In Mbr.c, MBR code can't handle some situations. That is when there are 3 partitions in HD, if delete the first partition, it will not be able to recognize the other two partitions, and if delete the second partition, it will not be able to recognize the third partition.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1749 6f19259b-4bc3-4df7-8a09-765794883524

EdkModulePkg/Core/Dxe/Dispatcher/dependency.c
EdkModulePkg/Core/Dxe/Gcd/gcd.c
EdkModulePkg/Core/Dxe/Mem/Page.c
EdkModulePkg/Universal/Disk/Partition/Dxe/ElTorito.c
EdkModulePkg/Universal/Disk/Partition/Dxe/Gpt.c
EdkModulePkg/Universal/Disk/Partition/Dxe/Mbr.c
EdkModulePkg/Universal/Disk/Partition/Dxe/Mbr.h
EdkModulePkg/Universal/Ebc/Dxe/EbcInt.c

index e6dc3282e64cb84b145bbc990e962575d7737ff4..c6ab876040f70710641df4070be40fa3c3220ea3 100644 (file)
@@ -303,7 +303,7 @@ Returns:
     // Check to see if we are attempting to fetch dependency expression instructions\r
     // past the end of the dependency expression.\r
     //\r
-    if (((UINTN)Iterator - (UINTN)DriverEntry->Depex) > DriverEntry->DepexSize) {\r
+    if (((UINTN)Iterator - (UINTN)DriverEntry->Depex) >= DriverEntry->DepexSize) {\r
       return FALSE;\r
     }\r
 \r
index 73037edb24d4268c7d530abc83741802368e7b70..208c05a0157b3305d9f59c32dea9f11472aaea1d 100644 (file)
@@ -1094,7 +1094,7 @@ Returns:
     //\r
     if (GcdAllocateType == EfiGcdAllocateMaxAddressSearchBottomUp ||\r
         GcdAllocateType == EfiGcdAllocateMaxAddressSearchTopDown     ) {\r
-      MaxAddress = *BaseAddress - 1;\r
+      MaxAddress = *BaseAddress;\r
     } else {\r
       MaxAddress = Entry->EndAddress;\r
     }\r
@@ -1103,7 +1103,7 @@ Returns:
     // Verify that the list of descriptors are unallocated memory matching GcdMemoryType.\r
     //\r
     if (GcdAllocateType == EfiGcdAllocateMaxAddressSearchTopDown ||\r
-        GcdAllocateType == EfiGcdAllocateAnySearchTopDown           ) {\r
+        GcdAllocateType == EfiGcdAllocateAnySearchTopDown ) {\r
       Link = Map->BackLink;\r
     } else {\r
       Link = Map->ForwardLink;\r
index e65b0283c60880e2e6aab1a98fce02b6cbf6a158..d14468945f2615762f90becbeb27e777807a7cfa 100644 (file)
@@ -1392,7 +1392,7 @@ Returns:
         \r
         MemoryMap->PhysicalStart = GcdMapEntry->BaseAddress;\r
         MemoryMap->VirtualStart  = 0;\r
-        MemoryMap->NumberOfPages = MemoryMap->NumberOfPages = RShiftU64 ((GcdMapEntry->EndAddress - GcdMapEntry->BaseAddress + 1), EFI_PAGE_SHIFT);\r
+        MemoryMap->NumberOfPages = RShiftU64 ((GcdMapEntry->EndAddress - GcdMapEntry->BaseAddress + 1), EFI_PAGE_SHIFT);\r
         MemoryMap->Attribute     = GcdMapEntry->Attributes & ~EFI_MEMORY_PORT_IO;\r
 \r
         if (GcdMapEntry->GcdMemoryType == EfiGcdMemoryTypeReserved) {\r
index 27beba171b6fd4e129e8076b36c1fb1723d66ecb..88d0c7223d4a3c68427065afe30295ee45f4b534 100644 (file)
@@ -133,7 +133,7 @@ Returns:
     // the 32-bit numerical values is stored in Both-byte orders\r
     //\r
     if (VolDescriptor->Type == CDVOL_TYPE_CODED) {\r
-      VolSpaceSize = VolDescriptor->VolSpaceSize[1];\r
+      VolSpaceSize = VolDescriptor->VolSpaceSize[0];\r
     }\r
     //\r
     // Is it an El Torito volume descriptor?\r
@@ -242,7 +242,14 @@ Returns:
       BootEntry++;\r
       CdDev.PartitionStart = Catalog->Boot.Lba;\r
       if (SectorCount < 2) {\r
-        CdDev.PartitionSize = VolSpaceSize;\r
+        //\r
+        // When the SectorCount < 2, set the Partition as the whole CD.\r
+        //\r
+        if (VolSpaceSize > (Media->LastBlock + 1)) {\r
+          CdDev.PartitionSize = (UINT32)(Media->LastBlock - Catalog->Boot.Lba + 1);\r
+        } else {\r
+          CdDev.PartitionSize = (UINT32)(VolSpaceSize - Catalog->Boot.Lba);\r
+        }\r
       } else {\r
         CdDev.PartitionSize = DivU64x32 (\r
                                 MultU64x32 (\r
index 9077ac63c2e067a99bf83996bb9bfe46d10d92ec..6404c753ae58b967620e2f93bbd92d47d446cebc 100644 (file)
@@ -154,7 +154,7 @@ Returns:
   // Verify that the Protective MBR is valid\r
   //\r
   if (ProtectiveMbr->Partition[0].BootIndicator != 0x00 ||\r
-      ProtectiveMbr->Partition[0].OSIndicator != 0xEE ||\r
+      ProtectiveMbr->Partition[0].OSIndicator != PMBR_GPT_PARTITION ||\r
       UNPACK_UINT32 (ProtectiveMbr->Partition[0].StartingLBA) != 1\r
       ) {\r
     goto Done;\r
index 07e3cbe4591e295ca62961aded6611121f8560af..0930292a9c840714d457913cf5a9ab06e83d92da 100644 (file)
@@ -209,7 +209,7 @@ Returns:
         continue;\r
       }\r
 \r
-      if (Mbr->Partition[Index].OSIndicator == 0xEE) {\r
+      if (Mbr->Partition[Index].OSIndicator == PMBR_GPT_PARTITION) {\r
         //\r
         // This is the guard MBR for the GPT. If you ever see a GPT disk with zero partitions you can get here.\r
         //  We can not produce an MBR BlockIo for this device as the MBR spans the GPT headers. So formating \r
@@ -265,6 +265,11 @@ Returns:
         break;\r
       }\r
 \r
+      if ((Mbr->Partition[0].OSIndicator == EXTENDED_DOS_PARTITION) ||\r
+          (Mbr->Partition[0].OSIndicator == EXTENDED_WINDOWS_PARTITION)) {\r
+        ExtMbrStartingLba = UNPACK_UINT32 (Mbr->Partition[0].StartingLBA);\r
+        continue;\r
+      }\r
       HdDev.PartitionNumber = PartitionNumber ++;\r
       HdDev.PartitionStart  = UNPACK_UINT32 (Mbr->Partition[0].StartingLBA) + ExtMbrStartingLba + ParentHdDev.PartitionStart;\r
       HdDev.PartitionSize   = UNPACK_UINT32 (Mbr->Partition[0].SizeInLBA);\r
@@ -294,8 +299,8 @@ Returns:
         Found = TRUE;\r
       }\r
 \r
-      if (Mbr->Partition[1].OSIndicator != EXTENDED_DOS_PARTITION &&\r
-          Mbr->Partition[1].OSIndicator != EXTENDED_WINDOWS_PARTITION\r
+      if ((Mbr->Partition[1].OSIndicator != EXTENDED_DOS_PARTITION) &&\r
+          (Mbr->Partition[1].OSIndicator != EXTENDED_WINDOWS_PARTITION)\r
           ) {\r
         break;\r
       }\r
index c0022c88adb77e8fe3f0ae34f70994e584b295f0..ac692dbdd9dbe2954fb18db3f09ddc914dd9312c 100644 (file)
@@ -33,7 +33,8 @@ Revision History
 #define EXTENDED_WINDOWS_PARTITION  0x0F\r
 #define MAX_MBR_PARTITIONS          4\r
 \r
-#define EFI_PARTITION               0xef\r
+#define PMBR_GPT_PARTITION          0xEE\r
+#define EFI_PARTITION               0xEF\r
 #define MBR_SIZE                    512\r
 \r
 //\r
index 7b15a1a84b4679e347da795c874106dc551f82c4..2a5d48a431f5875ea364201184c074943245167a 100644 (file)
@@ -154,8 +154,8 @@ static EBC_ICACHE_FLUSH       mEbcICacheFlush;
 //\r
 // These get set via calls by the debug agent\r
 //\r
-static EFI_PERIODIC_CALLBACK  mDebugPeriodicCallback    = NULL;\r
-static EFI_EXCEPTION_CALLBACK mDebugExceptionCallback   = NULL;\r
+static EFI_PERIODIC_CALLBACK  mDebugPeriodicCallback                            = NULL;\r
+static EFI_EXCEPTION_CALLBACK mDebugExceptionCallback[MAX_EBC_EXCEPTION + 1] = {NULL};\r
 static EFI_GUID               mEfiEbcVmTestProtocolGuid = EFI_EBC_VM_TEST_PROTOCOL_GUID;\r
 \r
 EFI_STATUS\r
@@ -405,6 +405,13 @@ Returns:
 \r
 --*/\r
 {\r
+  if ((mDebugPeriodicCallback == NULL) && (PeriodicCallback == NULL)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  if ((mDebugPeriodicCallback != NULL) && (PeriodicCallback != NULL)) {\r
+    return EFI_ALREADY_STARTED;\r
+  }\r
+       \r
   mDebugPeriodicCallback = PeriodicCallback;\r
   return EFI_SUCCESS;\r
 }\r
@@ -437,7 +444,16 @@ Returns:
 \r
 --*/\r
 {\r
-  mDebugExceptionCallback = ExceptionCallback;\r
+  if ((ExceptionType < 0) || (ExceptionType > MAX_EBC_EXCEPTION)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  if ((mDebugExceptionCallback[ExceptionType] == NULL) && (ExceptionCallback == NULL)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  if ((mDebugExceptionCallback[ExceptionType] != NULL) && (ExceptionCallback != NULL)) {\r
+    return EFI_ALREADY_STARTED;\r
+  }\r
+  mDebugExceptionCallback[ExceptionType] = ExceptionCallback;\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -519,13 +535,15 @@ Returns:
   EbcContext.R7                   = VmPtr->R[7];\r
   EbcContext.Ip                   = (UINT64) (UINTN) VmPtr->Ip;\r
   EbcContext.Flags                = VmPtr->Flags;\r
+  EbcContext.ControlFlags         = 0;\r
   SystemContext.SystemContextEbc  = &EbcContext;\r
   //\r
   // If someone's registered for exception callbacks, then call them.\r
   // Otherwise report the status code via the status code API\r
   //\r
-  if (mDebugExceptionCallback != NULL) {\r
-    mDebugExceptionCallback (ExceptionType, SystemContext);\r
+  if ((ExceptionType >= 0) && (ExceptionType <= MAX_EBC_EXCEPTION) &&\r
+      (mDebugExceptionCallback[ExceptionType] != NULL)) {\r
+    mDebugExceptionCallback[ExceptionType] (ExceptionType, SystemContext);\r
   }\r
   //\r
   // Determine if we should report the exception. We report all of them by default,\r
@@ -536,50 +554,50 @@ Returns:
   Report = TRUE;\r
   switch (ExceptionType) {\r
   case EXCEPT_EBC_UNDEFINED:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_UNDEFINED;\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_UNDEFINED;\r
     break;\r
 \r
   case EXCEPT_EBC_DIVIDE_ERROR:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_DIVIDE_ERROR;\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_DIVIDE_ERROR;\r
     break;\r
 \r
   case EXCEPT_EBC_DEBUG:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_DEBUG;\r
-    Report          = (BOOLEAN) ((mDebugExceptionCallback == NULL) ? TRUE : FALSE);\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_DEBUG;\r
+    Report          = (BOOLEAN) ((mDebugExceptionCallback[ExceptionType] == NULL) ? TRUE : FALSE);\r
     break;\r
 \r
   case EXCEPT_EBC_BREAKPOINT:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_BREAKPOINT;\r
-    Report          = (BOOLEAN) ((mDebugExceptionCallback == NULL) ? TRUE : FALSE);\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_BREAKPOINT;\r
+    Report          = (BOOLEAN) ((mDebugExceptionCallback[ExceptionType] == NULL) ? TRUE : FALSE);\r
     break;\r
 \r
   case EXCEPT_EBC_INVALID_OPCODE:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_INVALID_OPCODE;\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_INVALID_OPCODE;\r
     break;\r
 \r
   case EXCEPT_EBC_STACK_FAULT:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_STACK_FAULT;\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_STACK_FAULT;\r
     break;\r
 \r
   case EXCEPT_EBC_ALIGNMENT_CHECK:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_ALIGNMENT_CHECK;\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_ALIGNMENT_CHECK;\r
     break;\r
 \r
   case EXCEPT_EBC_INSTRUCTION_ENCODING:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_INSTRUCTION_ENCODING;\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_INSTRUCTION_ENCODING;\r
     break;\r
 \r
   case EXCEPT_EBC_BAD_BREAK:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_BAD_BREAK;\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_BAD_BREAK;\r
     break;\r
 \r
   case EXCEPT_EBC_STEP:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_STEP;\r
-    Report          = (BOOLEAN) ((mDebugExceptionCallback == NULL) ? TRUE : FALSE);\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_STEP;\r
+    Report          = (BOOLEAN) ((mDebugExceptionCallback[ExceptionType] == NULL) ? TRUE : FALSE);\r
     break;\r
 \r
   default:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_NON_SPECIFIC;\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_NON_SPECIFIC;\r
     break;\r
   }\r
   //\r