init: Add system call handling code
This commit is contained in:
parent
3ce8cfb726
commit
4e03fdca6a
41
system/init/kernel.zig
Normal file
41
system/init/kernel.zig
Normal 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);
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user