Changeset 99404 in vbox for trunk/src/VBox/Devices/EFI/FirmwareNew/OvmfPkg/XenPvBlkDxe/BlockIo.c
- Timestamp:
- Apr 14, 2023 3:17:44 PM (23 months 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/OvmfPkg/XenPvBlkDxe/BlockIo.c
r85718 r99404 47 47 }; 48 48 49 50 51 52 49 /** 53 50 Read/Write BufferSize bytes from Lba into Buffer. … … 77 74 ) 78 75 { 79 XEN_BLOCK_FRONT_IO IoData;80 EFI_BLOCK_IO_MEDIA *Media = This->Media;81 UINTN Sector;82 EFI_STATUS Status;76 XEN_BLOCK_FRONT_IO IoData; 77 EFI_BLOCK_IO_MEDIA *Media = This->Media; 78 UINTN Sector; 79 EFI_STATUS Status; 83 80 84 81 if (Buffer == NULL) { 85 82 return EFI_INVALID_PARAMETER; 86 83 } 84 87 85 if (BufferSize == 0) { 88 86 return EFI_SUCCESS; … … 90 88 91 89 if (BufferSize % Media->BlockSize != 0) { 92 DEBUG ((DEBUG_ERROR, "XenPvBlkDxe: Bad buffer size: 0x%Lx\n", 93 (UINT64)BufferSize)); 90 DEBUG (( 91 DEBUG_ERROR, 92 "XenPvBlkDxe: Bad buffer size: 0x%Lx\n", 93 (UINT64)BufferSize 94 )); 94 95 return EFI_BAD_BUFFER_SIZE; 95 96 } 96 97 97 if (Lba > Media->LastBlock || 98 (BufferSize / Media->BlockSize) - 1 > Media->LastBlock - Lba) { 99 DEBUG ((DEBUG_ERROR, 98 if ((Lba > Media->LastBlock) || 99 ((BufferSize / Media->BlockSize) - 1 > Media->LastBlock - Lba)) 100 { 101 DEBUG (( 102 DEBUG_ERROR, 100 103 "XenPvBlkDxe: %a with invalid LBA: 0x%Lx, size: 0x%Lx\n", 101 IsWrite ? "Write" : "Read", Lba, (UINT64)BufferSize)); 104 IsWrite ? "Write" : "Read", 105 Lba, 106 (UINT64)BufferSize 107 )); 102 108 return EFI_INVALID_PARAMETER; 103 109 } … … 112 118 // buffer here. 113 119 // 114 VOID *NewBuffer;120 VOID *NewBuffer; 115 121 116 122 // 117 123 // Try again with a properly aligned buffer. 118 124 // 119 NewBuffer = AllocateAlignedPages((BufferSize + EFI_PAGE_SIZE) / EFI_PAGE_SIZE, 120 Media->IoAlign); 125 NewBuffer = AllocateAlignedPages ( 126 (BufferSize + EFI_PAGE_SIZE) / EFI_PAGE_SIZE, 127 Media->IoAlign 128 ); 121 129 if (!IsWrite) { 122 Status = XenPvBlkDxeBlockIoReadBlocks (This, MediaId, 123 Lba, BufferSize, NewBuffer); 130 Status = XenPvBlkDxeBlockIoReadBlocks ( 131 This, 132 MediaId, 133 Lba, 134 BufferSize, 135 NewBuffer 136 ); 124 137 CopyMem (Buffer, NewBuffer, BufferSize); 125 138 } else { 126 139 CopyMem (NewBuffer, Buffer, BufferSize); 127 Status = XenPvBlkDxeBlockIoWriteBlocks (This, MediaId, 128 Lba, BufferSize, NewBuffer); 140 Status = XenPvBlkDxeBlockIoWriteBlocks ( 141 This, 142 MediaId, 143 Lba, 144 BufferSize, 145 NewBuffer 146 ); 129 147 } 148 130 149 FreeAlignedPages (NewBuffer, (BufferSize + EFI_PAGE_SIZE) / EFI_PAGE_SIZE); 131 150 return Status; … … 133 152 134 153 IoData.Dev = XEN_BLOCK_FRONT_FROM_BLOCK_IO (This); 135 Sector = (UINTN)MultU64x32 (Lba, Media->BlockSize / 512);154 Sector = (UINTN)MultU64x32 (Lba, Media->BlockSize / 512); 136 155 137 156 while (BufferSize > 0) { 138 157 if (((UINTN)Buffer & EFI_PAGE_MASK) == 0) { 139 IoData.Size = MIN (BLKIF_MAX_SEGMENTS_PER_REQUEST * EFI_PAGE_SIZE, 140 BufferSize); 158 IoData.Size = MIN ( 159 BLKIF_MAX_SEGMENTS_PER_REQUEST * EFI_PAGE_SIZE, 160 BufferSize 161 ); 141 162 } else { 142 IoData.Size = MIN ((BLKIF_MAX_SEGMENTS_PER_REQUEST - 1) * EFI_PAGE_SIZE, 143 BufferSize); 163 IoData.Size = MIN ( 164 (BLKIF_MAX_SEGMENTS_PER_REQUEST - 1) * EFI_PAGE_SIZE, 165 BufferSize 166 ); 144 167 } 145 168 146 169 IoData.Buffer = Buffer; 147 170 IoData.Sector = Sector; 148 BufferSize -= IoData.Size;149 Buffer = (VOID*) ((UINTN)Buffer + IoData.Size);150 Sector += IoData.Size / 512;151 Status = XenPvBlockIo (&IoData, IsWrite);171 BufferSize -= IoData.Size; 172 Buffer = (VOID *)((UINTN)Buffer + IoData.Size); 173 Sector += IoData.Size / 512; 174 Status = XenPvBlockIo (&IoData, IsWrite); 152 175 if (EFI_ERROR (Status)) { 153 DEBUG ((DEBUG_ERROR, "XenPvBlkDxe: Error during %a operation.\n", 154 IsWrite ? "write" : "read")); 176 DEBUG (( 177 DEBUG_ERROR, 178 "XenPvBlkDxe: Error during %a operation.\n", 179 IsWrite ? "write" : "read" 180 )); 155 181 return Status; 156 182 } 157 183 } 184 158 185 return EFI_SUCCESS; 159 186 } 160 161 187 162 188 /** … … 182 208 EFIAPI 183 209 XenPvBlkDxeBlockIoReadBlocks ( 184 IN EFI_BLOCK_IO_PROTOCOL *This, 185 IN UINT32 MediaId, 186 IN EFI_LBA Lba, 187 IN UINTN BufferSize, 188 OUT VOID *Buffer 189 ) 190 { 191 return XenPvBlkDxeBlockIoReadWriteBlocks (This, 192 MediaId, Lba, BufferSize, Buffer, FALSE); 210 IN EFI_BLOCK_IO_PROTOCOL *This, 211 IN UINT32 MediaId, 212 IN EFI_LBA Lba, 213 IN UINTN BufferSize, 214 OUT VOID *Buffer 215 ) 216 { 217 return XenPvBlkDxeBlockIoReadWriteBlocks ( 218 This, 219 MediaId, 220 Lba, 221 BufferSize, 222 Buffer, 223 FALSE 224 ); 193 225 } 194 226 … … 216 248 EFIAPI 217 249 XenPvBlkDxeBlockIoWriteBlocks ( 218 IN EFI_BLOCK_IO_PROTOCOL *This, 219 IN UINT32 MediaId, 220 IN EFI_LBA Lba, 221 IN UINTN BufferSize, 222 IN VOID *Buffer 223 ) 224 { 225 return XenPvBlkDxeBlockIoReadWriteBlocks (This, 226 MediaId, Lba, BufferSize, Buffer, TRUE); 250 IN EFI_BLOCK_IO_PROTOCOL *This, 251 IN UINT32 MediaId, 252 IN EFI_LBA Lba, 253 IN UINTN BufferSize, 254 IN VOID *Buffer 255 ) 256 { 257 return XenPvBlkDxeBlockIoReadWriteBlocks ( 258 This, 259 MediaId, 260 Lba, 261 BufferSize, 262 Buffer, 263 TRUE 264 ); 227 265 } 228 266 … … 259 297 EFIAPI 260 298 XenPvBlkDxeBlockIoReset ( 261 IN EFI_BLOCK_IO_PROTOCOL 262 IN BOOLEAN 299 IN EFI_BLOCK_IO_PROTOCOL *This, 300 IN BOOLEAN ExtendedVerification 263 301 ) 264 302 {
Note:
See TracChangeset
for help on using the changeset viewer.