diff options
| author | Andrea Orru <andrea@orru.io> | 2018-03-15 04:28:05 -0700 |
|---|---|---|
| committer | Andrea Orru <andrea@orru.io> | 2018-03-15 04:28:45 -0700 |
| commit | 681c62941e9219b475c2e441e360c0c72cd6ccdc (patch) | |
| tree | 1e0c56a8337fafc73bbb0beca5d704bce6a4ed8a | |
| parent | 9b7e4b535c87c32d81fab88b92c967b04188212f (diff) | |
| download | zig-681c62941e9219b475c2e441e360c0c72cd6ccdc.tar.gz zig-681c62941e9219b475c2e441e360c0c72cd6ccdc.zip | |
subscribeIRQ support
| -rw-r--r-- | std/os/zen.zig | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/std/os/zen.zig b/std/os/zen.zig index 7d054a0e4f..94d470d70f 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" |
