core+system: Add a "getAddressSpace()" system call
This commit is contained in:
parent
b5327891d8
commit
02762336a0
@ -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);
|
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);
|
||||||
|
}
|
||||||
|
@ -36,6 +36,7 @@ const syscalls = [_]SystemCall{
|
|||||||
sched.setThreadStack,
|
sched.setThreadStack,
|
||||||
sched.startThread,
|
sched.startThread,
|
||||||
sched.getThreadId,
|
sched.getThreadId,
|
||||||
|
mem.getAddressSpace,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn invokeSyscall(number: usize, frame: *platform.Registers, args: *Arguments, retval: *isize) void {
|
pub fn invokeSyscall(number: usize, frame: *platform.Registers, args: *Arguments, retval: *isize) void {
|
||||||
|
@ -16,6 +16,7 @@ pub const SystemCall = enum(u64) {
|
|||||||
SetThreadStack, // requires Token.CreateProcess
|
SetThreadStack, // requires Token.CreateProcess
|
||||||
StartThread, // requires Token.CreateProcess
|
StartThread, // requires Token.CreateProcess
|
||||||
GetThreadId,
|
GetThreadId,
|
||||||
|
GetAddressSpace, // requires Token.CreateProcess
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const Token = enum(u64) {
|
pub const Token = enum(u64) {
|
||||||
|
@ -95,3 +95,9 @@ pub fn startThread(pid: u64) !void {
|
|||||||
pub fn getThreadId() u64 {
|
pub fn getThreadId() u64 {
|
||||||
return @bitCast(syscall(.GetThreadId, 0, 0, 0));
|
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);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user