Commit a2a2601da5

fifty-six <ybham6@gmail.com>
2022-01-14 13:02:34
std/os/uefi: Complete DevicePathProtocol types
1 parent ae084c5
Changed files (2)
lib
std
lib/std/os/uefi/protocols/device_path_protocol.zig
@@ -265,24 +265,24 @@ pub const AcpiDevicePath = union(Subtype) {
 };
 
 pub const MessagingDevicePath = union(Subtype) {
-    Atapi: void, // TODO
-    Scsi: void, // TODO
-    FibreChannel: void, // TODO
-    FibreChannelEx: void, // TODO
-    @"1394": void, // TODO
-    Usb: void, // TODO
-    Sata: void, // TODO
-    UsbWwid: void, // TODO
-    Lun: void, // TODO
-    UsbClass: void, // TODO
-    I2o: void, // TODO
-    MacAddress: void, // TODO
-    Ipv4: void, // TODO
-    Ipv6: void, // TODO
-    Vlan: void, // TODO
-    InfiniBand: void, // TODO
-    Uart: void, // TODO
-    Vendor: void, // TODO
+    Atapi: *const AtapiDevicePath,
+    Scsi: *const ScsiDevicePath,
+    FibreChannel: *const FibreChannelDevicePath,
+    FibreChannelEx: FibreChannelExDevicePath,
+    @"1394": *const F1394DevicePath,
+    Usb: *const UsbDevicePath,
+    Sata: *const SataDevicePath,
+    UsbWwid: *const UsbWwidDevicePath,
+    Lun: *const DeviceLogicalUnitDevicePath,
+    UsbClass: *const UsbClassDevicePath,
+    I2o: *const I2oDevicePath,
+    MacAddress: *const MacAddressDevicePath,
+    Ipv4: *const Ipv4DevicePath,
+    Ipv6: *const Ipv6DevicePath,
+    Vlan: *const VlanDevicePath,
+    InfiniBand: *const InfiniBandDevicePath,
+    Uart: *const UartDevicePath,
+    Vendor: *const VendorDefinedDevicePath,
 
     pub const Subtype = enum(u8) {
         Atapi = 1,
@@ -305,6 +305,232 @@ pub const MessagingDevicePath = union(Subtype) {
         Vendor = 10,
         _,
     };
+
+    pub const AtapiDevicePath = packed struct {
+        const Role = enum(u8) {
+            Master = 0,
+            Slave = 1,
+        };
+
+        const Rank = enum(u8) {
+            Primary = 0,
+            Secondary = 1,
+        };
+
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        primary_secondary: Rank,
+        slave_master: Role,
+        logical_unit_number: u16,
+    };
+
+    pub const ScsiDevicePath = packed struct {
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        target_id: u16,
+        logical_unit_number: u16,
+    };
+
+    pub const FibreChannelDevicePath = packed struct {
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        reserved: u32,
+        world_wide_name: u64,
+        logical_unit_number: u64,
+    };
+
+    pub const FibreChannelExDevicePath = packed struct {
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        reserved: u32,
+        world_wide_name: [8]u8,
+        logical_unit_number: [8]u8,
+    };
+
+    pub const F1394DevicePath = packed struct {
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        reserved: u32,
+        guid: u64,
+    };
+
+    pub const UsbDevicePath = packed struct {
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        parent_port_number: u8,
+        interface_number: u8,
+    };
+
+    pub const SataDevicePath = packed struct {
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        hba_port_number: u16,
+        port_multiplier_port_number: u16,
+        logical_unit_number: u16,
+    };
+
+    pub const UsbWwidDevicePath = packed struct {
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        interface_number: u16,
+        device_vendor_id: u16,
+        device_product_id: u16,
+
+        pub fn serial_number(self: *const UsbWwidDevicePath) []const u16 {
+            var serial_len = (self.length - @sizeOf(UsbWwidDevicePath)) / @sizeOf(u16);
+            return @ptrCast([*]u16, @ptrCast([*]u8, self) + @sizeOf(UsbWwidDevicePath))[0..serial_len];
+        }
+    };
+
+    pub const DeviceLogicalUnitDevicePath = packed struct {
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        lun: u8,
+    };
+
+    pub const UsbClassDevicePath = packed struct {
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        vendor_id: u16,
+        product_id: u16,
+        device_class: u8,
+        device_subclass: u8,
+        device_protocol: u8,
+    };
+
+    pub const I2oDevicePath = packed struct {
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        tid: u32,
+    };
+
+    pub const MacAddressDevicePath = packed struct {
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        mac_address: uefi.MacAddress,
+        if_type: u8,
+    };
+
+    pub const Ipv4DevicePath = packed struct {
+        pub const IpType = enum(u8) {
+            Dhcp = 0,
+            Static = 1,
+        };
+
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        local_ip_address: uefi.Ipv4Address,
+        remote_ip_address: uefi.Ipv4Address,
+        local_port: u16,
+        remote_port: u16,
+        network_protocol: u16,
+        static_ip_address: IpType,
+        gateway_ip_address: u32,
+        subnet_mask: u32,
+    };
+
+    pub const Ipv6DevicePath = packed struct {
+        pub const Origin = enum(u8) {
+            Manual = 0,
+            AssignedStateless = 1,
+            AssignedStateful = 2,
+        };
+
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        local_ip_address: uefi.Ipv6Address,
+        remote_ip_address: uefi.Ipv6Address,
+        local_port: u16,
+        remote_port: u16,
+        protocol: u16,
+        ip_address_origin: Origin,
+        prefix_length: u8,
+        gateway_ip_address: uefi.Ipv6Address,
+    };
+
+    pub const VlanDevicePath = packed struct {
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        vlan_id: u16,
+    };
+
+    pub const InfiniBandDevicePath = packed struct {
+        pub const ResourceFlags = packed struct {
+            pub const ControllerType = enum(u1) {
+                Ioc = 0,
+                Service = 1,
+            };
+
+            ioc_or_service: ControllerType,
+            extend_boot_environment: bool,
+            console_protocol: bool,
+            storage_protocol: bool,
+            network_protocol: bool,
+
+            // u1 + 4 * bool = 5 bits, we need a total of 32 bits
+            reserved: u27,
+        };
+
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        resource_flags: ResourceFlags,
+        port_gid: [16]u8,
+        service_id: u64,
+        target_port_id: u64,
+        device_id: u64,
+    };
+
+    pub const UartDevicePath = packed struct {
+        pub const Parity = enum(u8) {
+            Default = 0,
+            None = 1,
+            Even = 2,
+            Odd = 3,
+            Mark = 4,
+            Space = 5,
+            _,
+        };
+
+        pub const StopBits = enum(u8) {
+            Default = 0,
+            One = 1,
+            OneAndAHalf = 2,
+            Two = 3,
+            _,
+        };
+
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        reserved: u16,
+        baud_rate: u32,
+        data_bits: u8,
+        parity: Parity,
+        stop_bits: StopBits,
+    };
+
+    pub const VendorDefinedDevicePath = packed struct {
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        vendor_guid: Guid,
+    };
 };
 
 pub const MediaDevicePath = union(Subtype) {
@@ -332,24 +558,44 @@ pub const MediaDevicePath = union(Subtype) {
     };
 
     pub const HardDriveDevicePath = packed struct {
+        pub const Format = enum(u8) {
+            LegacyMbr = 0x01,
+            GuidPartitionTable = 0x02,
+        };
+
+        pub const SignatureType = enum(u8) {
+            NoSignature = 0x00,
+            /// "32-bit signature from address 0x1b8 of the type 0x01 MBR"
+            MbrSignature = 0x01,
+            GuidSignature = 0x02,
+        };
+
         type: DevicePathType,
         subtype: Subtype,
         length: u16,
-        // TODO
+        partition_number: u32,
+        partition_start: u64,
+        partition_size: u64,
+        partition_signature: [16]u8,
+        partition_format: Format,
+        signature_type: SignatureType,
     };
 
     pub const CdromDevicePath = packed struct {
         type: DevicePathType,
         subtype: Subtype,
         length: u16,
-        // TODO
+        boot_entry: u32,
+        partition_start: u64,
+        partition_size: u64,
     };
 
     pub const VendorDevicePath = packed struct {
         type: DevicePathType,
         subtype: Subtype,
         length: u16,
-        // TODO
+        guid: Guid,
+        // vendor-defined variable data
     };
 
     pub const FilePathDevicePath = packed struct {
@@ -366,19 +612,21 @@ pub const MediaDevicePath = union(Subtype) {
         type: DevicePathType,
         subtype: Subtype,
         length: u16,
-        // TODO
+        guid: Guid,
     };
 
     pub const PiwgFirmwareFileDevicePath = packed struct {
         type: DevicePathType,
         subtype: Subtype,
         length: u16,
+        fv_filename: Guid,
     };
 
     pub const PiwgFirmwareVolumeDevicePath = packed struct {
         type: DevicePathType,
         subtype: Subtype,
         length: u16,
+        fv_name: Guid,
     };
 
     pub const RelativeOffsetRangeDevicePath = packed struct {
@@ -396,7 +644,7 @@ pub const MediaDevicePath = union(Subtype) {
         length: u16,
         start: u64,
         end: u64,
-        disk_type: uefi.Guid,
+        disk_type: Guid,
         instance: u16,
     };
 };
lib/std/os/uefi.zig
@@ -23,6 +23,18 @@ pub var system_table: *tables.SystemTable = undefined;
 /// A handle to an event structure.
 pub const Event = *opaque {};
 
+pub const MacAddress = extern struct {
+    address: [32]u8,
+};
+
+pub const Ipv4Address = extern struct {
+    address: [4]u8,
+};
+
+pub const Ipv6Address = extern struct {
+    address: [16]u8,
+};
+
 /// GUIDs must be align(8)
 pub const Guid = extern struct {
     time_low: u32,