Changeset 99404 in vbox for trunk/src/VBox/Devices/EFI/FirmwareNew/MdePkg/Library/SmmIoLib/SmmIoLib.c
- Timestamp:
- Apr 14, 2023 3:17:44 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 156854
- Location:
- trunk/src/VBox/Devices/EFI/FirmwareNew
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/EFI/FirmwareNew
-
Property svn:mergeinfo
changed from (toggle deleted branches)
to (toggle deleted branches)/vendor/edk2/current 103735-103757,103769-103776,129194-145445 /vendor/edk2/current 103735-103757,103769-103776,129194-156846
-
Property svn:mergeinfo
changed from (toggle deleted branches)
-
trunk/src/VBox/Devices/EFI/FirmwareNew/MdePkg/Library/SmmIoLib/SmmIoLib.c
r80721 r99404 10 10 11 11 **/ 12 13 12 14 13 #include <PiSmm.h> … … 25 24 #include <Protocol/SmmEndOfDxe.h> 26 25 27 EFI_GCD_MEMORY_SPACE_DESCRIPTOR 28 UINTN 26 EFI_GCD_MEMORY_SPACE_DESCRIPTOR *mSmmIoLibGcdMemSpace = NULL; 27 UINTN mSmmIoLibGcdMemNumberOfDesc = 0; 29 28 30 29 EFI_PHYSICAL_ADDRESS mSmmIoLibInternalMaximumSupportMemAddress = 0; 31 30 32 VOID 33 VOID 34 35 BOOLEAN 31 VOID *mSmmIoLibRegistrationEndOfDxe; 32 VOID *mSmmIoLibRegistrationReadyToLock; 33 34 BOOLEAN mSmmIoLibReadyToLock = FALSE; 36 35 37 36 /** … … 44 43 ) 45 44 { 46 VOID 47 UINT32 48 UINT8 45 VOID *Hob; 46 UINT32 RegEax; 47 UINT8 MemPhysicalAddressBits; 49 48 50 49 // … … 53 52 Hob = GetFirstHob (EFI_HOB_TYPE_CPU); 54 53 if (Hob != NULL) { 55 MemPhysicalAddressBits = ((EFI_HOB_CPU *) 54 MemPhysicalAddressBits = ((EFI_HOB_CPU *)Hob)->SizeOfMemorySpace; 56 55 } else { 57 56 AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL); 58 57 if (RegEax >= 0x80000008) { 59 58 AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL); 60 MemPhysicalAddressBits = (UINT8) 59 MemPhysicalAddressBits = (UINT8)RegEax; 61 60 } else { 62 61 MemPhysicalAddressBits = 36; 63 62 } 64 63 } 64 65 65 // 66 66 // IA-32e paging translates 48-bit linear addresses to 52-bit physical addresses. … … 99 99 ) 100 100 { 101 UINTN Index;102 EFI_GCD_MEMORY_SPACE_DESCRIPTOR *Desc;103 BOOLEAN InValidRegion;101 UINTN Index; 102 EFI_GCD_MEMORY_SPACE_DESCRIPTOR *Desc; 103 BOOLEAN InValidRegion; 104 104 105 105 // … … 109 109 if ((Length > mSmmIoLibInternalMaximumSupportMemAddress) || 110 110 (BaseAddress > mSmmIoLibInternalMaximumSupportMemAddress) || 111 ((Length != 0) && (BaseAddress > (mSmmIoLibInternalMaximumSupportMemAddress - (Length - 1)))) ) { 111 ((Length != 0) && (BaseAddress > (mSmmIoLibInternalMaximumSupportMemAddress - (Length - 1))))) 112 { 112 113 // 113 114 // Overflow happen … … 128 129 if (mSmmIoLibReadyToLock) { 129 130 InValidRegion = FALSE; 130 for (Index = 0; Index < mSmmIoLibGcdMemNumberOfDesc; Index 131 for (Index = 0; Index < mSmmIoLibGcdMemNumberOfDesc; Index++) { 131 132 Desc = &mSmmIoLibGcdMemSpace[Index]; 132 133 if ((Desc->GcdMemoryType == EfiGcdMemoryTypeMemoryMappedIo) && 133 134 (BaseAddress >= Desc->BaseAddress) && 134 ((BaseAddress + Length) <= (Desc->BaseAddress + Desc->Length))) { 135 ((BaseAddress + Length) <= (Desc->BaseAddress + Desc->Length))) 136 { 135 137 InValidRegion = TRUE; 136 138 } … … 147 149 } 148 150 } 151 149 152 return TRUE; 150 153 } … … 167 170 ) 168 171 { 169 EFI_GCD_MEMORY_SPACE_DESCRIPTOR 170 EFI_GCD_MEMORY_SPACE_DESCRIPTOR 171 EFI_GCD_MEMORY_SPACE_DESCRIPTOR 172 EFI_GCD_MEMORY_SPACE_DESCRIPTOR 173 174 GcdMemoryMapEntry = GcdMemoryMap;172 EFI_GCD_MEMORY_SPACE_DESCRIPTOR *GcdMemoryMapEntry; 173 EFI_GCD_MEMORY_SPACE_DESCRIPTOR *GcdMemoryMapEnd; 174 EFI_GCD_MEMORY_SPACE_DESCRIPTOR *NewGcdMemoryMapEntry; 175 EFI_GCD_MEMORY_SPACE_DESCRIPTOR *NextGcdMemoryMapEntry; 176 177 GcdMemoryMapEntry = GcdMemoryMap; 175 178 NewGcdMemoryMapEntry = GcdMemoryMap; 176 GcdMemoryMapEnd = (EFI_GCD_MEMORY_SPACE_DESCRIPTOR *) ((UINT8 *) GcdMemoryMap + (*NumberOfDescriptors) * sizeof(EFI_GCD_MEMORY_SPACE_DESCRIPTOR));179 GcdMemoryMapEnd = (EFI_GCD_MEMORY_SPACE_DESCRIPTOR *)((UINT8 *)GcdMemoryMap + (*NumberOfDescriptors) * sizeof (EFI_GCD_MEMORY_SPACE_DESCRIPTOR)); 177 180 while ((UINTN)GcdMemoryMapEntry < (UINTN)GcdMemoryMapEnd) { 178 CopyMem (NewGcdMemoryMapEntry, GcdMemoryMapEntry, sizeof (EFI_GCD_MEMORY_SPACE_DESCRIPTOR));181 CopyMem (NewGcdMemoryMapEntry, GcdMemoryMapEntry, sizeof (EFI_GCD_MEMORY_SPACE_DESCRIPTOR)); 179 182 NextGcdMemoryMapEntry = GcdMemoryMapEntry + 1; 180 183 … … 182 185 if (((UINTN)NextGcdMemoryMapEntry < (UINTN)GcdMemoryMapEnd) && 183 186 (GcdMemoryMapEntry->GcdMemoryType == EfiGcdMemoryTypeMemoryMappedIo) && (NextGcdMemoryMapEntry->GcdMemoryType == EfiGcdMemoryTypeMemoryMappedIo) && 184 ((GcdMemoryMapEntry->BaseAddress + GcdMemoryMapEntry->Length) == NextGcdMemoryMapEntry->BaseAddress)) { 187 ((GcdMemoryMapEntry->BaseAddress + GcdMemoryMapEntry->Length) == NextGcdMemoryMapEntry->BaseAddress)) 188 { 185 189 GcdMemoryMapEntry->Length += NextGcdMemoryMapEntry->Length; 186 190 if (NewGcdMemoryMapEntry != GcdMemoryMapEntry) { … … 196 200 } while (TRUE); 197 201 198 GcdMemoryMapEntry = GcdMemoryMapEntry + 1;202 GcdMemoryMapEntry = GcdMemoryMapEntry + 1; 199 203 NewGcdMemoryMapEntry = NewGcdMemoryMapEntry + 1; 200 204 } 201 205 202 *NumberOfDescriptors = ((UINTN)NewGcdMemoryMapEntry - (UINTN)GcdMemoryMap) / sizeof (EFI_GCD_MEMORY_SPACE_DESCRIPTOR);203 204 return 206 *NumberOfDescriptors = ((UINTN)NewGcdMemoryMapEntry - (UINTN)GcdMemoryMap) / sizeof (EFI_GCD_MEMORY_SPACE_DESCRIPTOR); 207 208 return; 205 209 } 206 210 … … 229 233 Status = gDS->GetMemorySpaceMap (&NumberOfDescriptors, &MemSpaceMap); 230 234 if (!EFI_ERROR (Status)) { 231 232 235 MergeGcdMmioEntry (MemSpaceMap, &NumberOfDescriptors); 233 236 … … 283 286 ) 284 287 { 285 EFI_STATUS 288 EFI_STATUS Status; 286 289 287 290 //
Note:
See TracChangeset
for help on using the changeset viewer.