core: Add memory and scheduler related system calls

This commit is contained in:
Gabriel 2025-02-16 11:58:12 +01:00
parent 671a9b5887
commit 3ce8cfb726
3 changed files with 36 additions and 1 deletions

26
core/src/sys/mem.zig Normal file
View File

@ -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);
}

7
core/src/sys/sched.zig Normal file
View File

@ -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);
}

View File

@ -1,6 +1,8 @@
const std = @import("std"); const std = @import("std");
const interrupts = @import("../arch/interrupts.zig").arch; const interrupts = @import("../arch/interrupts.zig").arch;
const print = @import("print.zig").print; const print = @import("print.zig").print;
const mem = @import("mem.zig");
const sched = @import("sched.zig");
pub const Arguments = struct { pub const Arguments = struct {
arg0: usize, arg0: usize,
@ -13,7 +15,7 @@ pub const Arguments = struct {
const SystemCall = *const fn (frame: *interrupts.InterruptStackFrame, args: *Arguments, retval: *isize) anyerror!void; 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 { pub fn invokeSyscall(number: usize, frame: *interrupts.InterruptStackFrame, args: *Arguments, retval: *isize) void {
if (number >= syscalls.len) { if (number >= syscalls.len) {