astryon/core/src/sys/mem.zig

49 lines
1.8 KiB
Zig

const system = @import("system");
const platform = @import("../arch/platform.zig");
const sys = @import("syscall.zig");
const pmm = @import("../pmm.zig");
const cpu = @import("../arch/cpu.zig");
const thread = @import("../thread.zig");
const vmm = @import("../arch/vmm.zig");
pub fn allocFrame(_: *platform.Registers, _: *sys.Arguments, retval: *isize) anyerror!void {
const core = cpu.thisCore();
if (!sys.checkToken(core, system.kernel.Token.PhysicalMemory)) return error.NotAuthorized;
const allocator = pmm.lockGlobalAllocator();
defer pmm.unlockGlobalAllocator();
const frame = try pmm.allocFrame(allocator);
retval.* = @bitCast(frame.address);
}
pub fn freeFrame(_: *platform.Registers, args: *sys.Arguments, _: *isize) anyerror!void {
const core = cpu.thisCore();
if (!sys.checkToken(core, system.kernel.Token.PhysicalMemory)) return error.NotAuthorized;
const allocator = pmm.lockGlobalAllocator();
defer pmm.unlockGlobalAllocator();
try pmm.freeFrame(allocator, args.arg0);
}
pub fn lockFrame(_: *platform.Registers, args: *sys.Arguments, _: *isize) anyerror!void {
const core = cpu.thisCore();
if (!sys.checkToken(core, system.kernel.Token.PhysicalMemory)) return error.NotAuthorized;
const allocator = pmm.lockGlobalAllocator();
defer pmm.unlockGlobalAllocator();
try pmm.lockFrame(allocator, args.arg0);
}
pub fn setAddressSpace(_: *platform.Registers, args: *sys.Arguments, _: *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;
target.address_space = vmm.AddressSpace.create(.{ .address = args.arg1 }, vmm.PHYSICAL_MAPPING_BASE);
}