| ... | @@ -265,24 +265,24 @@ pub const AcpiDevicePath = union(Subtype) { | ... | @@ -265,24 +265,24 @@ pub const AcpiDevicePath = union(Subtype) { |
| 265 | }; | 265 | }; |
| 266 | | 266 | |
| 267 | pub const MessagingDevicePath = union(Subtype) { | 267 | pub const MessagingDevicePath = union(Subtype) { |
| 268 | Atapi: void, // TODO | 268 | Atapi: *const AtapiDevicePath, |
| 269 | Scsi: void, // TODO | 269 | Scsi: *const ScsiDevicePath, |
| 270 | FibreChannel: void, // TODO | 270 | FibreChannel: *const FibreChannelDevicePath, |
| 271 | FibreChannelEx: void, // TODO | 271 | FibreChannelEx: FibreChannelExDevicePath, |
| 272 | @"1394": void, // TODO | 272 | @"1394": *const F1394DevicePath, |
| 273 | Usb: void, // TODO | 273 | Usb: *const UsbDevicePath, |
| 274 | Sata: void, // TODO | 274 | Sata: *const SataDevicePath, |
| 275 | UsbWwid: void, // TODO | 275 | UsbWwid: *const UsbWwidDevicePath, |
| 276 | Lun: void, // TODO | 276 | Lun: *const DeviceLogicalUnitDevicePath, |
| 277 | UsbClass: void, // TODO | 277 | UsbClass: *const UsbClassDevicePath, |
| 278 | I2o: void, // TODO | 278 | I2o: *const I2oDevicePath, |
| 279 | MacAddress: void, // TODO | 279 | MacAddress: *const MacAddressDevicePath, |
| 280 | Ipv4: void, // TODO | 280 | Ipv4: *const Ipv4DevicePath, |
| 281 | Ipv6: void, // TODO | 281 | Ipv6: *const Ipv6DevicePath, |
| 282 | Vlan: void, // TODO | 282 | Vlan: *const VlanDevicePath, |
| 283 | InfiniBand: void, // TODO | 283 | InfiniBand: *const InfiniBandDevicePath, |
| 284 | Uart: void, // TODO | 284 | Uart: *const UartDevicePath, |
| 285 | Vendor: void, // TODO | 285 | Vendor: *const VendorDefinedDevicePath, |
| 286 | | 286 | |
| 287 | pub const Subtype = enum(u8) { | 287 | pub const Subtype = enum(u8) { |
| 288 | Atapi = 1, | 288 | Atapi = 1, |
| ... | @@ -305,6 +305,232 @@ pub const MessagingDevicePath = union(Subtype) { | ... | @@ -305,6 +305,232 @@ pub const MessagingDevicePath = union(Subtype) { |
| 305 | Vendor = 10, | 305 | Vendor = 10, |
| 306 | _, | 306 | _, |
| 307 | }; | 307 | }; |
| | 308 | |
| | 309 | pub const AtapiDevicePath = packed struct { |
| | 310 | const Role = enum(u8) { |
| | 311 | Master = 0, |
| | 312 | Slave = 1, |
| | 313 | }; |
| | 314 | |
| | 315 | const Rank = enum(u8) { |
| | 316 | Primary = 0, |
| | 317 | Secondary = 1, |
| | 318 | }; |
| | 319 | |
| | 320 | type: DevicePathType, |
| | 321 | subtype: Subtype, |
| | 322 | length: u16, |
| | 323 | primary_secondary: Rank, |
| | 324 | slave_master: Role, |
| | 325 | logical_unit_number: u16, |
| | 326 | }; |
| | 327 | |
| | 328 | pub const ScsiDevicePath = packed struct { |
| | 329 | type: DevicePathType, |
| | 330 | subtype: Subtype, |
| | 331 | length: u16, |
| | 332 | target_id: u16, |
| | 333 | logical_unit_number: u16, |
| | 334 | }; |
| | 335 | |
| | 336 | pub const FibreChannelDevicePath = packed struct { |
| | 337 | type: DevicePathType, |
| | 338 | subtype: Subtype, |
| | 339 | length: u16, |
| | 340 | reserved: u32, |
| | 341 | world_wide_name: u64, |
| | 342 | logical_unit_number: u64, |
| | 343 | }; |
| | 344 | |
| | 345 | pub const FibreChannelExDevicePath = packed struct { |
| | 346 | type: DevicePathType, |
| | 347 | subtype: Subtype, |
| | 348 | length: u16, |
| | 349 | reserved: u32, |
| | 350 | world_wide_name: [8]u8, |
| | 351 | logical_unit_number: [8]u8, |
| | 352 | }; |
| | 353 | |
| | 354 | pub const F1394DevicePath = packed struct { |
| | 355 | type: DevicePathType, |
| | 356 | subtype: Subtype, |
| | 357 | length: u16, |
| | 358 | reserved: u32, |
| | 359 | guid: u64, |
| | 360 | }; |
| | 361 | |
| | 362 | pub const UsbDevicePath = packed struct { |
| | 363 | type: DevicePathType, |
| | 364 | subtype: Subtype, |
| | 365 | length: u16, |
| | 366 | parent_port_number: u8, |
| | 367 | interface_number: u8, |
| | 368 | }; |
| | 369 | |
| | 370 | pub const SataDevicePath = packed struct { |
| | 371 | type: DevicePathType, |
| | 372 | subtype: Subtype, |
| | 373 | length: u16, |
| | 374 | hba_port_number: u16, |
| | 375 | port_multiplier_port_number: u16, |
| | 376 | logical_unit_number: u16, |
| | 377 | }; |
| | 378 | |
| | 379 | pub const UsbWwidDevicePath = packed struct { |
| | 380 | type: DevicePathType, |
| | 381 | subtype: Subtype, |
| | 382 | length: u16, |
| | 383 | interface_number: u16, |
| | 384 | device_vendor_id: u16, |
| | 385 | device_product_id: u16, |
| | 386 | |
| | 387 | pub fn serial_number(self: *const UsbWwidDevicePath) []const u16 { |
| | 388 | var serial_len = (self.length - @sizeOf(UsbWwidDevicePath)) / @sizeOf(u16); |
| | 389 | return @ptrCast([*]u16, @ptrCast([*]u8, self) + @sizeOf(UsbWwidDevicePath))[0..serial_len]; |
| | 390 | } |
| | 391 | }; |
| | 392 | |
| | 393 | pub const DeviceLogicalUnitDevicePath = packed struct { |
| | 394 | type: DevicePathType, |
| | 395 | subtype: Subtype, |
| | 396 | length: u16, |
| | 397 | lun: u8, |
| | 398 | }; |
| | 399 | |
| | 400 | pub const UsbClassDevicePath = packed struct { |
| | 401 | type: DevicePathType, |
| | 402 | subtype: Subtype, |
| | 403 | length: u16, |
| | 404 | vendor_id: u16, |
| | 405 | product_id: u16, |
| | 406 | device_class: u8, |
| | 407 | device_subclass: u8, |
| | 408 | device_protocol: u8, |
| | 409 | }; |
| | 410 | |
| | 411 | pub const I2oDevicePath = packed struct { |
| | 412 | type: DevicePathType, |
| | 413 | subtype: Subtype, |
| | 414 | length: u16, |
| | 415 | tid: u32, |
| | 416 | }; |
| | 417 | |
| | 418 | pub const MacAddressDevicePath = packed struct { |
| | 419 | type: DevicePathType, |
| | 420 | subtype: Subtype, |
| | 421 | length: u16, |
| | 422 | mac_address: uefi.MacAddress, |
| | 423 | if_type: u8, |
| | 424 | }; |
| | 425 | |
| | 426 | pub const Ipv4DevicePath = packed struct { |
| | 427 | pub const IpType = enum(u8) { |
| | 428 | Dhcp = 0, |
| | 429 | Static = 1, |
| | 430 | }; |
| | 431 | |
| | 432 | type: DevicePathType, |
| | 433 | subtype: Subtype, |
| | 434 | length: u16, |
| | 435 | local_ip_address: uefi.Ipv4Address, |
| | 436 | remote_ip_address: uefi.Ipv4Address, |
| | 437 | local_port: u16, |
| | 438 | remote_port: u16, |
| | 439 | network_protocol: u16, |
| | 440 | static_ip_address: IpType, |
| | 441 | gateway_ip_address: u32, |
| | 442 | subnet_mask: u32, |
| | 443 | }; |
| | 444 | |
| | 445 | pub const Ipv6DevicePath = packed struct { |
| | 446 | pub const Origin = enum(u8) { |
| | 447 | Manual = 0, |
| | 448 | AssignedStateless = 1, |
| | 449 | AssignedStateful = 2, |
| | 450 | }; |
| | 451 | |
| | 452 | type: DevicePathType, |
| | 453 | subtype: Subtype, |
| | 454 | length: u16, |
| | 455 | local_ip_address: uefi.Ipv6Address, |
| | 456 | remote_ip_address: uefi.Ipv6Address, |
| | 457 | local_port: u16, |
| | 458 | remote_port: u16, |
| | 459 | protocol: u16, |
| | 460 | ip_address_origin: Origin, |
| | 461 | prefix_length: u8, |
| | 462 | gateway_ip_address: uefi.Ipv6Address, |
| | 463 | }; |
| | 464 | |
| | 465 | pub const VlanDevicePath = packed struct { |
| | 466 | type: DevicePathType, |
| | 467 | subtype: Subtype, |
| | 468 | length: u16, |
| | 469 | vlan_id: u16, |
| | 470 | }; |
| | 471 | |
| | 472 | pub const InfiniBandDevicePath = packed struct { |
| | 473 | pub const ResourceFlags = packed struct { |
| | 474 | pub const ControllerType = enum(u1) { |
| | 475 | Ioc = 0, |
| | 476 | Service = 1, |
| | 477 | }; |
| | 478 | |
| | 479 | ioc_or_service: ControllerType, |
| | 480 | extend_boot_environment: bool, |
| | 481 | console_protocol: bool, |
| | 482 | storage_protocol: bool, |
| | 483 | network_protocol: bool, |
| | 484 | |
| | 485 | // u1 + 4 * bool = 5 bits, we need a total of 32 bits |
| | 486 | reserved: u27, |
| | 487 | }; |
| | 488 | |
| | 489 | type: DevicePathType, |
| | 490 | subtype: Subtype, |
| | 491 | length: u16, |
| | 492 | resource_flags: ResourceFlags, |
| | 493 | port_gid: [16]u8, |
| | 494 | service_id: u64, |
| | 495 | target_port_id: u64, |
| | 496 | device_id: u64, |
| | 497 | }; |
| | 498 | |
| | 499 | pub const UartDevicePath = packed struct { |
| | 500 | pub const Parity = enum(u8) { |
| | 501 | Default = 0, |
| | 502 | None = 1, |
| | 503 | Even = 2, |
| | 504 | Odd = 3, |
| | 505 | Mark = 4, |
| | 506 | Space = 5, |
| | 507 | _, |
| | 508 | }; |
| | 509 | |
| | 510 | pub const StopBits = enum(u8) { |
| | 511 | Default = 0, |
| | 512 | One = 1, |
| | 513 | OneAndAHalf = 2, |
| | 514 | Two = 3, |
| | 515 | _, |
| | 516 | }; |
| | 517 | |
| | 518 | type: DevicePathType, |
| | 519 | subtype: Subtype, |
| | 520 | length: u16, |
| | 521 | reserved: u16, |
| | 522 | baud_rate: u32, |
| | 523 | data_bits: u8, |
| | 524 | parity: Parity, |
| | 525 | stop_bits: StopBits, |
| | 526 | }; |
| | 527 | |
| | 528 | pub const VendorDefinedDevicePath = packed struct { |
| | 529 | type: DevicePathType, |
| | 530 | subtype: Subtype, |
| | 531 | length: u16, |
| | 532 | vendor_guid: Guid, |
| | 533 | }; |
| 308 | }; | 534 | }; |
| 309 | | 535 | |
| 310 | pub const MediaDevicePath = union(Subtype) { | 536 | pub const MediaDevicePath = union(Subtype) { |
| ... | @@ -332,24 +558,44 @@ pub const MediaDevicePath = union(Subtype) { | ... | @@ -332,24 +558,44 @@ pub const MediaDevicePath = union(Subtype) { |
| 332 | }; | 558 | }; |
| 333 | | 559 | |
| 334 | pub const HardDriveDevicePath = packed struct { | 560 | pub const HardDriveDevicePath = packed struct { |
| | 561 | pub const Format = enum(u8) { |
| | 562 | LegacyMbr = 0x01, |
| | 563 | GuidPartitionTable = 0x02, |
| | 564 | }; |
| | 565 | |
| | 566 | pub const SignatureType = enum(u8) { |
| | 567 | NoSignature = 0x00, |
| | 568 | /// "32-bit signature from address 0x1b8 of the type 0x01 MBR" |
| | 569 | MbrSignature = 0x01, |
| | 570 | GuidSignature = 0x02, |
| | 571 | }; |
| | 572 | |
| 335 | type: DevicePathType, | 573 | type: DevicePathType, |
| 336 | subtype: Subtype, | 574 | subtype: Subtype, |
| 337 | length: u16, | 575 | length: u16, |
| 338 | // TODO | 576 | partition_number: u32, |
| | 577 | partition_start: u64, |
| | 578 | partition_size: u64, |
| | 579 | partition_signature: [16]u8, |
| | 580 | partition_format: Format, |
| | 581 | signature_type: SignatureType, |
| 339 | }; | 582 | }; |
| 340 | | 583 | |
| 341 | pub const CdromDevicePath = packed struct { | 584 | pub const CdromDevicePath = packed struct { |
| 342 | type: DevicePathType, | 585 | type: DevicePathType, |
| 343 | subtype: Subtype, | 586 | subtype: Subtype, |
| 344 | length: u16, | 587 | length: u16, |
| 345 | // TODO | 588 | boot_entry: u32, |
| | 589 | partition_start: u64, |
| | 590 | partition_size: u64, |
| 346 | }; | 591 | }; |
| 347 | | 592 | |
| 348 | pub const VendorDevicePath = packed struct { | 593 | pub const VendorDevicePath = packed struct { |
| 349 | type: DevicePathType, | 594 | type: DevicePathType, |
| 350 | subtype: Subtype, | 595 | subtype: Subtype, |
| 351 | length: u16, | 596 | length: u16, |
| 352 | // TODO | 597 | guid: Guid, |
| | 598 | // vendor-defined variable data |
| 353 | }; | 599 | }; |
| 354 | | 600 | |
| 355 | pub const FilePathDevicePath = packed struct { | 601 | pub const FilePathDevicePath = packed struct { |
| ... | @@ -366,19 +612,21 @@ pub const MediaDevicePath = union(Subtype) { | ... | @@ -366,19 +612,21 @@ pub const MediaDevicePath = union(Subtype) { |
| 366 | type: DevicePathType, | 612 | type: DevicePathType, |
| 367 | subtype: Subtype, | 613 | subtype: Subtype, |
| 368 | length: u16, | 614 | length: u16, |
| 369 | // TODO | 615 | guid: Guid, |
| 370 | }; | 616 | }; |
| 371 | | 617 | |
| 372 | pub const PiwgFirmwareFileDevicePath = packed struct { | 618 | pub const PiwgFirmwareFileDevicePath = packed struct { |
| 373 | type: DevicePathType, | 619 | type: DevicePathType, |
| 374 | subtype: Subtype, | 620 | subtype: Subtype, |
| 375 | length: u16, | 621 | length: u16, |
| | 622 | fv_filename: Guid, |
| 376 | }; | 623 | }; |
| 377 | | 624 | |
| 378 | pub const PiwgFirmwareVolumeDevicePath = packed struct { | 625 | pub const PiwgFirmwareVolumeDevicePath = packed struct { |
| 379 | type: DevicePathType, | 626 | type: DevicePathType, |
| 380 | subtype: Subtype, | 627 | subtype: Subtype, |
| 381 | length: u16, | 628 | length: u16, |
| | 629 | fv_name: Guid, |
| 382 | }; | 630 | }; |
| 383 | | 631 | |
| 384 | pub const RelativeOffsetRangeDevicePath = packed struct { | 632 | pub const RelativeOffsetRangeDevicePath = packed struct { |
| ... | @@ -396,7 +644,7 @@ pub const MediaDevicePath = union(Subtype) { | ... | @@ -396,7 +644,7 @@ pub const MediaDevicePath = union(Subtype) { |
| 396 | length: u16, | 644 | length: u16, |
| 397 | start: u64, | 645 | start: u64, |
| 398 | end: u64, | 646 | end: u64, |
| 399 | disk_type: uefi.Guid, | 647 | disk_type: Guid, |
| 400 | instance: u16, | 648 | instance: u16, |
| 401 | }; | 649 | }; |
| 402 | }; | 650 | }; |