diff --git a/std/os/zen.zig b/std/os/zen.zig index 7d054a0e4..94d470d70 100644 --- a/std/os/zen.zig +++ b/std/os/zen.zig @@ -38,13 +38,15 @@ pub const Service = struct { //// Syscall numbers //// /////////////////////////// -pub const Syscall = enum { +pub const Syscall = enum(usize) { exit = 0, createPort = 1, send = 2, receive = 3, - map = 4, - createThread = 5, + subscribeIRQ = 4, + inb = 5, + map = 6, + createThread = 7, }; @@ -69,6 +71,14 @@ pub fn receive(destination: &Message) void { _ = syscall1(Syscall.receive, @ptrToInt(destination)); } +pub fn subscribeIRQ(irq: u8, mailbox_id: &const MailboxId) void { + _ = syscall2(Syscall.subscribeIRQ, irq, @ptrToInt(mailbox_id)); +} + +pub fn inb(port: u16) u8 { + return u8(syscall1(Syscall.inb, port)); +} + pub fn map(v_addr: usize, p_addr: usize, size: usize, writable: bool) bool { return syscall4(Syscall.map, v_addr, p_addr, size, usize(writable)) != 0; } @@ -82,20 +92,20 @@ pub fn createThread(function: fn()void) u16 { //// Syscall stubs //// ///////////////////////// -inline fn syscall0(number: usize) usize { +inline fn syscall0(number: Syscall) usize { return asm volatile ("int $0x80" : [ret] "={eax}" (-> usize) : [number] "{eax}" (number)); } -inline fn syscall1(number: usize, arg1: usize) usize { +inline fn syscall1(number: Syscall, arg1: usize) usize { return asm volatile ("int $0x80" : [ret] "={eax}" (-> usize) : [number] "{eax}" (number), [arg1] "{ecx}" (arg1)); } -inline fn syscall2(number: usize, arg1: usize, arg2: usize) usize { +inline fn syscall2(number: Syscall, arg1: usize, arg2: usize) usize { return asm volatile ("int $0x80" : [ret] "={eax}" (-> usize) : [number] "{eax}" (number), @@ -103,7 +113,7 @@ inline fn syscall2(number: usize, arg1: usize, arg2: usize) usize { [arg2] "{edx}" (arg2)); } -inline fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { +inline fn syscall3(number: Syscall, arg1: usize, arg2: usize, arg3: usize) usize { return asm volatile ("int $0x80" : [ret] "={eax}" (-> usize) : [number] "{eax}" (number), @@ -112,7 +122,7 @@ inline fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { [arg3] "{ebx}" (arg3)); } -inline fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { +inline fn syscall4(number: Syscall, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { return asm volatile ("int $0x80" : [ret] "={eax}" (-> usize) : [number] "{eax}" (number), @@ -122,7 +132,7 @@ inline fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: u [arg4] "{esi}" (arg4)); } -inline fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, +inline fn syscall5(number: Syscall, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize { return asm volatile ("int $0x80" @@ -135,7 +145,7 @@ inline fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, [arg5] "{edi}" (arg5)); } -inline fn syscall6(number: usize, arg1: usize, arg2: usize, arg3: usize, +inline fn syscall6(number: Syscall, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize, arg6: usize) usize { return asm volatile ("int $0x80"