| ... | @@ -38,13 +38,15 @@ pub const Service = struct { | ... | @@ -38,13 +38,15 @@ pub const Service = struct { |
| 38 | //// Syscall numbers //// | 38 | //// Syscall numbers //// |
| 39 | /////////////////////////// | 39 | /////////////////////////// |
| 40 | | 40 | |
| 41 | pub const Syscall = enum { | 41 | pub 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 | }; |
| 49 | | 51 | |
| 50 | | 52 | |
| ... | @@ -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 | } |
| 71 | | 73 | |
| | 74 | pub fn subscribeIRQ(irq: u8, mailbox_id: &const MailboxId) void { |
| | 75 | _ = syscall2(Syscall.subscribeIRQ, irq, @ptrToInt(mailbox_id)); |
| | 76 | } |
| | 77 | |
| | 78 | pub fn inb(port: u16) u8 { |
| | 79 | return u8(syscall1(Syscall.inb, port)); |
| | 80 | } |
| | 81 | |
| 72 | pub fn map(v_addr: usize, p_addr: usize, size: usize, writable: bool) bool { | 82 | pub 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 | ///////////////////////// |
| 84 | | 94 | |
| 85 | inline fn syscall0(number: usize) usize { | 95 | inline 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 | } |
| 90 | | 100 | |
| 91 | inline fn syscall1(number: usize, arg1: usize) usize { | 101 | inline 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 | } |
| 97 | | 107 | |
| 98 | inline fn syscall2(number: usize, arg1: usize, arg2: usize) usize { | 108 | inline 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 | } |
| 105 | | 115 | |
| 106 | inline fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { | 116 | inline 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 | } |
| 114 | | 124 | |
| 115 | inline fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { | 125 | inline 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 | } |
| 124 | | 134 | |
| 125 | inline fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, | 135 | inline fn syscall5(number: Syscall, arg1: usize, arg2: usize, arg3: usize, |
| 126 | arg4: usize, arg5: usize) usize | 136 | 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 | } |
| 137 | | 147 | |
| 138 | inline fn syscall6(number: usize, arg1: usize, arg2: usize, arg3: usize, | 148 | inline fn syscall6(number: Syscall, arg1: usize, arg2: usize, arg3: usize, |
| 139 | arg4: usize, arg5: usize, arg6: usize) usize | 149 | arg4: usize, arg5: usize, arg6: usize) usize |
| 140 | { | 150 | { |
| 141 | return asm volatile ("int $0x80" | 151 | return asm volatile ("int $0x80" |