| ... | @@ -1,8 +1,22 @@ | ... | @@ -1,8 +1,22 @@ |
| 1 | const SYS_read = 0; | 1 | const SYS_read = 0; |
| 2 | const SYS_write = 1; | 2 | const SYS_write = 1; |
| | 3 | const SYS_mmap = 9; |
| | 4 | const SYS_munmap = 11; |
| 3 | const SYS_exit = 60; | 5 | const SYS_exit = 60; |
| 4 | const SYS_getrandom = 318; | 6 | const SYS_getrandom = 318; |
| 5 | | 7 | |
| | 8 | // mmap constants |
| | 9 | pub const MMAP_PROT_NONE = 0; |
| | 10 | pub const MMAP_PROT_READ = 1; |
| | 11 | pub const MMAP_PROT_WRITE = 2; |
| | 12 | pub const MMAP_PROT_EXEC = 4; |
| | 13 | |
| | 14 | pub const MMAP_MAP_FILE = 0; |
| | 15 | pub const MMAP_MAP_SHARED = 1; |
| | 16 | pub const MMAP_MAP_PRIVATE = 2; |
| | 17 | pub const MMAP_MAP_FIXED = 16; |
| | 18 | pub const MMAP_MAP_ANON = 32; |
| | 19 | |
| 6 | fn syscall1(number: isize, arg1: isize) -> isize { | 20 | fn syscall1(number: isize, arg1: isize) -> isize { |
| 7 | asm volatile ("syscall" | 21 | asm volatile ("syscall" |
| 8 | : [ret] "={rax}" (-> isize) | 22 | : [ret] "={rax}" (-> isize) |
| ... | @@ -17,6 +31,28 @@ fn syscall3(number: isize, arg1: isize, arg2: isize, arg3: isize) -> isize { | ... | @@ -17,6 +31,28 @@ fn syscall3(number: isize, arg1: isize, arg2: isize, arg3: isize) -> isize { |
| 17 | : "rcx", "r11") | 31 | : "rcx", "r11") |
| 18 | } | 32 | } |
| 19 | | 33 | |
| | 34 | fn syscall2(number: isize, arg1: isize, arg2: isize) -> isize { |
| | 35 | asm volatile ("syscall" |
| | 36 | : [ret] "={rax}" (-> isize) |
| | 37 | : [number] "{rax}" (number), [arg1] "{rdi}" (arg1), [arg2] "{rsi}" (arg2) |
| | 38 | : "rcx", "r11") |
| | 39 | } |
| | 40 | |
| | 41 | fn syscall6(number: isize, arg1: isize, arg2: isize, arg3: isize, arg4: isize, arg5: isize, arg6: isize) -> isize { |
| | 42 | asm volatile ("syscall" |
| | 43 | : [ret] "={rax}" (-> isize) |
| | 44 | : [number] "{rax}" (number), [arg1] "{rdi}" (arg1), [arg2] "{rsi}" (arg2), [arg3] "{rdx}" (arg3), [arg4] "{r10}" (arg4), [arg5] "{r8}" (arg5), [arg6] "{r9}" (arg6) |
| | 45 | : "rcx", "r11") |
| | 46 | } |
| | 47 | |
| | 48 | pub fn mmap(address: isize, length: isize, prot: isize, flags: isize, fd: isize, offset: isize) -> isize { |
| | 49 | syscall6(SYS_mmap, address, length, prot, flags, fd, offset) |
| | 50 | } |
| | 51 | |
| | 52 | pub fn munmap(address: isize, length: isize) -> isize { |
| | 53 | syscall2(SYS_munmap, address, length) |
| | 54 | } |
| | 55 | |
| 20 | pub fn read(fd: isize, buf: &u8, count: isize) -> isize { | 56 | pub fn read(fd: isize, buf: &u8, count: isize) -> isize { |
| 21 | syscall3(SYS_read, isize(fd), isize(buf), count) | 57 | syscall3(SYS_read, isize(fd), isize(buf), count) |
| 22 | } | 58 | } |