| ... | @@ -1,17 +1,63 @@ | ... | @@ -1,17 +1,63 @@ |
| 1 | // this file is specific to x86_64 | 1 | const SYS_read = switch (@compile_var("arch")) { |
| 2 | | 2 | x86_64 => 0, |
| 3 | const SYS_read = 0; | 3 | i386 => 3, |
| 4 | const SYS_write = 1; | 4 | else => unreachable{}, |
| 5 | const SYS_mmap = 9; | 5 | }; |
| 6 | const SYS_munmap = 11; | 6 | const SYS_write = switch (@compile_var("arch")) { |
| 7 | const SYS_rt_sigprocmask = 14; | 7 | x86_64 => 1, |
| 8 | const SYS_exit = 60; | 8 | i386 => 4, |
| 9 | const SYS_kill = 62; | 9 | else => unreachable{}, |
| 10 | const SYS_getgid = 104; | 10 | }; |
| 11 | const SYS_gettid = 186; | 11 | const SYS_mmap = switch (@compile_var("arch")) { |
| 12 | const SYS_tkill = 200; | 12 | x86_64 => 9, |
| 13 | const SYS_tgkill = 234; | 13 | i386 => 90, |
| 14 | const SYS_getrandom = 318; | 14 | else => unreachable{}, |
| | 15 | }; |
| | 16 | const SYS_munmap = switch (@compile_var("arch")) { |
| | 17 | x86_64 => 11, |
| | 18 | i386 => 91, |
| | 19 | else => unreachable{}, |
| | 20 | }; |
| | 21 | const SYS_rt_sigprocmask = switch (@compile_var("arch")) { |
| | 22 | x86_64 => 14, |
| | 23 | i386 => 175, |
| | 24 | else => unreachable{}, |
| | 25 | }; |
| | 26 | const SYS_exit = switch (@compile_var("arch")) { |
| | 27 | x86_64 => 60, |
| | 28 | i386 => 1, |
| | 29 | else => unreachable{}, |
| | 30 | }; |
| | 31 | const SYS_kill = switch (@compile_var("arch")) { |
| | 32 | x86_64 => 62, |
| | 33 | i386 => 37, |
| | 34 | else => unreachable{}, |
| | 35 | }; |
| | 36 | const SYS_getgid = switch (@compile_var("arch")) { |
| | 37 | x86_64 => 104, |
| | 38 | i386 => 47, |
| | 39 | else => unreachable{}, |
| | 40 | }; |
| | 41 | const SYS_gettid = switch (@compile_var("arch")) { |
| | 42 | x86_64 => 186, |
| | 43 | i386 => 224, |
| | 44 | else => unreachable{}, |
| | 45 | }; |
| | 46 | const SYS_tkill = switch (@compile_var("arch")) { |
| | 47 | x86_64 => 200, |
| | 48 | i386 => 238, |
| | 49 | else => unreachable{}, |
| | 50 | }; |
| | 51 | const SYS_tgkill = switch (@compile_var("arch")) { |
| | 52 | x86_64 => 234, |
| | 53 | i386 => 270, |
| | 54 | else => unreachable{}, |
| | 55 | }; |
| | 56 | const SYS_getrandom = switch (@compile_var("arch")) { |
| | 57 | x86_64 => 318, |
| | 58 | i386 => 355, |
| | 59 | else => unreachable{}, |
| | 60 | }; |
| 15 | | 61 | |
| 16 | pub const MMAP_PROT_NONE = 0; | 62 | pub const MMAP_PROT_NONE = 0; |
| 17 | pub const MMAP_PROT_READ = 1; | 63 | pub const MMAP_PROT_READ = 1; |
| ... | @@ -63,14 +109,45 @@ const SIG_BLOCK = 0; | ... | @@ -63,14 +109,45 @@ const SIG_BLOCK = 0; |
| 63 | const SIG_UNBLOCK = 1; | 109 | const SIG_UNBLOCK = 1; |
| 64 | const SIG_SETMASK = 2; | 110 | const SIG_SETMASK = 2; |
| 65 | | 111 | |
| 66 | fn syscall0(number: isize) -> isize { | 112 | const syscall0 = switch (@compile_var("arch")) { |
| | 113 | x86_64 => x86_64_syscall0, |
| | 114 | i386 => i386_syscall0, |
| | 115 | else => unreachable{}, |
| | 116 | }; |
| | 117 | const syscall1 = switch (@compile_var("arch")) { |
| | 118 | x86_64 => x86_64_syscall1, |
| | 119 | i386 => i386_syscall1, |
| | 120 | else => unreachable{}, |
| | 121 | }; |
| | 122 | const syscall2 = switch (@compile_var("arch")) { |
| | 123 | x86_64 => x86_64_syscall2, |
| | 124 | i386 => i386_syscall2, |
| | 125 | else => unreachable{}, |
| | 126 | }; |
| | 127 | const syscall3 = switch (@compile_var("arch")) { |
| | 128 | x86_64 => x86_64_syscall3, |
| | 129 | i386 => i386_syscall3, |
| | 130 | else => unreachable{}, |
| | 131 | }; |
| | 132 | const syscall4 = switch (@compile_var("arch")) { |
| | 133 | x86_64 => x86_64_syscall4, |
| | 134 | i386 => i386_syscall4, |
| | 135 | else => unreachable{}, |
| | 136 | }; |
| | 137 | const syscall6 = switch (@compile_var("arch")) { |
| | 138 | x86_64 => x86_64_syscall6, |
| | 139 | i386 => i386_syscall6, |
| | 140 | else => unreachable{}, |
| | 141 | }; |
| | 142 | |
| | 143 | fn x86_64_syscall0(number: isize) -> isize { |
| 67 | asm volatile ("syscall" | 144 | asm volatile ("syscall" |
| 68 | : [ret] "={rax}" (-> isize) | 145 | : [ret] "={rax}" (-> isize) |
| 69 | : [number] "{rax}" (number) | 146 | : [number] "{rax}" (number) |
| 70 | : "rcx", "r11") | 147 | : "rcx", "r11") |
| 71 | } | 148 | } |
| 72 | | 149 | |
| 73 | fn syscall1(number: isize, arg1: isize) -> isize { | 150 | fn x86_64_syscall1(number: isize, arg1: isize) -> isize { |
| 74 | asm volatile ("syscall" | 151 | asm volatile ("syscall" |
| 75 | : [ret] "={rax}" (-> isize) | 152 | : [ret] "={rax}" (-> isize) |
| 76 | : [number] "{rax}" (number), | 153 | : [number] "{rax}" (number), |
| ... | @@ -78,7 +155,7 @@ fn syscall1(number: isize, arg1: isize) -> isize { | ... | @@ -78,7 +155,7 @@ fn syscall1(number: isize, arg1: isize) -> isize { |
| 78 | : "rcx", "r11") | 155 | : "rcx", "r11") |
| 79 | } | 156 | } |
| 80 | | 157 | |
| 81 | fn syscall2(number: isize, arg1: isize, arg2: isize) -> isize { | 158 | fn x86_64_syscall2(number: isize, arg1: isize, arg2: isize) -> isize { |
| 82 | asm volatile ("syscall" | 159 | asm volatile ("syscall" |
| 83 | : [ret] "={rax}" (-> isize) | 160 | : [ret] "={rax}" (-> isize) |
| 84 | : [number] "{rax}" (number), | 161 | : [number] "{rax}" (number), |
| ... | @@ -87,7 +164,7 @@ fn syscall2(number: isize, arg1: isize, arg2: isize) -> isize { | ... | @@ -87,7 +164,7 @@ fn syscall2(number: isize, arg1: isize, arg2: isize) -> isize { |
| 87 | : "rcx", "r11") | 164 | : "rcx", "r11") |
| 88 | } | 165 | } |
| 89 | | 166 | |
| 90 | fn syscall3(number: isize, arg1: isize, arg2: isize, arg3: isize) -> isize { | 167 | fn x86_64_syscall3(number: isize, arg1: isize, arg2: isize, arg3: isize) -> isize { |
| 91 | asm volatile ("syscall" | 168 | asm volatile ("syscall" |
| 92 | : [ret] "={rax}" (-> isize) | 169 | : [ret] "={rax}" (-> isize) |
| 93 | : [number] "{rax}" (number), | 170 | : [number] "{rax}" (number), |
| ... | @@ -97,7 +174,7 @@ fn syscall3(number: isize, arg1: isize, arg2: isize, arg3: isize) -> isize { | ... | @@ -97,7 +174,7 @@ fn syscall3(number: isize, arg1: isize, arg2: isize, arg3: isize) -> isize { |
| 97 | : "rcx", "r11") | 174 | : "rcx", "r11") |
| 98 | } | 175 | } |
| 99 | | 176 | |
| 100 | fn syscall4(number: isize, arg1: isize, arg2: isize, arg3: isize, arg4: isize) -> isize { | 177 | fn x86_64_syscall4(number: isize, arg1: isize, arg2: isize, arg3: isize, arg4: isize) -> isize { |
| 101 | asm volatile ("syscall" | 178 | asm volatile ("syscall" |
| 102 | : [ret] "={rax}" (-> isize) | 179 | : [ret] "={rax}" (-> isize) |
| 103 | : [number] "{rax}" (number), | 180 | : [number] "{rax}" (number), |
| ... | @@ -108,7 +185,7 @@ fn syscall4(number: isize, arg1: isize, arg2: isize, arg3: isize, arg4: isize) - | ... | @@ -108,7 +185,7 @@ fn syscall4(number: isize, arg1: isize, arg2: isize, arg3: isize, arg4: isize) - |
| 108 | : "rcx", "r11") | 185 | : "rcx", "r11") |
| 109 | } | 186 | } |
| 110 | | 187 | |
| 111 | fn syscall6(number: isize, arg1: isize, arg2: isize, arg3: isize, arg4: isize, arg5: isize, arg6: isize) -> isize { | 188 | fn x86_64_syscall6(number: isize, arg1: isize, arg2: isize, arg3: isize, arg4: isize, arg5: isize, arg6: isize) -> isize { |
| 112 | asm volatile ("syscall" | 189 | asm volatile ("syscall" |
| 113 | : [ret] "={rax}" (-> isize) | 190 | : [ret] "={rax}" (-> isize) |
| 114 | : [number] "{rax}" (number), | 191 | : [number] "{rax}" (number), |
| ... | @@ -121,6 +198,58 @@ fn syscall6(number: isize, arg1: isize, arg2: isize, arg3: isize, arg4: isize, a | ... | @@ -121,6 +198,58 @@ fn syscall6(number: isize, arg1: isize, arg2: isize, arg3: isize, arg4: isize, a |
| 121 | : "rcx", "r11") | 198 | : "rcx", "r11") |
| 122 | } | 199 | } |
| 123 | | 200 | |
| | 201 | fn i386_syscall0(number: isize) -> isize { |
| | 202 | asm volatile ("int $0x80" |
| | 203 | : [ret] "={eax}" (-> isize) |
| | 204 | : [number] "{eax}" (number)) |
| | 205 | } |
| | 206 | |
| | 207 | fn i386_syscall1(number: isize, arg1: isize) -> isize { |
| | 208 | asm volatile ("int $0x80" |
| | 209 | : [ret] "={eax}" (-> isize) |
| | 210 | : [number] "{eax}" (number), |
| | 211 | [arg1] "{ebx}" (arg1)) |
| | 212 | } |
| | 213 | |
| | 214 | fn i386_syscall2(number: isize, arg1: isize, arg2: isize) -> isize { |
| | 215 | asm volatile ("int $0x80" |
| | 216 | : [ret] "={eax}" (-> isize) |
| | 217 | : [number] "{eax}" (number), |
| | 218 | [arg1] "{ebx}" (arg1), |
| | 219 | [arg2] "{ecx}" (arg2)) |
| | 220 | } |
| | 221 | |
| | 222 | fn i386_syscall3(number: isize, arg1: isize, arg2: isize, arg3: isize) -> isize { |
| | 223 | asm volatile ("int $0x80" |
| | 224 | : [ret] "={eax}" (-> isize) |
| | 225 | : [number] "{eax}" (number), |
| | 226 | [arg1] "{ebx}" (arg1), |
| | 227 | [arg2] "{ecx}" (arg2), |
| | 228 | [arg3] "{edx}" (arg3)) |
| | 229 | } |
| | 230 | |
| | 231 | fn i386_syscall4(number: isize, arg1: isize, arg2: isize, arg3: isize, arg4: isize) -> isize { |
| | 232 | asm volatile ("int $0x80" |
| | 233 | : [ret] "={eax}" (-> isize) |
| | 234 | : [number] "{eax}" (number), |
| | 235 | [arg1] "{ebx}" (arg1), |
| | 236 | [arg2] "{ecx}" (arg2), |
| | 237 | [arg3] "{edx}" (arg3), |
| | 238 | [arg4] "{esi}" (arg4)) |
| | 239 | } |
| | 240 | |
| | 241 | fn i386_syscall6(number: isize, arg1: isize, arg2: isize, arg3: isize, arg4: isize, arg5: isize, arg6: isize) -> isize { |
| | 242 | asm volatile ("int $0x80" |
| | 243 | : [ret] "={eax}" (-> isize) |
| | 244 | : [number] "{eax}" (number), |
| | 245 | [arg1] "{ebx}" (arg1), |
| | 246 | [arg2] "{ecx}" (arg2), |
| | 247 | [arg3] "{edx}" (arg3), |
| | 248 | [arg4] "{esi}" (arg4), |
| | 249 | [arg5] "{edi}" (arg5), |
| | 250 | [arg6] "{ebp}" (arg6)) |
| | 251 | } |
| | 252 | |
| 124 | pub fn mmap(address: isize, length: isize, prot: isize, flags: isize, fd: isize, offset: isize) -> isize { | 253 | pub fn mmap(address: isize, length: isize, prot: isize, flags: isize, fd: isize, offset: isize) -> isize { |
| 125 | syscall6(SYS_mmap, address, length, prot, flags, fd, offset) | 254 | syscall6(SYS_mmap, address, length, prot, flags, fd, offset) |
| 126 | } | 255 | } |