From 4e03fdca6ab472116e2cbd91d2e2ba3d6a8d2f47 Mon Sep 17 00:00:00 2001 From: Gabriel Date: Sun, 16 Feb 2025 11:58:20 +0100 Subject: [PATCH] init: Add system call handling code --- system/init/kernel.zig | 41 +++++++++++++++++++++++++++++++++++++++++ system/init/main.zig | 14 +++++--------- 2 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 system/init/kernel.zig diff --git a/system/init/kernel.zig b/system/init/kernel.zig new file mode 100644 index 0000000..22643b9 --- /dev/null +++ b/system/init/kernel.zig @@ -0,0 +1,41 @@ +const SystemCall = enum(u64) { + Print, + AllocFrame, + LockFrame, + FreeFrame, + Yield, +}; + +const SystemError = error{ + OutOfMemory, +}; + +fn syscall(num: SystemCall, arg: u64) i64 { + return asm volatile ("int $66" + : [result] "=r" (-> i64), + : [num] "{rax}" (@intFromEnum(num)), + [arg] "{rdi}" (arg), + ); +} + +pub fn print(arg: u64) void { + _ = syscall(.Print, arg); +} + +pub fn allocFrame() !usize { + const retval = syscall(.AllocFrame, 0); + if (retval < 0) return error.OutOfMemory; + return @bitCast(retval); +} + +pub fn lockFrame(address: u64) void { + _ = syscall(.LockFrame, address); +} + +pub fn freeFrame(address: u64) void { + _ = syscall(.FreeFrame, address); +} + +pub fn yield() void { + _ = syscall(.Yield, 0); +} diff --git a/system/init/main.zig b/system/init/main.zig index c79eb4e..8525bc8 100644 --- a/system/init/main.zig +++ b/system/init/main.zig @@ -1,13 +1,9 @@ -fn syscall(num: u64, arg: u64) void { - asm volatile ("int $66" - : - : [num] "{rax}" (num), - [arg] "{rdi}" (arg), - ); -} +const kernel = @import("kernel.zig"); export fn _start(base: u64) callconv(.C) noreturn { - syscall(0, base); + kernel.print(base); - while (true) {} + while (true) { + kernel.yield(); + } }