| #pragma once |
| |
| #include <ros/bits/syscall.h> |
| #include <ros/arch/syscall.h> |
| #include <ros/event.h> |
| #include <ros/atomic.h> |
| |
| /* Flags for an individual syscall. */ |
| #define SC_DONE 0x0001 /* SC is done */ |
| #define SC_PROGRESS 0x0002 /* SC made progress */ |
| #define SC_UEVENT 0x0004 /* user has an ev_q */ |
| #define SC_K_LOCK 0x0008 /* kernel locked sysc */ |
| #define SC_ABORT 0x0010 /* syscall abort attempted */ |
| |
| #define MAX_ERRSTR_LEN 128 |
| #define SYSTR_BUF_SZ PGSIZE |
| |
| struct syscall { |
| unsigned int num; |
| int err; /* errno */ |
| long retval; |
| atomic_t flags; |
| struct event_queue *ev_q; |
| void *u_data; |
| long arg0; |
| long arg1; |
| long arg2; |
| long arg3; |
| long arg4; |
| long arg5; |
| char errstr[MAX_ERRSTR_LEN]; |
| }; |
| |
| static inline bool syscall_retval_is_error(unsigned int sysc_nr, long retval) |
| { |
| switch (sysc_nr) { |
| case SYS_getpcoreid: |
| case SYS_getvcoreid: |
| case SYS_reboot: |
| case SYS_proc_yield: |
| case SYS_vc_entry: |
| case SYS_umask: |
| case SYS_init_arsc: |
| return false; |
| case SYS_abort_sysc: |
| case SYS_abort_sysc_fd: |
| /* These two are a little weird */ |
| return false; |
| case SYS_null: |
| case SYS_block: |
| case SYS_nanosleep: |
| case SYS_cache_invalidate: |
| case SYS_proc_run: |
| case SYS_proc_destroy: |
| case SYS_exec: |
| case SYS_munmap: |
| case SYS_mprotect: |
| case SYS_notify: |
| case SYS_self_notify: |
| case SYS_send_event: |
| case SYS_halt_core: |
| case SYS_pop_ctx: |
| case SYS_vmm_poke_guest: |
| case SYS_poke_ksched: |
| case SYS_llseek: |
| case SYS_close: |
| case SYS_fstat: |
| case SYS_stat: |
| case SYS_lstat: |
| case SYS_access: |
| case SYS_link: |
| case SYS_unlink: |
| case SYS_symlink: |
| case SYS_chdir: |
| case SYS_fchdir: |
| case SYS_mkdir: |
| case SYS_rmdir: |
| case SYS_tcgetattr: |
| case SYS_tcsetattr: |
| case SYS_setuid: |
| case SYS_setgid: |
| case SYS_rename: |
| case SYS_nunmount: |
| case SYS_fd2path: |
| return retval != 0; |
| case SYS_proc_create: |
| case SYS_change_vcore: |
| case SYS_fork: |
| case SYS_waitpid: |
| case SYS_shared_page_alloc: |
| case SYS_shared_page_free: |
| case SYS_provision: |
| case SYS_change_to_m: |
| case SYS_vmm_ctl: |
| case SYS_read: |
| case SYS_write: |
| case SYS_openat: |
| case SYS_fcntl: |
| case SYS_readlink: |
| case SYS_getcwd: |
| case SYS_nbind: |
| case SYS_nmount: |
| case SYS_wstat: |
| case SYS_fwstat: |
| return retval < 0; |
| case SYS_mmap: |
| return retval == -1; /* MAP_FAILED */ |
| case SYS_vmm_add_gpcs: |
| case SYS_populate_va: |
| case SYS_dup_fds_to: |
| case SYS_tap_fds: |
| return retval <= 0; |
| }; |
| return true; |
| } |
| |
| struct childfdmap { |
| unsigned int parentfd; |
| unsigned int childfd; |
| int ok; |
| }; |
| |
| struct argenv { |
| size_t argc; |
| size_t envc; |
| char buf[]; |
| /* The buf array is laid out as follows: |
| * buf { |
| * char *argv[argc]; // Offset of arg relative to &argbuf[0] |
| * char *envp[envc]; // Offset of envvar relative to &argbuf[0] |
| * char argbuf[sum(map(strlen + 1, argv + envp))]; |
| * } |
| */ |
| }; |
| |
| #ifndef ROS_KERNEL |
| |
| /* Temp hack, til the rest of glibc/userspace uses sys/syscall.h */ |
| #include <sys/syscall.h> |
| #endif /* ifndef ROS_KERNEL */ |