@@ -6,63 +6,124 @@ pub fn execute(ctx: dim.Context) !void {
6
6
@panic ("gpt-part not implemented yet!" );
7
7
}
8
8
9
- pub const gpt = struct {
10
- pub const Guid = [16 ]u8 ;
9
+ const block_size = 512 ;
11
10
12
- pub const Table = struct {
13
- disk_id : Guid ,
11
+ const PartTable = @This ();
14
12
15
- partitions : [] const Partition ,
16
- };
13
+ disk_id : Guid ,
14
+ partitions : [] Partition ,
17
15
18
- pub const Partition = struct {
19
- type : Guid ,
20
- part_id : Guid ,
16
+ fn render (table : * PartTable , stream : * dim.BinaryStream ) dim.Content.RenderError ! void {
17
+ {
18
+ var pmbr : [block_size ]u8 = @splat (0 );
19
+ var efi_prot : * [16 ]u8 = & pmbr [0x1BE.. ][0.. 16];
20
+ std .mem .writeInt (u48 , & efi_prot [1 ], 0x000200 , .little );
21
+ efi_prot [4 ] = 0xEE ;
22
+ // TODO: ending CHS
23
+ std .mem .writeInt (u64 , & efi_prot [8 ], 1 , .little );
24
+ // TODO: size in LBA
21
25
22
- offset : ? u64 = null ,
23
- size : u64 ,
26
+ pmbr [ 0x01FE ] = 0x55 ;
27
+ pmbr [ 0x01FF ] = 0xAA ;
24
28
25
- name : [36 ]u16 ,
29
+ try stream .write (0 , & pmbr );
30
+ }
31
+ {
32
+ var gpt_header : [block_size ]u8 = @splat (0 );
33
+ @memcpy (& gpt_header [0.. 8], "EFI PART" );
34
+ std .mem .writeInt (u32 , & gpt_header [8.. 12], 0x00010000 , .little );
35
+ std .mem .writeInt (u32 , & gpt_header [12.. 16], 96 , .little );
36
+ // TODO: header CRC
37
+ std .mem .writeInt (u64 , & gpt_header [24.. 32], 1 , .little );
38
+ // TODO: alternate lba
39
+ // TODO: first usable lba
40
+ // TODO: last usable lba
41
+ @memcpy (& gpt_header [56.. 72], & table .disk_id );
42
+ std .mem .writeInt (u64 , & gpt_header [72.. 80], 2 , .little );
43
+ std .mem .writeInt (u32 , & gpt_header [80.. 84], table .partitions .len , .little );
44
+ std .mem .writeInt (u32 , & gpt_header [84.. 88], 128 , .little );
45
+ // TODO: partition array CRC
46
+ }
47
+ }
26
48
27
- attributes : Attributes ,
49
+ pub const Guid = [ 16 ] u8 ;
28
50
29
- // data: Content,
51
+ fn parseGuid (str : []const u8 ) ! Guid {
52
+ @setEvalBranchQuota (4096 );
30
53
31
- pub const Attributes = packed struct (u32 ) {
32
- system : bool ,
33
- efi_hidden : bool ,
34
- legacy : bool ,
35
- read_only : bool ,
36
- hidden : bool ,
37
- no_automount : bool ,
54
+ var guid : Guid = undefined ;
38
55
39
- padding : u26 = 0 ,
40
- };
41
- };
56
+ if (str .len != 36 or std .mem .count (u8 , str , "-" ) != 4 or str [8 ] != '-' or str [13 ] != '-' or str [18 ] != '-' or str [23 ] != '-' ) {
57
+ return error .InvalidUuid ;
58
+ }
59
+
60
+ const set_1 = try std .fmt .parseInt (u32 , str [0.. 8], 16 );
61
+ const set_2 = try std .fmt .parseInt (u16 , str [9.. 13], 16 );
62
+ const set_3 = try std .fmt .parseInt (u16 , str [14.. 18], 16 );
63
+ const set_4 = try std .fmt .parseInt (u16 , str [19.. 23], 16 );
64
+ const set_5 = try std .fmt .parseInt (u48 , str [24.. 36], 16 );
65
+
66
+ std .mem .writeInt (u32 , & guid [0 ], set_1 , .big );
67
+ std .mem .writeInt (u16 , & guid [4 ], set_2 , .big );
68
+ std .mem .writeInt (u16 , & guid [6 ], set_3 , .big );
69
+ std .mem .writeInt (u16 , & guid [8 ], set_4 , .big );
70
+ std .mem .writeInt (u48 , & guid [10 ], set_5 , .big );
71
+
72
+ return guid ;
73
+ }
74
+
75
+ pub const Partition = struct {
76
+ type : Guid ,
77
+ part_id : Guid ,
42
78
43
- /// https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs
44
- pub const PartitionType = struct {
45
- pub const unused : Guid = .{};
79
+ offset : ? u64 = null ,
80
+ size : u64 ,
46
81
47
- pub const microsoft_basic_data : Guid = .{};
48
- pub const microsoft_reserved : Guid = .{};
82
+ name : [35 :0 ]u16 ,
49
83
50
- pub const windows_recovery : Guid = .{};
84
+ attributes : Attributes ,
51
85
52
- pub const plan9 : Guid = .{};
86
+ data : dim.Content ,
53
87
54
- pub const linux_swap : Guid = .{};
55
- pub const linux_fs : Guid = .{};
56
- pub const linux_reserved : Guid = .{};
57
- pub const linux_lvm : Guid = .{};
88
+ pub const Attributes = packed struct (u32 ) {
89
+ system : bool ,
90
+ efi_hidden : bool ,
91
+ legacy : bool ,
92
+ read_only : bool ,
93
+ hidden : bool ,
94
+ no_automount : bool ,
95
+
96
+ padding : u10 = 0 ,
97
+ user : u16 ,
58
98
};
99
+ };
59
100
60
- pub fn nameLiteral (comptime name : []const u8 ) [36 ]u16 {
61
- return comptime blk : {
62
- var buf : [36 ]u16 = undefined ;
63
- const len = std .unicode .utf8ToUtf16Le (& buf , name ) catch | err | @compileError (@tagName (err ));
64
- @memset (buf [len .. ], 0 );
65
- break :blk & buf ;
66
- };
67
- }
101
+ /// https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs
102
+ pub const PartitionType = struct {
103
+ pub const unused : Guid = parseGuid ("00000000-0000-0000-0000-000000000000" ) catch unreachable ;
104
+
105
+ pub const esp : Guid = parseGuid ("C12A7328-F81F-11D2-BA4B-00A0C93EC93B" ) catch unreachable ;
106
+ pub const legacy_mbr : Guid = parseGuid ("024DEE41-33E7-11D3-9D69-0008C781F39F" ) catch unreachable ;
107
+ pub const bios_boot : Guid = parseGuid ("21686148-6449-6E6F-744E-656564454649" ) catch unreachable ;
108
+
109
+ pub const microsoft_basic_data : Guid = parseGuid ("EBD0A0A2-B9E5-4433-87C0-68B6B72699C7" ) catch unreachable ;
110
+ pub const microsoft_reserved : Guid = parseGuid ("E3C9E316-0B5C-4DB8-817D-F92DF00215AE" ) catch unreachable ;
111
+
112
+ pub const windows_recovery : Guid = parseGuid ("DE94BBA4-06D1-4D40-A16A-BFD50179D6AC" ) catch unreachable ;
113
+
114
+ pub const plan9 : Guid = parseGuid ("C91818F9-8025-47AF-89D2-F030D7000C2C" ) catch unreachable ;
115
+
116
+ pub const linux_swap : Guid = parseGuid ("0657FD6D-A4AB-43C4-84E5-0933C84B4F4F" ) catch unreachable ;
117
+ pub const linux_fs : Guid = parseGuid ("0FC63DAF-8483-4772-8E79-3D69D8477DE4" ) catch unreachable ;
118
+ pub const linux_reserved : Guid = parseGuid ("8DA63339-0007-60C0-C436-083AC8230908" ) catch unreachable ;
119
+ pub const linux_lvm : Guid = parseGuid ("E6D6D379-F507-44C2-A23C-238F2A3DF928" ) catch unreachable ;
68
120
};
121
+
122
+ pub fn nameLiteral (comptime name : []const u8 ) [35 :0 ]u16 {
123
+ return comptime blk : {
124
+ var buf : [35 :0 ]u16 = undefined ;
125
+ const len = std .unicode .utf8ToUtf16Le (& buf , name ) catch | err | @compileError (@tagName (err ));
126
+ @memset (buf [len .. ], 0 );
127
+ break :blk & buf ;
128
+ };
129
+ }
0 commit comments