From 3ce8cfb726d97b509808d4c2c4f1240781804d5b Mon Sep 17 00:00:00 2001 From: Gabriel Date: Sun, 16 Feb 2025 11:58:12 +0100 Subject: [PATCH] core: Add memory and scheduler related system calls --- core/src/sys/mem.zig | 26 ++++++++++++++++++++++++++ core/src/sys/sched.zig | 7 +++++++ core/src/sys/syscall.zig | 4 +++- 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 core/src/sys/mem.zig create mode 100644 core/src/sys/sched.zig diff --git a/core/src/sys/mem.zig b/core/src/sys/mem.zig new file mode 100644 index 0000000..3ce5e91 --- /dev/null +++ b/core/src/sys/mem.zig @@ -0,0 +1,26 @@ +const interrupts = @import("../arch/interrupts.zig").arch; +const sys = @import("syscall.zig"); +const pmm = @import("../pmm.zig"); + +pub fn allocFrame(_: *interrupts.InterruptStackFrame, _: *sys.Arguments, retval: *isize) anyerror!void { + const allocator = pmm.lockGlobalAllocator(); + defer pmm.unlockGlobalAllocator(); + + const frame = try pmm.allocFrame(allocator); + + retval.* = @bitCast(frame.address); +} + +pub fn freeFrame(_: *interrupts.InterruptStackFrame, args: *sys.Arguments, _: *isize) anyerror!void { + const allocator = pmm.lockGlobalAllocator(); + defer pmm.unlockGlobalAllocator(); + + try pmm.freeFrame(allocator, args.arg0); +} + +pub fn lockFrame(_: *interrupts.InterruptStackFrame, args: *sys.Arguments, _: *isize) anyerror!void { + const allocator = pmm.lockGlobalAllocator(); + defer pmm.unlockGlobalAllocator(); + + try pmm.lockFrame(allocator, args.arg0); +} diff --git a/core/src/sys/sched.zig b/core/src/sys/sched.zig new file mode 100644 index 0000000..793f0ee --- /dev/null +++ b/core/src/sys/sched.zig @@ -0,0 +1,7 @@ +const interrupts = @import("../arch/interrupts.zig").arch; +const sys = @import("syscall.zig"); +const thread = @import("../thread.zig"); + +pub fn yield(regs: *interrupts.InterruptStackFrame, _: *sys.Arguments, _: *isize) anyerror!void { + thread.scheduleNewTask(regs); +} diff --git a/core/src/sys/syscall.zig b/core/src/sys/syscall.zig index aac85be..8a2232d 100644 --- a/core/src/sys/syscall.zig +++ b/core/src/sys/syscall.zig @@ -1,6 +1,8 @@ const std = @import("std"); const interrupts = @import("../arch/interrupts.zig").arch; const print = @import("print.zig").print; +const mem = @import("mem.zig"); +const sched = @import("sched.zig"); pub const Arguments = struct { arg0: usize, @@ -13,7 +15,7 @@ pub const Arguments = struct { const SystemCall = *const fn (frame: *interrupts.InterruptStackFrame, args: *Arguments, retval: *isize) anyerror!void; -const syscalls = [_]SystemCall{print}; +const syscalls = [_]SystemCall{ print, mem.allocFrame, mem.lockFrame, mem.freeFrame, sched.yield }; pub fn invokeSyscall(number: usize, frame: *interrupts.InterruptStackFrame, args: *Arguments, retval: *isize) void { if (number >= syscalls.len) {