| #pragma once |
| #ifndef ROS_KERNEL |
| # error "This is ROS kernel header; user programs should not #include it" |
| #endif |
| |
| #include <ros/common.h> |
| #include <ros/syscall.h> |
| #include <process.h> |
| #include <kref.h> |
| #include <ns.h> |
| #include <bitmap.h> |
| |
| #define SYSTRACE_ON 0x01 |
| #define SYSTRACE_LOUD 0x02 |
| #define SYSTRACE_ALLPROC 0x04 |
| |
| #define MAX_SYSTRACES 1024 |
| |
| #define SYSCALL_STRLEN 128 |
| |
| #define MAX_ASRC_BATCH 10 |
| |
| #define SYSTR_RECORD_SZ 256 |
| #define SYSTR_PRETTY_BUF_SZ (SYSTR_BUF_SZ - sizeof(struct systrace_record)) |
| struct systrace_record { |
| struct systrace_record_anon { |
| uint64_t start_timestamp, end_timestamp; |
| uintreg_t syscallno; |
| uintreg_t arg0; |
| uintreg_t arg1; |
| uintreg_t arg2; |
| uintreg_t arg3; |
| uintreg_t arg4; |
| uintreg_t arg5; |
| uintreg_t retval; |
| int pid; |
| uint32_t coreid; |
| uint32_t vcoreid; |
| char *pretty_buf; |
| uint8_t datalen; |
| int errno; |
| }; |
| uint8_t data[SYSTR_RECORD_SZ - sizeof(struct systrace_record_anon)]; |
| }; |
| |
| struct strace { |
| bool tracing; |
| bool inherit; |
| bool drop_overflow; |
| atomic_t nr_drops; |
| unsigned long appx_nr_sysc; |
| struct kref procs; /* when procs goes to zero, q is hung up. */ |
| struct kref users; /* when users goes to zero, q and struct are freed.*/ |
| struct queue *q; |
| spinlock_t lock; |
| DECLARE_BITMAP(trace_set, MAX_SYSCALL_NR); |
| }; |
| |
| extern bool systrace_loud; |
| |
| /* Syscall table */ |
| typedef intreg_t (*syscall_t)(struct proc *, uintreg_t, uintreg_t, uintreg_t, |
| uintreg_t, uintreg_t, uintreg_t); |
| struct sys_table_entry { |
| syscall_t call; |
| char *name; |
| }; |
| extern const struct sys_table_entry syscall_table[]; |
| extern const int max_syscall; |
| /* Syscall invocation */ |
| void prep_syscalls(struct proc *p, struct syscall *sysc, unsigned int nr_calls); |
| void run_local_syscall(struct syscall *sysc); |
| intreg_t syscall(struct proc *p, uintreg_t sc_num, uintreg_t a0, uintreg_t a1, |
| uintreg_t a2, uintreg_t a3, uintreg_t a4, uintreg_t a5); |
| void set_errno(int errno); |
| int get_errno(void); |
| void unset_errno(void); |
| void vset_errstr(const char *fmt, va_list ap); |
| void set_errstr(const char *errstr, ...); |
| char *current_errstr(void); |
| void set_error(int error, const char *fmt, ...); |
| struct errbuf *get_cur_errbuf(void); |
| void set_cur_errbuf(struct errbuf *ebuf); |
| char *get_cur_genbuf(void); |
| void __signal_syscall(struct syscall *sysc, struct proc *p); |
| |
| /* Utility */ |
| bool syscall_uses_fd(struct syscall *sysc, int fd); |
| void print_sysc(struct proc *p, struct syscall *sysc); |
| void kth_panic_sysc(struct kthread *kth); |