| ... | ... | @@ -1,17 +1,63 @@ |
| 1 | | // this file is specific to x86_64 |
| 2 | | |
| 3 | | const SYS_read = 0; |
| 4 | | const SYS_write = 1; |
| 5 | | const SYS_mmap = 9; |
| 6 | | const SYS_munmap = 11; |
| 7 | | const SYS_rt_sigprocmask = 14; |
| 8 | | const SYS_exit = 60; |
| 9 | | const SYS_kill = 62; |
| 10 | | const SYS_getgid = 104; |
| 11 | | const SYS_gettid = 186; |
| 12 | | const SYS_tkill = 200; |
| 13 | | const SYS_tgkill = 234; |
| 14 | | const SYS_getrandom = 318; |
| 1 | const SYS_read = switch (@compile_var("arch")) { |
| 2 | x86_64 => 0, |
| 3 | i386 => 3, |
| 4 | else => unreachable{}, |
| 5 | }; |
| 6 | const SYS_write = switch (@compile_var("arch")) { |
| 7 | x86_64 => 1, |
| 8 | i386 => 4, |
| 9 | else => unreachable{}, |
| 10 | }; |
| 11 | const SYS_mmap = switch (@compile_var("arch")) { |
| 12 | x86_64 => 9, |
| 13 | i386 => 90, |
| 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 | 62 | pub const MMAP_PROT_NONE = 0; |
| 17 | 63 | pub const MMAP_PROT_READ = 1; |
| ... | ... | @@ -63,14 +109,45 @@ const SIG_BLOCK = 0; |
| 63 | 109 | const SIG_UNBLOCK = 1; |
| 64 | 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 | 144 | asm volatile ("syscall" |
| 68 | 145 | : [ret] "={rax}" (-> isize) |
| 69 | 146 | : [number] "{rax}" (number) |
| 70 | 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 | 151 | asm volatile ("syscall" |
| 75 | 152 | : [ret] "={rax}" (-> isize) |
| 76 | 153 | : [number] "{rax}" (number), |
| ... | ... | @@ -78,7 +155,7 @@ fn syscall1(number: isize, arg1: isize) -> isize { |
| 78 | 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 | 159 | asm volatile ("syscall" |
| 83 | 160 | : [ret] "={rax}" (-> isize) |
| 84 | 161 | : [number] "{rax}" (number), |
| ... | ... | @@ -87,7 +164,7 @@ fn syscall2(number: isize, arg1: isize, arg2: isize) -> isize { |
| 87 | 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 | 168 | asm volatile ("syscall" |
| 92 | 169 | : [ret] "={rax}" (-> isize) |
| 93 | 170 | : [number] "{rax}" (number), |
| ... | ... | @@ -97,7 +174,7 @@ fn syscall3(number: isize, arg1: isize, arg2: isize, arg3: isize) -> isize { |
| 97 | 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 | 178 | asm volatile ("syscall" |
| 102 | 179 | : [ret] "={rax}" (-> isize) |
| 103 | 180 | : [number] "{rax}" (number), |
| ... | ... | @@ -108,7 +185,7 @@ fn syscall4(number: isize, arg1: isize, arg2: isize, arg3: isize, arg4: isize) - |
| 108 | 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 | 189 | asm volatile ("syscall" |
| 113 | 190 | : [ret] "={rax}" (-> isize) |
| 114 | 191 | : [number] "{rax}" (number), |
| ... | ... | @@ -121,6 +198,58 @@ fn syscall6(number: isize, arg1: isize, arg2: isize, arg3: isize, arg4: isize, a |
| 121 | 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 | 253 | pub fn mmap(address: isize, length: isize, prot: isize, flags: isize, fd: isize, offset: isize) -> isize { |
| 125 | 254 | syscall6(SYS_mmap, address, length, prot, flags, fd, offset) |
| 126 | 255 | } |