authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-03-17 14:51:08+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-03-18 21:53:46+01:00
log0aab3bda126b0221f81533b335c7a6a01749344b
tree22bad73b7fcf2f13eccf083428728b36c8556c94
parent37192bcdcb38be2266133f6d46dce5a842984c06

macho: add wrappers for attaching/detaching from HCS process


2 files changed, 27 insertions(+), 18 deletions(-)

src/link.zig+5-18
......@@ -392,19 +392,8 @@ pub const File = struct {
392392 .linux => std.os.ptrace(std.os.linux.PTRACE.ATTACH, pid, 0, 0) catch |err| {
393393 log.warn("ptrace failure: {s}", .{@errorName(err)});
394394 },
395 .macos => {
396 const macho = base.cast(MachO).?;
397 if (macho.mach_task == null) {
398 if (std.os.darwin.machTaskForPid(pid)) |task| {
399 macho.mach_task = task;
400 // TODO enable ones we register for exceptions
401 // std.os.ptrace(std.os.darwin.PT.ATTACHEXC, pid, 0, 0) catch |err| {
402 // log.warn("ptrace failure: {s}", .{@errorName(err)});
403 // };
404 } else |err| {
405 log.warn("failed to acquire Mach task for child process: {s}", .{@errorName(err)});
406 }
407 }
395 .macos => base.cast(MachO).?.ptraceAttach(pid) catch |err| {
396 log.warn("attaching failed with error: {s}", .{@errorName(err)});
408397 },
409398 else => return error.HotSwapUnavailableOnHostOperatingSystem,
410399 }
......@@ -444,11 +433,9 @@ pub const File = struct {
444433 .linux => std.os.ptrace(std.os.linux.PTRACE.DETACH, pid, 0, 0) catch |err| {
445434 log.warn("ptrace failure: {s}", .{@errorName(err)});
446435 },
447 .macos => {},
448 // TODO see comment above in makeWritable
449 // .macos => std.os.ptrace(std.os.darwin.PT.DETACH, pid, 0, 0) catch |err| {
450 // log.warn("ptrace failure: {s}", .{@errorName(err)});
451 // },
436 .macos => base.cast(MachO).?.ptraceDetach(pid) catch |err| {
437 log.warn("detaching failed with error: {s}", .{@errorName(err)});
438 },
452439 else => return error.HotSwapUnavailableOnHostOperatingSystem,
453440 }
454441 }
src/link/MachO.zig+22
......@@ -3811,6 +3811,28 @@ pub fn allocatedVirtualSize(self: *MachO, start: u64) u64 {
38113811 return min_pos - start;
38123812}
38133813
3814pub fn ptraceAttach(self: *MachO, pid: std.os.pid_t) !void {
3815 const mach_task = try std.os.darwin.machTaskForPid(pid);
3816 log.debug("Mach task for pid {d}: {any}", .{ pid, mach_task });
3817 self.mach_task = mach_task;
3818
3819 // TODO start exception handler in another thread
3820
3821 // TODO enable ones we register for exceptions
3822 // try std.os.ptrace(std.os.darwin.PT.ATTACHEXC, pid, 0, 0);
3823}
3824
3825pub fn ptraceDetach(self: *MachO, pid: std.os.pid_t) !void {
3826 _ = pid;
3827
3828 // TODO stop exception handler
3829
3830 // TODO see comment in ptraceAttach
3831 // try std.os.ptrace(std.os.darwin.PT.DETACH, pid, 0, 0);
3832
3833 self.mach_task = null;
3834}
3835
38143836pub fn makeStaticString(bytes: []const u8) [16]u8 {
38153837 var buf = [_]u8{0} ** 16;
38163838 assert(bytes.len <= buf.len);