| ... | ... | @@ -38,13 +38,15 @@ pub const Service = struct { |
| 38 | 38 | //// Syscall numbers //// |
| 39 | 39 | /////////////////////////// |
| 40 | 40 | |
| 41 | | pub const Syscall = enum { |
| 41 | pub const Syscall = enum(usize) { |
| 42 | 42 | exit = 0, |
| 43 | 43 | createPort = 1, |
| 44 | 44 | send = 2, |
| 45 | 45 | receive = 3, |
| 46 | | map = 4, |
| 47 | | createThread = 5, |
| 46 | subscribeIRQ = 4, |
| 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 | 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 | 82 | pub fn map(v_addr: usize, p_addr: usize, size: usize, writable: bool) bool { |
| 73 | 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 | 92 | //// Syscall stubs //// |
| 83 | 93 | ///////////////////////// |
| 84 | 94 | |
| 85 | | inline fn syscall0(number: usize) usize { |
| 95 | inline fn syscall0(number: Syscall) usize { |
| 86 | 96 | return asm volatile ("int $0x80" |
| 87 | 97 | : [ret] "={eax}" (-> usize) |
| 88 | 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 | 102 | return asm volatile ("int $0x80" |
| 93 | 103 | : [ret] "={eax}" (-> usize) |
| 94 | 104 | : [number] "{eax}" (number), |
| 95 | 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 | 109 | return asm volatile ("int $0x80" |
| 100 | 110 | : [ret] "={eax}" (-> usize) |
| 101 | 111 | : [number] "{eax}" (number), |
| ... | ... | @@ -103,7 +113,7 @@ inline fn syscall2(number: usize, arg1: usize, arg2: usize) usize { |
| 103 | 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 | 117 | return asm volatile ("int $0x80" |
| 108 | 118 | : [ret] "={eax}" (-> usize) |
| 109 | 119 | : [number] "{eax}" (number), |
| ... | ... | @@ -112,7 +122,7 @@ inline fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { |
| 112 | 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 | 126 | return asm volatile ("int $0x80" |
| 117 | 127 | : [ret] "={eax}" (-> usize) |
| 118 | 128 | : [number] "{eax}" (number), |
| ... | ... | @@ -122,7 +132,7 @@ inline fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: u |
| 122 | 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 | 136 | arg4: usize, arg5: usize) usize |
| 127 | 137 | { |
| 128 | 138 | return asm volatile ("int $0x80" |
| ... | ... | @@ -135,7 +145,7 @@ inline fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, |
| 135 | 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 | 149 | arg4: usize, arg5: usize, arg6: usize) usize |
| 140 | 150 | { |
| 141 | 151 | return asm volatile ("int $0x80" |