Commit 681c62941e

Andrea Orru <andrea@orru.io>
2018-03-15 12:28:05
subscribeIRQ support
1 parent 9b7e4b5
Changed files (1)
std
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"