Microkernel thing OS experiment (Zig ⚡)
1const config = @import("config");
2const build_helpers = @import("build_helpers");
3
4pub const syscall1 = switch (config.arch) {
5 .aarch64 => Aarch64.syscall1,
6 .amd64 => Amd64.syscall1,
7 .riscv64 => Riscv64.syscall1,
8};
9
10const Aarch64 = struct {
11 pub fn syscall1(number: usize, arg1: usize) usize {
12 return asm volatile ("svc #0"
13 : [ret] "={x0}" (-> usize),
14 : [number] "{x8}" (number),
15 [arg1] "{x0}" (arg1),
16 : .{ .memory = true });
17 }
18};
19
20const Amd64 = struct {
21 pub fn syscall1(number: usize, arg1: usize) usize {
22 return asm volatile ("syscall"
23 : [ret] "={rax}" (-> usize),
24 : [number] "{rdi}" (number),
25 [arg1] "{rsi}" (arg1),
26 : .{ .rcx = true, .r11 = true });
27 }
28};
29
30const Riscv64 = struct {
31 pub fn syscall1(number: usize, arg1: usize) usize {
32 return asm volatile ("ecall"
33 : [ret] "={x10}" (-> usize),
34 : [number] "{x17}" (number),
35 [arg1] "{x10}" (arg1),
36 : .{ .memory = true });
37 }
38};