From 0aab3bda126b0221f81533b335c7a6a01749344b Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Fri, 17 Mar 2023 14:51:08 +0100 Subject: [PATCH] macho: add wrappers for attaching/detaching from HCS process --- src/link.zig | 23 +++++------------------ src/link/MachO.zig | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/link.zig b/src/link.zig index c87d5b5dd575fe539cefcb3cf09cdb6de947aa10..ae6c02c08bad7f91dea552fde235648b29302603 100644 --- a/src/link.zig +++ b/src/link.zig @@ -392,19 +392,8 @@ pub const File = struct { .linux => std.os.ptrace(std.os.linux.PTRACE.ATTACH, pid, 0, 0) catch |err| { log.warn("ptrace failure: {s}", .{@errorName(err)}); }, - .macos => { - const macho = base.cast(MachO).?; - if (macho.mach_task == null) { - if (std.os.darwin.machTaskForPid(pid)) |task| { - macho.mach_task = task; - // TODO enable ones we register for exceptions - // std.os.ptrace(std.os.darwin.PT.ATTACHEXC, pid, 0, 0) catch |err| { - // log.warn("ptrace failure: {s}", .{@errorName(err)}); - // }; - } else |err| { - log.warn("failed to acquire Mach task for child process: {s}", .{@errorName(err)}); - } - } + .macos => base.cast(MachO).?.ptraceAttach(pid) catch |err| { + log.warn("attaching failed with error: {s}", .{@errorName(err)}); }, else => return error.HotSwapUnavailableOnHostOperatingSystem, } @@ -444,11 +433,9 @@ pub const File = struct { .linux => std.os.ptrace(std.os.linux.PTRACE.DETACH, pid, 0, 0) catch |err| { log.warn("ptrace failure: {s}", .{@errorName(err)}); }, - .macos => {}, - // TODO see comment above in makeWritable - // .macos => std.os.ptrace(std.os.darwin.PT.DETACH, pid, 0, 0) catch |err| { - // log.warn("ptrace failure: {s}", .{@errorName(err)}); - // }, + .macos => base.cast(MachO).?.ptraceDetach(pid) catch |err| { + log.warn("detaching failed with error: {s}", .{@errorName(err)}); + }, else => return error.HotSwapUnavailableOnHostOperatingSystem, } } diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 869061be38cf89407acdc02a9be19c20930fa952..3d0b8b2f778574de7df7ac69bcd544fbc60a88a1 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -3811,6 +3811,28 @@ pub fn allocatedVirtualSize(self: *MachO, start: u64) u64 { return min_pos - start; } +pub fn ptraceAttach(self: *MachO, pid: std.os.pid_t) !void { + const mach_task = try std.os.darwin.machTaskForPid(pid); + log.debug("Mach task for pid {d}: {any}", .{ pid, mach_task }); + self.mach_task = mach_task; + + // TODO start exception handler in another thread + + // TODO enable ones we register for exceptions + // try std.os.ptrace(std.os.darwin.PT.ATTACHEXC, pid, 0, 0); +} + +pub fn ptraceDetach(self: *MachO, pid: std.os.pid_t) !void { + _ = pid; + + // TODO stop exception handler + + // TODO see comment in ptraceAttach + // try std.os.ptrace(std.os.darwin.PT.DETACH, pid, 0, 0); + + self.mach_task = null; +} + pub fn makeStaticString(bytes: []const u8) [16]u8 { var buf = [_]u8{0} ** 16; assert(bytes.len <= buf.len); -- 2.54.0