authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-13 14:59:15+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-03-13 14:59:15+01:00
log1af0c75d71257ede964abf81209e167cb40f71f8
treeb2c1ee755d09ce8026f345d3912203afe5e1b84f
parent68c224d6ec9e710e70b4500c5b73fb40780621c0

std: fix imports for darwin specific flags and funcs


4 files changed, 51 insertions(+), 47 deletions(-)

lib/std/c.zig+3-1
...@@ -39,10 +39,12 @@ pub fn versionCheck(glibc_version: std.builtin.Version) type {...@@ -39,10 +39,12 @@ pub fn versionCheck(glibc_version: std.builtin.Version) type {
39 };39 };
40}40}
4141
42pub const darwin = @import("c/darwin.zig");
43
42pub usingnamespace switch (builtin.os.tag) {44pub usingnamespace switch (builtin.os.tag) {
43 .linux => @import("c/linux.zig"),45 .linux => @import("c/linux.zig"),
44 .windows => @import("c/windows.zig"),46 .windows => @import("c/windows.zig"),
45 .macos, .ios, .tvos, .watchos => @import("c/darwin.zig"),47 .macos, .ios, .tvos, .watchos => darwin,
46 .freebsd, .kfreebsd => @import("c/freebsd.zig"),48 .freebsd, .kfreebsd => @import("c/freebsd.zig"),
47 .netbsd => @import("c/netbsd.zig"),49 .netbsd => @import("c/netbsd.zig"),
48 .dragonfly => @import("c/dragonfly.zig"),50 .dragonfly => @import("c/dragonfly.zig"),
lib/std/macho.zig+9-9
...@@ -2,15 +2,15 @@ const std = @import("std");...@@ -2,15 +2,15 @@ const std = @import("std");
2const builtin = @import("builtin");2const builtin = @import("builtin");
3const assert = std.debug.assert;3const assert = std.debug.assert;
4const io = std.io;4const io = std.io;
5const os = std.os.darwin;5const c = std.c.darwin;
6const mem = std.mem;6const mem = std.mem;
7const meta = std.meta;7const meta = std.meta;
8const testing = std.testing;8const testing = std.testing;
99
10const Allocator = mem.Allocator;10const Allocator = mem.Allocator;
1111
12pub const cpu_type_t = os.integer_t;12pub const cpu_type_t = c.integer_t;
13pub const cpu_subtype_t = os.integer_t;13pub const cpu_subtype_t = c.integer_t;
1414
15pub const mach_header = extern struct {15pub const mach_header = extern struct {
16 magic: u32,16 magic: u32,
...@@ -605,10 +605,10 @@ pub const segment_command = extern struct {...@@ -605,10 +605,10 @@ pub const segment_command = extern struct {
605 filesize: u32,605 filesize: u32,
606606
607 /// maximum VM protection607 /// maximum VM protection
608 maxprot: os.vm_prot_t,608 maxprot: c.vm_prot_t,
609609
610 /// initial VM protection610 /// initial VM protection
611 initprot: os.vm_prot_t,611 initprot: c.vm_prot_t,
612612
613 /// number of sections in segment613 /// number of sections in segment
614 nsects: u32,614 nsects: u32,
...@@ -642,10 +642,10 @@ pub const segment_command_64 = extern struct {...@@ -642,10 +642,10 @@ pub const segment_command_64 = extern struct {
642 filesize: u64 = 0,642 filesize: u64 = 0,
643643
644 /// maximum VM protection644 /// maximum VM protection
645 maxprot: os.vm_prot_t = os.PROT.NONE,645 maxprot: c.vm_prot_t = c.PROT.NONE,
646646
647 /// initial VM protection647 /// initial VM protection
648 initprot: os.vm_prot_t = os.PROT.NONE,648 initprot: c.vm_prot_t = c.PROT.NONE,
649649
650 /// number of sections in segment650 /// number of sections in segment
651 nsects: u32 = 0,651 nsects: u32 = 0,
...@@ -2148,8 +2148,8 @@ test "read-write segment command" {...@@ -2148,8 +2148,8 @@ test "read-write segment command" {
2148 .vmaddr = 4294967296,2148 .vmaddr = 4294967296,
2149 .vmsize = 294912,2149 .vmsize = 294912,
2150 .filesize = 294912,2150 .filesize = 294912,
2151 .maxprot = os.PROT.READ | os.PROT.WRITE | os.PROT.EXEC,2151 .maxprot = c.PROT.READ | c.PROT.WRITE | c.PROT.EXEC,
2152 .initprot = os.PROT.EXEC | os.PROT.READ,2152 .initprot = c.PROT.EXEC | c.PROT.READ,
2153 .nsects = 1,2153 .nsects = 1,
2154 },2154 },
2155 };2155 };
lib/std/os.zig+5-1
...@@ -29,7 +29,11 @@ const Allocator = std.mem.Allocator;...@@ -29,7 +29,11 @@ const Allocator = std.mem.Allocator;
29const Preopen = std.fs.wasi.Preopen;29const Preopen = std.fs.wasi.Preopen;
30const PreopenList = std.fs.wasi.PreopenList;30const PreopenList = std.fs.wasi.PreopenList;
3131
32pub const darwin = @import("os/darwin.zig");32pub const darwin = struct {
33 pub usingnamespace std.c;
34 pub usingnamespace @import("os/darwin.zig");
35};
36
33pub const dragonfly = std.c;37pub const dragonfly = std.c;
34pub const freebsd = std.c;38pub const freebsd = std.c;
35pub const haiku = std.c;39pub const haiku = std.c;
lib/std/os/darwin.zig+34-36
...@@ -1,9 +1,7 @@...@@ -1,9 +1,7 @@
1const std = @import("std");1const std = @import("std");
2const c = std.c.darwin;
2const log = std.log;3const log = std.log;
3const mem = std.mem;4const mem = std.mem;
4const os = @This();
5
6pub usingnamespace @import("../c.zig");
75
8pub const MachError = error{6pub const MachError = error{
9 /// Not enough permissions held to perform the requested kernel7 /// Not enough permissions held to perform the requested kernel
...@@ -16,24 +14,24 @@ pub const MachError = error{...@@ -16,24 +14,24 @@ pub const MachError = error{
16};14};
1715
18pub const MachTask = struct {16pub const MachTask = struct {
19 port: os.mach_port_name_t,17 port: c.mach_port_name_t,
2018
21 pub fn isValid(self: MachTask) bool {19 pub fn isValid(self: MachTask) bool {
22 return self.port != 0;20 return self.port != 0;
23 }21 }
2422
25 pub fn getCurrProtection(task: MachTask, address: u64, len: usize) MachError!os.vm_prot_t {23 pub fn getCurrProtection(task: MachTask, address: u64, len: usize) MachError!c.vm_prot_t {
26 var base_addr = address;24 var base_addr = address;
27 var base_len: os.mach_vm_size_t = if (len == 1) 2 else len;25 var base_len: c.mach_vm_size_t = if (len == 1) 2 else len;
28 var objname: os.mach_port_t = undefined;26 var objname: c.mach_port_t = undefined;
29 var info: os.vm_region_submap_info_64 = undefined;27 var info: c.vm_region_submap_info_64 = undefined;
30 var count: os.mach_msg_type_number_t = os.VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;28 var count: c.mach_msg_type_number_t = c.VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
31 switch (os.getKernError(os.mach_vm_region(29 switch (c.getKernError(c.mach_vm_region(
32 task.port,30 task.port,
33 &base_addr,31 &base_addr,
34 &base_len,32 &base_len,
35 os.VM_REGION_BASIC_INFO_64,33 c.VM_REGION_BASIC_INFO_64,
36 @ptrCast(os.vm_region_info_t, &info),34 @ptrCast(c.vm_region_info_t, &info),
37 &count,35 &count,
38 &objname,36 &objname,
39 ))) {37 ))) {
...@@ -46,16 +44,16 @@ pub const MachTask = struct {...@@ -46,16 +44,16 @@ pub const MachTask = struct {
46 }44 }
47 }45 }
4846
49 pub fn setMaxProtection(task: MachTask, address: u64, len: usize, prot: os.vm_prot_t) MachError!void {47 pub fn setMaxProtection(task: MachTask, address: u64, len: usize, prot: c.vm_prot_t) MachError!void {
50 return task.setProtectionImpl(address, len, true, prot);48 return task.setProtectionImpl(address, len, true, prot);
51 }49 }
5250
53 pub fn setCurrProtection(task: MachTask, address: u64, len: usize, prot: os.vm_prot_t) MachError!void {51 pub fn setCurrProtection(task: MachTask, address: u64, len: usize, prot: c.vm_prot_t) MachError!void {
54 return task.setProtectionImpl(address, len, false, prot);52 return task.setProtectionImpl(address, len, false, prot);
55 }53 }
5654
57 fn setProtectionImpl(task: MachTask, address: u64, len: usize, set_max: bool, prot: os.vm_prot_t) MachError!void {55 fn setProtectionImpl(task: MachTask, address: u64, len: usize, set_max: bool, prot: c.vm_prot_t) MachError!void {
58 switch (os.getKernError(os.mach_vm_protect(task.port, address, len, @boolToInt(set_max), prot))) {56 switch (c.getKernError(c.mach_vm_protect(task.port, address, len, @boolToInt(set_max), prot))) {
59 .SUCCESS => return,57 .SUCCESS => return,
60 .FAILURE => return error.PermissionDenied,58 .FAILURE => return error.PermissionDenied,
61 else => |err| {59 else => |err| {
...@@ -73,7 +71,7 @@ pub const MachTask = struct {...@@ -73,7 +71,7 @@ pub const MachTask = struct {
73 try task.setCurrProtection(71 try task.setCurrProtection(
74 address,72 address,
75 buf.len,73 buf.len,
76 os.PROT.READ | os.PROT.WRITE | os.PROT.COPY,74 c.PROT.READ | c.PROT.WRITE | c.PROT.COPY,
77 );75 );
78 defer {76 defer {
79 task.setCurrProtection(address, buf.len, curr_prot) catch {};77 task.setCurrProtection(address, buf.len, curr_prot) catch {};
...@@ -90,11 +88,11 @@ pub const MachTask = struct {...@@ -90,11 +88,11 @@ pub const MachTask = struct {
9088
91 while (total_written < count) {89 while (total_written < count) {
92 const curr_size = maxBytesLeftInPage(page_size, curr_addr, count - total_written);90 const curr_size = maxBytesLeftInPage(page_size, curr_addr, count - total_written);
93 switch (os.getKernError(os.mach_vm_write(91 switch (c.getKernError(c.mach_vm_write(
94 task.port,92 task.port,
95 curr_addr,93 curr_addr,
96 @ptrToInt(out_buf.ptr),94 @ptrToInt(out_buf.ptr),
97 @intCast(os.mach_msg_type_number_t, curr_size),95 @intCast(c.mach_msg_type_number_t, curr_size),
98 ))) {96 ))) {
99 .SUCCESS => {},97 .SUCCESS => {},
100 .FAILURE => return error.PermissionDenied,98 .FAILURE => return error.PermissionDenied,
...@@ -106,12 +104,12 @@ pub const MachTask = struct {...@@ -106,12 +104,12 @@ pub const MachTask = struct {
106104
107 switch (arch) {105 switch (arch) {
108 .aarch64 => {106 .aarch64 => {
109 var mattr_value: os.vm_machine_attribute_val_t = os.MATTR_VAL_CACHE_FLUSH;107 var mattr_value: c.vm_machine_attribute_val_t = c.MATTR_VAL_CACHE_FLUSH;
110 switch (os.getKernError(os.vm_machine_attribute(108 switch (c.getKernError(c.vm_machine_attribute(
111 task.port,109 task.port,
112 curr_addr,110 curr_addr,
113 curr_size,111 curr_size,
114 os.MATTR_CACHE,112 c.MATTR_CACHE,
115 &mattr_value,113 &mattr_value,
116 ))) {114 ))) {
117 .SUCCESS => {},115 .SUCCESS => {},
...@@ -143,9 +141,9 @@ pub const MachTask = struct {...@@ -143,9 +141,9 @@ pub const MachTask = struct {
143141
144 while (total_read < count) {142 while (total_read < count) {
145 const curr_size = maxBytesLeftInPage(page_size, curr_addr, count - total_read);143 const curr_size = maxBytesLeftInPage(page_size, curr_addr, count - total_read);
146 var curr_bytes_read: os.mach_msg_type_number_t = 0;144 var curr_bytes_read: c.mach_msg_type_number_t = 0;
147 var vm_memory: os.vm_offset_t = undefined;145 var vm_memory: c.vm_offset_t = undefined;
148 switch (os.getKernError(os.mach_vm_read(task.port, curr_addr, curr_size, &vm_memory, &curr_bytes_read))) {146 switch (c.getKernError(c.mach_vm_read(task.port, curr_addr, curr_size, &vm_memory, &curr_bytes_read))) {
149 .SUCCESS => {},147 .SUCCESS => {},
150 .FAILURE => return error.PermissionDenied,148 .FAILURE => return error.PermissionDenied,
151 else => |err| {149 else => |err| {
...@@ -155,7 +153,7 @@ pub const MachTask = struct {...@@ -155,7 +153,7 @@ pub const MachTask = struct {
155 }153 }
156154
157 @memcpy(out_buf[0..].ptr, @intToPtr([*]const u8, vm_memory), curr_bytes_read);155 @memcpy(out_buf[0..].ptr, @intToPtr([*]const u8, vm_memory), curr_bytes_read);
158 _ = os.vm_deallocate(os.mach_task_self(), vm_memory, curr_bytes_read);156 _ = c.vm_deallocate(c.mach_task_self(), vm_memory, curr_bytes_read);
159157
160 out_buf = out_buf[curr_bytes_read..];158 out_buf = out_buf[curr_bytes_read..];
161 curr_addr += curr_bytes_read;159 curr_addr += curr_bytes_read;
...@@ -179,20 +177,20 @@ pub const MachTask = struct {...@@ -179,20 +177,20 @@ pub const MachTask = struct {
179177
180 fn getPageSize(task: MachTask) MachError!usize {178 fn getPageSize(task: MachTask) MachError!usize {
181 if (task.isValid()) {179 if (task.isValid()) {
182 var info_count = os.TASK_VM_INFO_COUNT;180 var info_count = c.TASK_VM_INFO_COUNT;
183 var vm_info: os.task_vm_info_data_t = undefined;181 var vm_info: c.task_vm_info_data_t = undefined;
184 switch (os.getKernError(os.task_info(182 switch (c.getKernError(c.task_info(
185 task.port,183 task.port,
186 os.TASK_VM_INFO,184 c.TASK_VM_INFO,
187 @ptrCast(os.task_info_t, &vm_info),185 @ptrCast(c.task_info_t, &vm_info),
188 &info_count,186 &info_count,
189 ))) {187 ))) {
190 .SUCCESS => return @intCast(usize, vm_info.page_size),188 .SUCCESS => return @intCast(usize, vm_info.page_size),
191 else => {},189 else => {},
192 }190 }
193 }191 }
194 var page_size: os.vm_size_t = undefined;192 var page_size: c.vm_size_t = undefined;
195 switch (os.getKernError(os._host_page_size(os.mach_host_self(), &page_size))) {193 switch (c.getKernError(c._host_page_size(c.mach_host_self(), &page_size))) {
196 .SUCCESS => return page_size,194 .SUCCESS => return page_size,
197 else => |err| {195 else => |err| {
198 log.err("_host_page_size kernel call failed with error code: {s}", .{@tagName(err)});196 log.err("_host_page_size kernel call failed with error code: {s}", .{@tagName(err)});
...@@ -202,9 +200,9 @@ pub const MachTask = struct {...@@ -202,9 +200,9 @@ pub const MachTask = struct {
202 }200 }
203};201};
204202
205pub fn machTaskForPid(pid: os.pid_t) MachError!MachTask {203pub fn machTaskForPid(pid: c.pid_t) MachError!MachTask {
206 var port: os.mach_port_name_t = undefined;204 var port: c.mach_port_name_t = undefined;
207 switch (os.getKernError(os.task_for_pid(os.mach_task_self(), pid, &port))) {205 switch (c.getKernError(c.task_for_pid(c.mach_task_self(), pid, &port))) {
208 .SUCCESS => {},206 .SUCCESS => {},
209 .FAILURE => return error.PermissionDenied,207 .FAILURE => return error.PermissionDenied,
210 else => |err| {208 else => |err| {