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 {...@@ -392,19 +392,8 @@ pub const File = struct {
392 .linux => std.os.ptrace(std.os.linux.PTRACE.ATTACH, pid, 0, 0) catch |err| {392 .linux => std.os.ptrace(std.os.linux.PTRACE.ATTACH, pid, 0, 0) catch |err| {
393 log.warn("ptrace failure: {s}", .{@errorName(err)});393 log.warn("ptrace failure: {s}", .{@errorName(err)});
394 },394 },
395 .macos => {395 .macos => base.cast(MachO).?.ptraceAttach(pid) catch |err| {
396 const macho = base.cast(MachO).?;396 log.warn("attaching failed with error: {s}", .{@errorName(err)});
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 }
408 },397 },
409 else => return error.HotSwapUnavailableOnHostOperatingSystem,398 else => return error.HotSwapUnavailableOnHostOperatingSystem,
410 }399 }
...@@ -444,11 +433,9 @@ pub const File = struct {...@@ -444,11 +433,9 @@ pub const File = struct {
444 .linux => std.os.ptrace(std.os.linux.PTRACE.DETACH, pid, 0, 0) catch |err| {433 .linux => std.os.ptrace(std.os.linux.PTRACE.DETACH, pid, 0, 0) catch |err| {
445 log.warn("ptrace failure: {s}", .{@errorName(err)});434 log.warn("ptrace failure: {s}", .{@errorName(err)});
446 },435 },
447 .macos => {},436 .macos => base.cast(MachO).?.ptraceDetach(pid) catch |err| {
448 // TODO see comment above in makeWritable437 log.warn("detaching failed with error: {s}", .{@errorName(err)});
449 // .macos => std.os.ptrace(std.os.darwin.PT.DETACH, pid, 0, 0) catch |err| {438 },
450 // log.warn("ptrace failure: {s}", .{@errorName(err)});
451 // },
452 else => return error.HotSwapUnavailableOnHostOperatingSystem,439 else => return error.HotSwapUnavailableOnHostOperatingSystem,
453 }440 }
454 }441 }
src/link/MachO.zig+22
...@@ -3811,6 +3811,28 @@ pub fn allocatedVirtualSize(self: *MachO, start: u64) u64 {...@@ -3811,6 +3811,28 @@ pub fn allocatedVirtualSize(self: *MachO, start: u64) u64 {
3811 return min_pos - start;3811 return min_pos - start;
3812}3812}
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
3814pub fn makeStaticString(bytes: []const u8) [16]u8 {3836pub fn makeStaticString(bytes: []const u8) [16]u8 {
3815 var buf = [_]u8{0} ** 16;3837 var buf = [_]u8{0} ** 16;
3816 assert(bytes.len <= buf.len);3838 assert(bytes.len <= buf.len);