authorgravatar for andrea@orru.ioAndrea Orru <andrea@orru.io> 2018-03-15 04:28:05-07:00
committergravatar for andrea@orru.ioAndrea Orru <andrea@orru.io> 2018-03-15 04:28:45-07:00
log681c62941e9219b475c2e441e360c0c72cd6ccdc
tree1e0c56a8337fafc73bbb0beca5d704bce6a4ed8a
parent9b7e4b535c87c32d81fab88b92c967b04188212f

subscribeIRQ support


1 files changed, 20 insertions(+), 10 deletions(-)

std/os/zen.zig+20-10
...@@ -38,13 +38,15 @@ pub const Service = struct {...@@ -38,13 +38,15 @@ pub const Service = struct {
38//// Syscall numbers ////38//// Syscall numbers ////
39///////////////////////////39///////////////////////////
4040
41pub const Syscall = enum {41pub const Syscall = enum(usize) {
42 exit = 0,42 exit = 0,
43 createPort = 1,43 createPort = 1,
44 send = 2,44 send = 2,
45 receive = 3,45 receive = 3,
46 map = 4,46 subscribeIRQ = 4,
47 createThread = 5,47 inb = 5,
48 map = 6,
49 createThread = 7,
48};50};
4951
5052
...@@ -69,6 +71,14 @@ pub fn receive(destination: &Message) void {...@@ -69,6 +71,14 @@ pub fn receive(destination: &Message) void {
69 _ = syscall1(Syscall.receive, @ptrToInt(destination));71 _ = syscall1(Syscall.receive, @ptrToInt(destination));
70}72}
7173
74pub fn subscribeIRQ(irq: u8, mailbox_id: &const MailboxId) void {
75 _ = syscall2(Syscall.subscribeIRQ, irq, @ptrToInt(mailbox_id));
76}
77
78pub fn inb(port: u16) u8 {
79 return u8(syscall1(Syscall.inb, port));
80}
81
72pub fn map(v_addr: usize, p_addr: usize, size: usize, writable: bool) bool {82pub fn map(v_addr: usize, p_addr: usize, size: usize, writable: bool) bool {
73 return syscall4(Syscall.map, v_addr, p_addr, size, usize(writable)) != 0;83 return syscall4(Syscall.map, v_addr, p_addr, size, usize(writable)) != 0;
74}84}
...@@ -82,20 +92,20 @@ pub fn createThread(function: fn()void) u16 {...@@ -82,20 +92,20 @@ pub fn createThread(function: fn()void) u16 {
82//// Syscall stubs ////92//// Syscall stubs ////
83/////////////////////////93/////////////////////////
8494
85inline fn syscall0(number: usize) usize {95inline fn syscall0(number: Syscall) usize {
86 return asm volatile ("int $0x80"96 return asm volatile ("int $0x80"
87 : [ret] "={eax}" (-> usize)97 : [ret] "={eax}" (-> usize)
88 : [number] "{eax}" (number));98 : [number] "{eax}" (number));
89}99}
90100
91inline fn syscall1(number: usize, arg1: usize) usize {101inline fn syscall1(number: Syscall, arg1: usize) usize {
92 return asm volatile ("int $0x80"102 return asm volatile ("int $0x80"
93 : [ret] "={eax}" (-> usize)103 : [ret] "={eax}" (-> usize)
94 : [number] "{eax}" (number),104 : [number] "{eax}" (number),
95 [arg1] "{ecx}" (arg1));105 [arg1] "{ecx}" (arg1));
96}106}
97107
98inline fn syscall2(number: usize, arg1: usize, arg2: usize) usize {108inline fn syscall2(number: Syscall, arg1: usize, arg2: usize) usize {
99 return asm volatile ("int $0x80"109 return asm volatile ("int $0x80"
100 : [ret] "={eax}" (-> usize)110 : [ret] "={eax}" (-> usize)
101 : [number] "{eax}" (number),111 : [number] "{eax}" (number),
...@@ -103,7 +113,7 @@ inline fn syscall2(number: usize, arg1: usize, arg2: usize) usize {...@@ -103,7 +113,7 @@ inline fn syscall2(number: usize, arg1: usize, arg2: usize) usize {
103 [arg2] "{edx}" (arg2));113 [arg2] "{edx}" (arg2));
104}114}
105115
106inline fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {116inline fn syscall3(number: Syscall, arg1: usize, arg2: usize, arg3: usize) usize {
107 return asm volatile ("int $0x80"117 return asm volatile ("int $0x80"
108 : [ret] "={eax}" (-> usize)118 : [ret] "={eax}" (-> usize)
109 : [number] "{eax}" (number),119 : [number] "{eax}" (number),
...@@ -112,7 +122,7 @@ inline fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {...@@ -112,7 +122,7 @@ inline fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {
112 [arg3] "{ebx}" (arg3));122 [arg3] "{ebx}" (arg3));
113}123}
114124
115inline fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {125inline fn syscall4(number: Syscall, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
116 return asm volatile ("int $0x80"126 return asm volatile ("int $0x80"
117 : [ret] "={eax}" (-> usize)127 : [ret] "={eax}" (-> usize)
118 : [number] "{eax}" (number),128 : [number] "{eax}" (number),
...@@ -122,7 +132,7 @@ inline fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: u...@@ -122,7 +132,7 @@ inline fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: u
122 [arg4] "{esi}" (arg4));132 [arg4] "{esi}" (arg4));
123}133}
124134
125inline fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize,135inline fn syscall5(number: Syscall, arg1: usize, arg2: usize, arg3: usize,
126 arg4: usize, arg5: usize) usize136 arg4: usize, arg5: usize) usize
127{137{
128 return asm volatile ("int $0x80"138 return asm volatile ("int $0x80"
...@@ -135,7 +145,7 @@ inline fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize,...@@ -135,7 +145,7 @@ inline fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize,
135 [arg5] "{edi}" (arg5));145 [arg5] "{edi}" (arg5));
136}146}
137147
138inline fn syscall6(number: usize, arg1: usize, arg2: usize, arg3: usize,148inline fn syscall6(number: Syscall, arg1: usize, arg2: usize, arg3: usize,
139 arg4: usize, arg5: usize, arg6: usize) usize149 arg4: usize, arg5: usize, arg6: usize) usize
140{150{
141 return asm volatile ("int $0x80"151 return asm volatile ("int $0x80"