Commit ae084c5f59

fifty-six <ybham6@gmail.com>
2022-01-13 21:44:29
std/os/uefi: Complete AcpiDevicePath and HardwareDevicePaths
1 parent 322757c
Changed files (1)
lib
std
os
lib/std/os/uefi/protocols/device_path_protocol.zig
@@ -87,7 +87,10 @@ pub const DevicePathProtocol = packed struct {
             },
             .Acpi => blk: {
                 const acpi: ?AcpiDevicePath = switch (@intToEnum(AcpiDevicePath.Subtype, self.subtype)) {
-                    else => null, // TODO
+                    .Acpi => .{ .Acpi = @ptrCast(*const AcpiDevicePath.BaseAcpiDevicePath, self) },
+                    .ExpandedAcpi => .{ .ExpandedAcpi = @ptrCast(*const AcpiDevicePath.ExpandedAcpiDevicePath, self) },
+                    .Adr => .{ .Adr = @ptrCast(*const AcpiDevicePath.AdrDevicePath, self) },
+                    _ => null,
                 };
                 break :blk if (acpi) |a| .{ .Acpi = a } else null;
             },
@@ -173,58 +176,92 @@ pub const HardwareDevicePath = union(Subtype) {
         type: DevicePathType,
         subtype: Subtype,
         length: u16,
-        // TODO
+        function: u8,
+        device: u8,
     };
 
     pub const PcCardDevicePath = packed struct {
         type: DevicePathType,
         subtype: Subtype,
         length: u16,
-        // TODO
+        function_number: u8,
     };
 
     pub const MemoryMappedDevicePath = packed struct {
         type: DevicePathType,
         subtype: Subtype,
         length: u16,
-        // TODO
+        memory_type: u32,
+        start_address: u64,
+        end_address: u64,
     };
 
     pub const VendorDevicePath = packed struct {
         type: DevicePathType,
         subtype: Subtype,
         length: u16,
-        // TODO
+        vendor_guid: Guid,
     };
 
     pub const ControllerDevicePath = packed struct {
         type: DevicePathType,
         subtype: Subtype,
         length: u16,
-        // TODO
+        controller_number: u32,
     };
 
     pub const BmcDevicePath = packed struct {
         type: DevicePathType,
         subtype: Subtype,
         length: u16,
-        // TODO
+        interface_type: u8,
+        base_address: usize,
     };
 };
 
 pub const AcpiDevicePath = union(Subtype) {
-    Acpi: void, // TODO
-    ExpandedAcpi: void, // TODO
-    Adr: void, // TODO
-    Nvdimm: void, // TODO
+    Acpi: *const BaseAcpiDevicePath,
+    ExpandedAcpi: *const ExpandedAcpiDevicePath,
+    Adr: *const AdrDevicePath,
 
     pub const Subtype = enum(u8) {
         Acpi = 1,
         ExpandedAcpi = 2,
         Adr = 3,
-        Nvdimm = 4,
         _,
     };
+
+    pub const BaseAcpiDevicePath = packed struct {
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        hid: u32,
+        uid: u32,
+    };
+
+    pub const ExpandedAcpiDevicePath = packed struct {
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        hid: u32,
+        uid: u32,
+        cid: u32,
+        // variable length u16[*:0] strings
+        // hid_str, uid_str, cid_str
+    };
+
+    pub const AdrDevicePath = packed struct {
+        type: DevicePathType,
+        subtype: Subtype,
+        length: u16,
+        adr: u32,
+        // multiple adr entries can optionally follow
+        pub fn adrs(self: *const AdrDevicePath) []const u32 {
+            // self.length is a minimum of 8 with one adr which is size 4.
+            var entries = (self.length - 4) / @sizeOf(u32);
+            return @ptrCast([*]const u32, &self.adr)[0..entries];
+        }
+    };
 };
 
 pub const MessagingDevicePath = union(Subtype) {