/* See LICENSE file for copyright and license details. */ #if !defined __x86_64__ || defined __IPL32__ # error "This program is only implemented for x86-64" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* Constants used in system calls */ #include #include #include #include "arg.h" #include "list-errnos.h" enum type { Unknown, Void, Int, UInt, OInt, XInt, Long, ULong, OLong, XLong, LLong, ULLong, OLLong, XLLong, Ptr }; enum state { Normal, Syscall }; struct process { pid_t pid; struct process *next; struct process *prev; enum state state; /* Syscall data */ unsigned long long int scall; unsigned long long int args[6]; unsigned long long int ret; enum type ret_type; }; /* consts.c */ const char *get_errno_name(int err); /* memory.c */ char *get_string(pid_t pid, unsigned long int addr, size_t *lenp, const char **errorp); int get_struct(pid_t pid, unsigned long int addr, void *out, size_t size, const char **errorp); char *get_memory(pid_t pid, unsigned long int addr, size_t n, const char **errorp); char *escape_memory(char *str, size_t m); /* print.c */ void print_systemcall(struct process *proc); void print_systemcall_exit(struct process *proc); /* process.c */ void init_process_list(void); struct process *find_process(pid_t pid); struct process *add_process(pid_t pid, int trace_options); void remove_process(struct process *proc); /* util.c */ void set_trace_output(FILE *fp); void tprintf(struct process *proc, const char *fmt, ...); _Noreturn void eprintf(const char *fmt, ...);