Changeset 99404 in vbox for trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/IScsiDxe/IScsiIbft.c
- Timestamp:
- Apr 14, 2023 3:17:44 PM (22 months ago)
- 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/NetworkPkg/IScsiDxe/IScsiIbft.c
r80721 r99404 9 9 #include "IScsiImpl.h" 10 10 11 BOOLEAN mIbftInstalled = FALSE;12 UINTN mTableKey;11 BOOLEAN mIbftInstalled = FALSE; 12 UINTN mTableKey; 13 13 14 14 /** … … 22 22 VOID 23 23 IScsiInitIbfTableHeader ( 24 OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER 25 IN UINT8 26 IN UINT64 24 OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Header, 25 IN UINT8 *OemId, 26 IN UINT64 *OemTableId 27 27 ) 28 28 { … … 36 36 } 37 37 38 39 38 /** 40 39 Initialize the control section of the iSCSI Boot Firmware Table. … … 51 50 UINTN NumOffset; 52 51 53 Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) 52 Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *)(Table + 1); 54 53 55 54 Control->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_ID; 56 55 Control->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_VERSION; 57 Control->Header.Length = (UINT16) 56 Control->Header.Length = (UINT16)sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE); 58 57 59 58 // … … 66 65 if (mPrivate->EnableMpio) { 67 66 Control->Header.Flags = 0; 68 NumOffset = 2 * (mPrivate->MpioCount - mPrivate->Krb5MpioCount);67 NumOffset = 2 * (mPrivate->MpioCount - mPrivate->Krb5MpioCount); 69 68 } else { 70 69 NumOffset = 2 * mPrivate->ValidSinglePathCount; … … 80 79 // exist. 81 80 // 82 Control->Header.Length = (UINT16) (Control->Header.Length + (NumOffset - 4) * sizeof (UINT16)); 83 } 84 } 85 81 Control->Header.Length = (UINT16)(Control->Header.Length + (NumOffset - 4) * sizeof (UINT16)); 82 } 83 } 86 84 87 85 /** … … 110 108 } 111 109 112 113 110 /** 114 111 Fill the Initiator section of the iSCSI Boot Firmware Table. … … 127 124 EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *Initiator; 128 125 129 Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) 126 Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *)(Table + 1); 130 127 131 128 // … … 133 130 // 134 131 Initiator = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *) 135 ((UINT8 *) 136 137 Control->InitiatorOffset = (UINT16) ((UINTN) Initiator - (UINTN)Table);132 ((UINT8 *)Control + IBFT_ROUNDUP (Control->Header.Length)); 133 134 Control->InitiatorOffset = (UINT16)((UINTN)Initiator - (UINTN)Table); 138 135 139 136 Initiator->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_ID; 140 137 Initiator->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_VERSION; 141 Initiator->Header.Length = (UINT16) 138 Initiator->Header.Length = (UINT16)sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE); 142 139 Initiator->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BLOCK_VALID | 143 140 EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BOOT_SELECTED; … … 148 145 IScsiAddHeapItem (Heap, mPrivate->InitiatorName, mPrivate->InitiatorNameLength - 1); 149 146 150 Initiator->IScsiNameLength = (UINT16) (mPrivate->InitiatorNameLength - 1); 151 Initiator->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); 152 } 153 147 Initiator->IScsiNameLength = (UINT16)(mPrivate->InitiatorNameLength - 1); 148 Initiator->IScsiNameOffset = (UINT16)((UINTN)*Heap - (UINTN)Table); 149 } 154 150 155 151 /** … … 162 158 VOID 163 159 IScsiMapV4ToV6Addr ( 164 IN EFI_IPv4_ADDRESS *V4,165 OUT EFI_IPv6_ADDRESS *V6166 ) 167 { 168 UINTN Index;160 IN EFI_IPv4_ADDRESS *V4, 161 OUT EFI_IPv6_ADDRESS *V6 162 ) 163 { 164 UINTN Index; 169 165 170 166 ZeroMem (V6, sizeof (EFI_IPv6_ADDRESS)); 171 167 172 V6->Addr[10] 173 V6->Addr[11] 168 V6->Addr[10] = 0xff; 169 V6->Addr[11] = 0xff; 174 170 175 171 for (Index = 0; Index < 4; Index++) { … … 177 173 } 178 174 } 179 180 175 181 176 /** … … 209 204 // Get the offset of the first Nic and Target section. 210 205 // 211 Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) 212 Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) ((UINTN)Table +213 Control->InitiatorOffset + IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE)));214 Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *) ((UINTN)Nic +215 IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));206 Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *)(Table + 1); 207 Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *)((UINTN)Table + 208 Control->InitiatorOffset + IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE))); 209 Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *)((UINTN)Nic + 210 IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE))); 216 211 217 212 SectionOffset = &Control->NIC0Offset; … … 234 229 235 230 ASSERT (Attempt->SessionConfigData.Enabled != ISCSI_DISABLED); 236 237 231 } else { 238 if ( Index == 1&& Flag) {232 if ((Index == 1) && Flag) { 239 233 Entry = mPrivate->AttemptConfigs.ForwardLink; 240 Flag = FALSE;234 Flag = FALSE; 241 235 } 242 236 … … 261 255 // If multipath mode is enabled, only the attempts in MPIO will be recorded in iBFT. 262 256 // 263 if (mPrivate->EnableMpio && Attempt->SessionConfigData.Enabled != ISCSI_ENABLED_FOR_MPIO) {257 if (mPrivate->EnableMpio && (Attempt->SessionConfigData.Enabled != ISCSI_ENABLED_FOR_MPIO)) { 264 258 continue; 265 259 } … … 281 275 Nic->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_ID; 282 276 Nic->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_VERSION; 283 Nic->Header.Length = (UINT16) 284 Nic->Header.Index = (UINT8) 277 Nic->Header.Length = (UINT16)sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE); 278 Nic->Header.Index = (UINT8)Index; 285 279 Nic->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BLOCK_VALID | 286 EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_GLOBAL;280 EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_GLOBAL; 287 281 288 282 if (Index == 0) { 289 Nic->Header.Flags 283 Nic->Header.Flags |= EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BOOT_SELECTED; 290 284 } 291 285 … … 296 290 } 297 291 298 if ( NvData->IpMode == IP_MODE_IP4 || NvData->IpMode == IP_MODE_AUTOCONFIG) {292 if ((NvData->IpMode == IP_MODE_IP4) || (NvData->IpMode == IP_MODE_AUTOCONFIG)) { 299 293 // 300 294 // Get the subnet mask prefix length. … … 310 304 IScsiMapV4ToV6Addr (&Attempt->SecondaryDns.v4, &Nic->SecondaryDns); 311 305 IScsiMapV4ToV6Addr (&Attempt->DhcpServer.v4, &Nic->DhcpServer); 312 313 } else if (NvData->IpMode == IP_MODE_IP6 || NvData->IpMode == IP_MODE_AUTOCONFIG) { 314 306 } else if ((NvData->IpMode == IP_MODE_IP6) || (NvData->IpMode == IP_MODE_AUTOCONFIG)) { 315 307 Nic->SubnetMaskPrefixLength = NvData->PrefixLength; 316 308 CopyMem (&Nic->Ip, &NvData->LocalIp, sizeof (EFI_IPv6_ADDRESS)); … … 319 311 CopyMem (&Nic->SecondaryDns, &Attempt->SecondaryDns, sizeof (EFI_IPv6_ADDRESS)); 320 312 CopyMem (&Nic->DhcpServer, &Attempt->DhcpServer, sizeof (EFI_IPv6_ADDRESS)); 321 322 313 } else { 323 314 ASSERT (FALSE); … … 332 323 Nic->VLanTag = NicInfo->VlanId; 333 324 CopyMem (Nic->Mac, &NicInfo->PermanentAddress, sizeof (Nic->Mac)); 334 Nic->PciLocation = (UINT16) 335 336 *SectionOffset = (UINT16) ((UINTN) Nic - (UINTN)Table);325 Nic->PciLocation = (UINT16)((NicInfo->BusNumber << 8) | 326 (NicInfo->DeviceNumber << 3) | NicInfo->FunctionNumber); 327 *SectionOffset = (UINT16)((UINTN)Nic - (UINTN)Table); 337 328 SectionOffset++; 338 329 … … 341 332 // 342 333 343 Target->Header.StructureId 344 Target->Header.Version 345 Target->Header.Length = (UINT16)sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE);346 Target->Header.Index = (UINT8)Index;347 Target->Header.Flags 334 Target->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_ID; 335 Target->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_VERSION; 336 Target->Header.Length = (UINT16)sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE); 337 Target->Header.Index = (UINT8)Index; 338 Target->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BLOCK_VALID; 348 339 349 340 if (Index == 0) { 350 Target->Header.Flags 351 } 352 353 Target->Port 341 Target->Header.Flags |= EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BOOT_SELECTED; 342 } 343 344 Target->Port = NvData->TargetPort; 354 345 355 346 if (Attempt->AuthenticationType == ISCSI_AUTH_TYPE_CHAP) { … … 363 354 } 364 355 365 Target->NicIndex = (UINT8)Index;366 367 if ( NvData->IpMode == IP_MODE_IP4 || NvData->IpMode == IP_MODE_AUTOCONFIG) {356 Target->NicIndex = (UINT8)Index; 357 358 if ((NvData->IpMode == IP_MODE_IP4) || (NvData->IpMode == IP_MODE_AUTOCONFIG)) { 368 359 IScsiMapV4ToV6Addr (&NvData->TargetIp.v4, &Target->Ip); 369 } else if ( NvData->IpMode == IP_MODE_IP6 || NvData->IpMode == IP_MODE_AUTOCONFIG) {360 } else if ((NvData->IpMode == IP_MODE_IP6) || (NvData->IpMode == IP_MODE_AUTOCONFIG)) { 370 361 CopyMem (&Target->Ip, &NvData->TargetIp, sizeof (EFI_IPv6_ADDRESS)); 371 362 } else { … … 378 369 // Target iSCSI Name, CHAP name/secret, reverse CHAP name/secret. 379 370 // 380 Length = (UINT16) 371 Length = (UINT16)AsciiStrLen (NvData->TargetName); 381 372 IScsiAddHeapItem (Heap, NvData->TargetName, Length); 382 373 383 374 Target->IScsiNameLength = Length; 384 Target->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN)Table);375 Target->IScsiNameOffset = (UINT16)((UINTN)*Heap - (UINTN)Table); 385 376 386 377 if (Attempt->AuthenticationType == ISCSI_AUTH_TYPE_CHAP) { … … 388 379 // CHAP Name 389 380 // 390 Length = (UINT16) 381 Length = (UINT16)AsciiStrLen (AuthConfig->CHAPName); 391 382 IScsiAddHeapItem (Heap, AuthConfig->CHAPName, Length); 392 Target->CHAPNameLength 393 Target->CHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN)Table);383 Target->CHAPNameLength = Length; 384 Target->CHAPNameOffset = (UINT16)((UINTN)*Heap - (UINTN)Table); 394 385 395 386 // 396 387 // CHAP Secret 397 388 // 398 Length = (UINT16) 389 Length = (UINT16)AsciiStrLen (AuthConfig->CHAPSecret); 399 390 IScsiAddHeapItem (Heap, AuthConfig->CHAPSecret, Length); 400 Target->CHAPSecretLength 401 Target->CHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN)Table);391 Target->CHAPSecretLength = Length; 392 Target->CHAPSecretOffset = (UINT16)((UINTN)*Heap - (UINTN)Table); 402 393 403 394 if (Target->CHAPType == EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_MUTUAL_CHAP) { … … 405 396 // Reverse CHAP Name. 406 397 // 407 Length = (UINT16) 398 Length = (UINT16)AsciiStrLen (AuthConfig->ReverseCHAPName); 408 399 IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPName, Length); 409 400 Target->ReverseCHAPNameLength = Length; 410 Target->ReverseCHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN)Table);401 Target->ReverseCHAPNameOffset = (UINT16)((UINTN)*Heap - (UINTN)Table); 411 402 412 403 // 413 404 // Reverse CHAP Secret. 414 405 // 415 Length = (UINT16) 406 Length = (UINT16)AsciiStrLen (AuthConfig->ReverseCHAPSecret); 416 407 IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPSecret, Length); 417 408 Target->ReverseCHAPSecretLength = Length; 418 Target->ReverseCHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN)Table);409 Target->ReverseCHAPSecretOffset = (UINT16)((UINTN)*Heap - (UINTN)Table); 419 410 } 420 411 } 421 412 422 *SectionOffset = (UINT16) ((UINTN) Target - (UINTN)Table);413 *SectionOffset = (UINT16)((UINTN)Target - (UINTN)Table); 423 414 SectionOffset++; 424 415 … … 426 417 // Advance to the next NIC/Target pair. 427 418 // 428 Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) ((UINTN)Target +429 IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE)));430 Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *) ((UINTN)Nic +431 IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));419 Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *)((UINTN)Target + 420 IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE))); 421 Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *)((UINTN)Nic + 422 IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE))); 432 423 433 424 Index++; 434 425 } 435 426 } 436 437 427 438 428 /** … … 458 448 Xsdt = NULL; 459 449 460 Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **) 450 Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **)&AcpiTableProtocol); 461 451 if (EFI_ERROR (Status)) { 462 return 452 return; 463 453 } 464 454 … … 466 456 // Find ACPI table RSD_PTR from the system table. 467 457 // 468 Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **) 458 Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **)&Rsdp); 469 459 if (EFI_ERROR (Status)) { 470 Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **) 460 Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **)&Rsdp); 471 461 } 472 462 473 463 if (EFI_ERROR (Status) || (Rsdp == NULL)) { 474 return 475 } else if ( Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION && Rsdp->XsdtAddress != 0) {476 Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN)Rsdp->XsdtAddress;464 return; 465 } else if ((Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) && (Rsdp->XsdtAddress != 0)) { 466 Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->XsdtAddress; 477 467 } else if (Rsdp->RsdtAddress != 0) { 478 Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN)Rsdp->RsdtAddress;468 Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->RsdtAddress; 479 469 } 480 470 481 471 if ((Xsdt == NULL) && (Rsdt == NULL)) { 482 return 472 return; 483 473 } 484 474 … … 489 479 ); 490 480 if (EFI_ERROR (Status)) { 491 return ; 492 } 481 return; 482 } 483 493 484 mIbftInstalled = FALSE; 494 485 } … … 497 488 // If there is no valid attempt configuration, just return. 498 489 // 499 if ((!mPrivate->EnableMpio && mPrivate->ValidSinglePathCount == 0) || 500 (mPrivate->EnableMpio && mPrivate->MpioCount <= mPrivate->Krb5MpioCount)) { 501 return ; 490 if ((!mPrivate->EnableMpio && (mPrivate->ValidSinglePathCount == 0)) || 491 (mPrivate->EnableMpio && (mPrivate->MpioCount <= mPrivate->Krb5MpioCount))) 492 { 493 return; 502 494 } 503 495 … … 507 499 Table = AllocateZeroPool (IBFT_MAX_SIZE); 508 500 if (Table == NULL) { 509 return 510 } 511 512 Heap = (UINT8 *) 501 return; 502 } 503 504 Heap = (UINT8 *)Table + IBFT_HEAP_OFFSET; 513 505 514 506 // … … 525 517 IScsiFillNICAndTargetSections (Table, &Heap); 526 518 527 Checksum = CalculateCheckSum8((UINT8 *)Table, Table->Length);519 Checksum = CalculateCheckSum8 ((UINT8 *)Table, Table->Length); 528 520 Table->Checksum = Checksum; 529 521 … … 537 529 &mTableKey 538 530 ); 539 if (EFI_ERROR (Status)) {531 if (EFI_ERROR (Status)) { 540 532 return; 541 533 }
Note:
See TracChangeset
for help on using the changeset viewer.