|
| 1 | +#include <stdio.h> |
| 2 | +#include <stdint.h> |
| 3 | +#include <stdlib.h> |
| 4 | +#include "strace.h" |
| 5 | + |
| 6 | +// table for storing syscall handlers |
| 7 | +syscall_handler_t syscall_handler_table[MAX_SYSCALLS] = {0}; |
| 8 | + |
| 9 | +// defined syscall handlers |
| 10 | +// |
| 11 | +// args: |
| 12 | +// 1st: syscall name |
| 13 | +// 2nd: syscall number |
| 14 | +// 3rd - 8th: ARG type (ARG_INT || ARG_PTR || ARG_STR) |
| 15 | +// |
| 16 | +// NOTE: if unsure of ARG_TYPE follow: |
| 17 | +// https://www.chromium.org/chromium-os/developer-library/reference/linux-constants/syscalls/ |
| 18 | +// |
| 19 | +// defines handler for all syscalls supported by lind |
| 20 | + |
| 21 | +DEFINE_HANDLER(read, 0, ARG_INT, ARG_PTR, ARG_INT) |
| 22 | +DEFINE_HANDLER(write, 1, ARG_INT, ARG_PTR, ARG_INT) |
| 23 | +DEFINE_HANDLER(open, 2, ARG_STR, ARG_INT, ARG_INT) |
| 24 | +DEFINE_HANDLER(close, 3, ARG_INT) |
| 25 | +DEFINE_HANDLER(stat, 4, ARG_STR, ARG_PTR) |
| 26 | +DEFINE_HANDLER(fstat, 5, ARG_INT, ARG_PTR) |
| 27 | +DEFINE_HANDLER(poll, 7, ARG_PTR, ARG_INT, ARG_INT) |
| 28 | +DEFINE_HANDLER(lseek, 8, ARG_INT, ARG_INT, ARG_INT) |
| 29 | +DEFINE_HANDLER(mmap, 9, ARG_PTR, ARG_INT, ARG_INT, ARG_INT, ARG_INT, ARG_INT) |
| 30 | +DEFINE_HANDLER(mprotect, 10, ARG_PTR, ARG_INT, ARG_INT) |
| 31 | +DEFINE_HANDLER(munmap, 11, ARG_PTR, ARG_INT) |
| 32 | +DEFINE_HANDLER(brk, 12, ARG_PTR) |
| 33 | +DEFINE_HANDLER(sigaction, 13, ARG_INT, ARG_PTR, ARG_PTR) |
| 34 | +DEFINE_HANDLER(sigprocmask, 14, ARG_INT, ARG_PTR, ARG_PTR) |
| 35 | +DEFINE_HANDLER(ioctl, 16, ARG_INT, ARG_INT, ARG_PTR) |
| 36 | +DEFINE_HANDLER(pread, 17, ARG_INT, ARG_PTR, ARG_INT, ARG_INT) |
| 37 | +DEFINE_HANDLER(pwrite, 18, ARG_INT, ARG_PTR, ARG_INT, ARG_INT) |
| 38 | +DEFINE_HANDLER(writev, 20, ARG_INT, ARG_PTR, ARG_INT) |
| 39 | +DEFINE_HANDLER(access, 21, ARG_STR, ARG_INT) |
| 40 | +DEFINE_HANDLER(pipe, 22, ARG_PTR) |
| 41 | +DEFINE_HANDLER(select, 23, ARG_INT, ARG_PTR, ARG_PTR, ARG_PTR, ARG_PTR) |
| 42 | +DEFINE_HANDLER(sched_yield, 24) |
| 43 | +DEFINE_HANDLER(shmget, 29, ARG_INT, ARG_INT, ARG_INT) |
| 44 | +DEFINE_HANDLER(shmat, 30, ARG_INT, ARG_PTR, ARG_INT) |
| 45 | +DEFINE_HANDLER(shmctl, 31, ARG_INT, ARG_INT, ARG_PTR) |
| 46 | +DEFINE_HANDLER(dup, 32, ARG_INT) |
| 47 | +DEFINE_HANDLER(dup2, 33, ARG_INT, ARG_INT) |
| 48 | +DEFINE_HANDLER(nanosleep, 35, ARG_PTR, ARG_PTR) |
| 49 | +DEFINE_HANDLER(setitimer, 38, ARG_INT, ARG_PTR, ARG_PTR) |
| 50 | +DEFINE_HANDLER(getpid, 39) |
| 51 | +DEFINE_HANDLER(socket, 41, ARG_INT, ARG_INT, ARG_INT) |
| 52 | +DEFINE_HANDLER(connect, 42, ARG_INT, ARG_PTR, ARG_INT) |
| 53 | +DEFINE_HANDLER(accept, 43, ARG_INT, ARG_PTR, ARG_PTR) |
| 54 | +DEFINE_HANDLER(sendto, 44, ARG_INT, ARG_PTR, ARG_INT, ARG_INT, ARG_PTR, ARG_INT) |
| 55 | +DEFINE_HANDLER(recvfrom, 45, ARG_INT, ARG_PTR, ARG_INT, ARG_INT, ARG_PTR, ARG_PTR) |
| 56 | +DEFINE_HANDLER(shutdown, 48, ARG_INT, ARG_INT) |
| 57 | +DEFINE_HANDLER(bind, 49, ARG_INT, ARG_PTR, ARG_INT) |
| 58 | +DEFINE_HANDLER(listen, 50, ARG_INT, ARG_INT) |
| 59 | +DEFINE_HANDLER(getsockname, 51, ARG_INT, ARG_PTR, ARG_PTR) |
| 60 | +DEFINE_HANDLER(getpeername, 52, ARG_INT, ARG_PTR, ARG_PTR) |
| 61 | +DEFINE_HANDLER(socketpair, 53, ARG_INT, ARG_INT, ARG_INT, ARG_PTR) |
| 62 | +DEFINE_HANDLER(setsockopt, 54, ARG_INT, ARG_INT, ARG_INT, ARG_PTR, ARG_INT) |
| 63 | +DEFINE_HANDLER(getsockopt, 55, ARG_INT, ARG_INT, ARG_INT, ARG_PTR, ARG_PTR) |
| 64 | +DEFINE_HANDLER(clone, 56, ARG_INT, ARG_PTR, ARG_PTR, ARG_PTR, ARG_PTR) |
| 65 | +DEFINE_HANDLER(fork, 57) |
| 66 | +DEFINE_HANDLER(exec, 59, ARG_STR, ARG_PTR, ARG_PTR) |
| 67 | +DEFINE_HANDLER(exit, 60, ARG_INT) |
| 68 | +DEFINE_HANDLER(waitpid, 61, ARG_INT, ARG_PTR, ARG_INT) |
| 69 | +DEFINE_HANDLER(kill, 62, ARG_INT, ARG_INT) |
| 70 | +DEFINE_HANDLER(shmdt, 67, ARG_PTR) |
| 71 | +DEFINE_HANDLER(fcntl, 72, ARG_INT, ARG_INT, ARG_PTR) |
| 72 | +DEFINE_HANDLER(flock, 73, ARG_INT, ARG_INT) |
| 73 | +DEFINE_HANDLER(fsync, 74, ARG_INT) |
| 74 | +DEFINE_HANDLER(fdatasync, 75, ARG_INT) |
| 75 | +DEFINE_HANDLER(truncate, 76, ARG_STR, ARG_INT) |
| 76 | +DEFINE_HANDLER(ftruncate, 77, ARG_INT, ARG_INT) |
| 77 | +DEFINE_HANDLER(getdents, 78, ARG_INT, ARG_PTR, ARG_INT) |
| 78 | +DEFINE_HANDLER(getcwd, 79, ARG_PTR, ARG_INT) |
| 79 | +DEFINE_HANDLER(chdir, 80, ARG_STR) |
| 80 | +DEFINE_HANDLER(fchdir, 81, ARG_INT) |
| 81 | +DEFINE_HANDLER(rename, 82, ARG_STR, ARG_STR) |
| 82 | +DEFINE_HANDLER(mkdir, 83, ARG_STR, ARG_INT) |
| 83 | +DEFINE_HANDLER(rmdir, 84, ARG_STR) |
| 84 | +DEFINE_HANDLER(link, 86, ARG_STR, ARG_STR) |
| 85 | +DEFINE_HANDLER(unlink, 87, ARG_STR) |
| 86 | +DEFINE_HANDLER(readlink, 89, ARG_STR, ARG_PTR, ARG_INT) |
| 87 | +DEFINE_HANDLER(chmod, 90, ARG_STR, ARG_INT) |
| 88 | +DEFINE_HANDLER(fchmod, 91, ARG_INT, ARG_INT) |
| 89 | +DEFINE_HANDLER(getuid, 102) |
| 90 | +DEFINE_HANDLER(getgid, 104) |
| 91 | +DEFINE_HANDLER(geteuid, 107) |
| 92 | +DEFINE_HANDLER(getegid, 108) |
| 93 | +DEFINE_HANDLER(getppid, 110) |
| 94 | +DEFINE_HANDLER(statfs, 137, ARG_STR, ARG_PTR) |
| 95 | +DEFINE_HANDLER(fstatfs, 138, ARG_INT, ARG_PTR) |
| 96 | +DEFINE_HANDLER(gethostname, 170, ARG_PTR, ARG_INT) |
| 97 | +DEFINE_HANDLER(futex, 202, ARG_PTR, ARG_INT, ARG_INT, ARG_PTR, ARG_PTR, ARG_INT) |
| 98 | +DEFINE_HANDLER(epoll_create, 213, ARG_INT) |
| 99 | +DEFINE_HANDLER(clock_gettime, 228, ARG_INT, ARG_PTR) |
| 100 | +DEFINE_HANDLER(epoll_wait, 232, ARG_INT, ARG_PTR, ARG_INT, ARG_INT) |
| 101 | +DEFINE_HANDLER(epoll_ctl, 233, ARG_INT, ARG_INT, ARG_INT, ARG_PTR) |
| 102 | +DEFINE_HANDLER(unlinkat, 263, ARG_INT, ARG_STR, ARG_INT) |
| 103 | +DEFINE_HANDLER(readlinkat, 267, ARG_INT, ARG_STR, ARG_PTR, ARG_INT) |
| 104 | +DEFINE_HANDLER(sync_file_range, 277, ARG_INT, ARG_INT, ARG_INT, ARG_INT) |
| 105 | +DEFINE_HANDLER(epoll_create1, 291, ARG_INT) |
| 106 | +DEFINE_HANDLER(dup3, 292, ARG_INT, ARG_INT, ARG_INT) |
| 107 | +DEFINE_HANDLER(pipe2, 293, ARG_PTR, ARG_INT) |
| 108 | +DEFINE_HANDLER(getrandom, 318, ARG_PTR, ARG_INT, ARG_INT) |
| 109 | + |
| 110 | +// dispatcher function |
| 111 | +int pass_fptr_to_wt(uint64_t fn_ptr_uint, uint64_t cageid, |
| 112 | + uint64_t arg1, uint64_t arg1cage, |
| 113 | + uint64_t arg2, uint64_t arg2cage, |
| 114 | + uint64_t arg3, uint64_t arg3cage, |
| 115 | + uint64_t arg4, uint64_t arg4cage, |
| 116 | + uint64_t arg5, uint64_t arg5cage, |
| 117 | + uint64_t arg6, uint64_t arg6cage) { |
| 118 | + |
| 119 | + if (fn_ptr_uint == 0) { |
| 120 | + return -1; |
| 121 | + } |
| 122 | + |
| 123 | + syscall_handler_t fn = (syscall_handler_t)(uintptr_t)fn_ptr_uint; |
| 124 | + |
| 125 | + return fn(cageid, arg1, arg1cage, arg2, arg2cage, arg3, arg3cage, |
| 126 | + arg4, arg4cage, arg5, arg5cage, arg6, arg6cage); |
| 127 | +} |
0 commit comments