diff --git a/core/src/sys/mem.zig b/core/src/sys/mem.zig index c39541e..b121bc6 100644 --- a/core/src/sys/mem.zig +++ b/core/src/sys/mem.zig @@ -46,3 +46,14 @@ pub fn setAddressSpace(_: *platform.Registers, args: *sys.Arguments, _: *isize) target.address_space = vmm.AddressSpace.create(.{ .address = args.arg1 }, vmm.PHYSICAL_MAPPING_BASE); } + +pub fn getAddressSpace(_: *platform.Registers, args: *sys.Arguments, result: *isize) anyerror!void { + const core = cpu.thisCore(); + if (!sys.checkToken(core, system.kernel.Token.CreateProcess)) return error.NotAuthorized; + + const target = thread.lookupThreadById(args.arg0) orelse return error.NoSuchThread; + + const space = target.address_space orelse return error.NoAddressSpace; + + result.* = @bitCast(space.phys.address); +} diff --git a/core/src/sys/syscall.zig b/core/src/sys/syscall.zig index 2c309cf..b380c6a 100644 --- a/core/src/sys/syscall.zig +++ b/core/src/sys/syscall.zig @@ -36,6 +36,7 @@ const syscalls = [_]SystemCall{ sched.setThreadStack, sched.startThread, sched.getThreadId, + mem.getAddressSpace, }; pub fn invokeSyscall(number: usize, frame: *platform.Registers, args: *Arguments, retval: *isize) void { diff --git a/system/lib/kernel.zig b/system/lib/kernel.zig index 6f9ad0c..d6b326e 100644 --- a/system/lib/kernel.zig +++ b/system/lib/kernel.zig @@ -16,6 +16,7 @@ pub const SystemCall = enum(u64) { SetThreadStack, // requires Token.CreateProcess StartThread, // requires Token.CreateProcess GetThreadId, + GetAddressSpace, // requires Token.CreateProcess }; pub const Token = enum(u64) { diff --git a/system/lib/syscalls.zig b/system/lib/syscalls.zig index e45eb30..25dd9c7 100644 --- a/system/lib/syscalls.zig +++ b/system/lib/syscalls.zig @@ -95,3 +95,9 @@ pub fn startThread(pid: u64) !void { pub fn getThreadId() u64 { return @bitCast(syscall(.GetThreadId, 0, 0, 0)); } + +pub fn getAddressSpace(pid: u64) !u64 { + const retval = syscall(.GetAddressSpace, pid, 0, 0); + if (retval < 0) return error.NoSuchThread; + return @bitCast(retval); +}