init: Add system call handling code

This commit is contained in:
Gabriel 2025-02-16 11:58:20 +01:00
parent 3ce8cfb726
commit 4e03fdca6a
2 changed files with 46 additions and 9 deletions

41
system/init/kernel.zig Normal file
View File

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

View File

@ -1,13 +1,9 @@
fn syscall(num: u64, arg: u64) void { const kernel = @import("kernel.zig");
asm volatile ("int $66"
:
: [num] "{rax}" (num),
[arg] "{rdi}" (arg),
);
}
export fn _start(base: u64) callconv(.C) noreturn { export fn _start(base: u64) callconv(.C) noreturn {
syscall(0, base); kernel.print(base);
while (true) {} while (true) {
kernel.yield();
}
} }