authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-14 00:10:14+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-14 00:10:26+01:00
logec2697b7ea355281330df0bab91c4a09f6466950
treeeab7f6691cc25ffade1b2f35c4bc13cc82ed0b2c
parentf5336a8fec10c5ac66b1ed804b908a01fd56d4fe

darwin: add even more wrappers for Mach syscalls

Rename `ThreadId` to `MachThread`.

3 files changed, 38 insertions(+), 10 deletions(-)

lib/std/c/darwin.zig+12
...@@ -102,6 +102,8 @@ pub const MACH_EXCEPTION_MASK = MACH_EXCEPTION_CODES |...@@ -102,6 +102,8 @@ pub const MACH_EXCEPTION_MASK = MACH_EXCEPTION_CODES |
102102
103pub const TASK_NULL: task_t = 0;103pub const TASK_NULL: task_t = 0;
104pub const THREAD_NULL: thread_t = 0;104pub const THREAD_NULL: thread_t = 0;
105pub const MACH_PORT_NULL: mach_port_t = 0;
106pub const MACH_MSG_TIMEOUT_NONE: mach_msg_timeout_t = 0;
105107
106pub const MACH_MSG_OPTION_NONE = 0x00000000;108pub const MACH_MSG_OPTION_NONE = 0x00000000;
107109
...@@ -406,6 +408,7 @@ pub extern "c" fn task_resume(target_task: task_read_t) kern_return_t;...@@ -406,6 +408,7 @@ pub extern "c" fn task_resume(target_task: task_read_t) kern_return_t;
406pub extern "c" fn task_suspend(target_task: task_read_t) kern_return_t;408pub extern "c" fn task_suspend(target_task: task_read_t) kern_return_t;
407409
408pub extern "c" fn task_for_pid(target_tport: mach_port_name_t, pid: pid_t, t: *mach_port_name_t) kern_return_t;410pub extern "c" fn task_for_pid(target_tport: mach_port_name_t, pid: pid_t, t: *mach_port_name_t) kern_return_t;
411pub extern "c" fn pid_for_task(target_tport: mach_port_name_t, pid: *pid_t) kern_return_t;
409pub extern "c" fn mach_vm_read(412pub extern "c" fn mach_vm_read(
410 target_task: vm_map_read_t,413 target_task: vm_map_read_t,
411 address: mach_vm_address_t,414 address: mach_vm_address_t,
...@@ -3054,11 +3057,20 @@ pub const _POSIX_SPAWN_RESLIDE = 0x0800;...@@ -3054,11 +3057,20 @@ pub const _POSIX_SPAWN_RESLIDE = 0x0800;
3054pub const POSIX_SPAWN_CLOEXEC_DEFAULT = 0x4000;3057pub const POSIX_SPAWN_CLOEXEC_DEFAULT = 0x4000;
30553058
3056pub const PT_TRACE_ME = 0;3059pub const PT_TRACE_ME = 0;
3060pub const PT_READ_I = 1;
3061pub const PT_READ_D = 2;
3062pub const PT_READ_U = 3;
3063pub const PT_WRITE_I = 4;
3064pub const PT_WRITE_D = 5;
3065pub const PT_WRITE_U = 6;
3057pub const PT_CONTINUE = 7;3066pub const PT_CONTINUE = 7;
3058pub const PT_KILL = 8;3067pub const PT_KILL = 8;
3059pub const PT_STEP = 9;3068pub const PT_STEP = 9;
3060pub const PT_DETACH = 11;3069pub const PT_DETACH = 11;
3070pub const PT_SIGEXC = 12;
3071pub const PT_THUPDATE = 13;
3061pub const PT_ATTACHEXC = 14;3072pub const PT_ATTACHEXC = 14;
3073pub const PT_FORCEQUOTA = 30;
3062pub const PT_DENY_ATTACH = 31;3074pub const PT_DENY_ATTACH = 31;
30633075
3064pub const caddr_t = ?[*]u8;3076pub const caddr_t = ?[*]u8;
lib/std/os/darwin.zig+24-8
...@@ -24,6 +24,18 @@ const mach_task = if (builtin.target.isDarwin()) struct {...@@ -24,6 +24,18 @@ const mach_task = if (builtin.target.isDarwin()) struct {
24 return self.port != std.c.TASK_NULL;24 return self.port != std.c.TASK_NULL;
25 }25 }
2626
27 pub fn pidForTask(self: MachTask) MachError!std.os.pid_t {
28 var pid: std.os.pid_t = undefined;
29 switch (std.c.getKernError(std.c.pid_for_task(self.port, &pid))) {
30 .SUCCESS => return pid,
31 .FAILURE => return error.PermissionDenied,
32 else => |err| {
33 log.err("pid_for_task kernel call failed with error code: {s}", .{@tagName(err)});
34 return error.Unexpected;
35 },
36 }
37 }
38
27 pub fn allocatePort(self: MachTask, right: std.c.MACH_PORT_RIGHT) MachError!MachTask {39 pub fn allocatePort(self: MachTask, right: std.c.MACH_PORT_RIGHT) MachError!MachTask {
28 var out_port: std.c.mach_port_name_t = undefined;40 var out_port: std.c.mach_port_name_t = undefined;
29 switch (std.c.getKernError(std.c.mach_port_allocate(41 switch (std.c.getKernError(std.c.mach_port_allocate(
...@@ -440,7 +452,7 @@ const mach_task = if (builtin.target.isDarwin()) struct {...@@ -440,7 +452,7 @@ const mach_task = if (builtin.target.isDarwin()) struct {
440 }452 }
441453
442 const ThreadList = struct {454 const ThreadList = struct {
443 buf: []ThreadId,455 buf: []MachThread,
444456
445 pub fn deinit(list: ThreadList) void {457 pub fn deinit(list: ThreadList) void {
446 const self_task = machTaskForSelf();458 const self_task = machTaskForSelf();
...@@ -456,7 +468,7 @@ const mach_task = if (builtin.target.isDarwin()) struct {...@@ -456,7 +468,7 @@ const mach_task = if (builtin.target.isDarwin()) struct {
456 var thread_list: std.c.mach_port_array_t = undefined;468 var thread_list: std.c.mach_port_array_t = undefined;
457 var thread_count: std.c.mach_msg_type_number_t = undefined;469 var thread_count: std.c.mach_msg_type_number_t = undefined;
458 switch (std.c.getKernError(std.c.task_threads(task.port, &thread_list, &thread_count))) {470 switch (std.c.getKernError(std.c.task_threads(task.port, &thread_list, &thread_count))) {
459 .SUCCESS => return ThreadList{ .buf = @ptrCast([*]ThreadId, thread_list)[0..thread_count] },471 .SUCCESS => return ThreadList{ .buf = @ptrCast([*]MachThread, thread_list)[0..thread_count] },
460 else => |err| {472 else => |err| {
461 log.err("task_threads kernel call failed with error code: {s}", .{@tagName(err)});473 log.err("task_threads kernel call failed with error code: {s}", .{@tagName(err)});
462 return error.Unexpected;474 return error.Unexpected;
...@@ -465,14 +477,18 @@ const mach_task = if (builtin.target.isDarwin()) struct {...@@ -465,14 +477,18 @@ const mach_task = if (builtin.target.isDarwin()) struct {
465 }477 }
466 };478 };
467479
468 pub const ThreadId = extern struct {480 pub const MachThread = extern struct {
469 id: std.c.thread_act_t,481 port: std.c.mach_port_t,
482
483 pub fn isValid(thread: MachThread) bool {
484 return thread.port != std.c.THREAD_NULL;
485 }
470486
471 pub fn getBasicInfo(thread_id: ThreadId) MachError!std.c.thread_basic_info {487 pub fn getBasicInfo(thread: MachThread) MachError!std.c.thread_basic_info {
472 var info: std.c.thread_basic_info = undefined;488 var info: std.c.thread_basic_info = undefined;
473 var count = std.c.THREAD_BASIC_INFO_COUNT;489 var count = std.c.THREAD_BASIC_INFO_COUNT;
474 switch (std.c.getKernError(std.c.thread_info(490 switch (std.c.getKernError(std.c.thread_info(
475 thread_id.id,491 thread.port,
476 std.c.THREAD_BASIC_INFO,492 std.c.THREAD_BASIC_INFO,
477 @ptrCast(std.c.thread_info_t, &info),493 @ptrCast(std.c.thread_info_t, &info),
478 &count,494 &count,
...@@ -485,11 +501,11 @@ const mach_task = if (builtin.target.isDarwin()) struct {...@@ -485,11 +501,11 @@ const mach_task = if (builtin.target.isDarwin()) struct {
485 }501 }
486 }502 }
487503
488 pub fn getIdentifierInfo(thread_id: ThreadId) MachError!std.c.thread_identifier_info {504 pub fn getIdentifierInfo(thread: MachThread) MachError!std.c.thread_identifier_info {
489 var info: std.c.thread_identifier_info = undefined;505 var info: std.c.thread_identifier_info = undefined;
490 var count = std.c.THREAD_IDENTIFIER_INFO_COUNT;506 var count = std.c.THREAD_IDENTIFIER_INFO_COUNT;
491 switch (std.c.getKernError(std.c.thread_info(507 switch (std.c.getKernError(std.c.thread_info(
492 thread_id.id,508 thread.port,
493 std.c.THREAD_IDENTIFIER_INFO,509 std.c.THREAD_IDENTIFIER_INFO,
494 @ptrCast(std.c.thread_info_t, &info),510 @ptrCast(std.c.thread_info_t, &info),
495 &count,511 &count,
lib/std/os/ptrace.zig+2-2
...@@ -16,8 +16,8 @@ const ptrace = if (builtin.target.isDarwin()) struct {...@@ -16,8 +16,8 @@ const ptrace = if (builtin.target.isDarwin()) struct {
16 PermissionDenied,16 PermissionDenied,
17 } || UnexpectedError;17 } || UnexpectedError;
1818
19 pub fn ptrace(request: i32, pid: pid_t) PtraceError!void {19 pub fn ptrace(request: i32, pid: pid_t, addr: ?[*]u8, signal: i32) PtraceError!void {
20 switch (errno(system.ptrace(request, pid, null, 0))) {20 switch (errno(system.ptrace(request, pid, addr, signal))) {
21 .SUCCESS => return,21 .SUCCESS => return,
22 .SRCH => return error.ProcessNotFound,22 .SRCH => return error.ProcessNotFound,
23 .INVAL => unreachable,23 .INVAL => unreachable,