📄 syscall.c
字号:
#define OSF_SYS_lchown 208#define OSF_SYS_shmat 209#define OSF_SYS_shmctl 210#define OSF_SYS_shmdt 211#define OSF_SYS_shmget 212#define OSF_SYS_mvalid 213#define OSF_SYS_getaddressconf 214#define OSF_SYS_msleep 215#define OSF_SYS_mwakeup 216#define OSF_SYS_msync 217#define OSF_SYS_signal 218#define OSF_SYS_utc_gettime 219#define OSF_SYS_utc_adjtime 220#define OSF_SYS_security 222#define OSF_SYS_kloadcall 223#define OSF_SYS_getpgid 233#define OSF_SYS_getsid 234#define OSF_SYS_sigaltstack 235#define OSF_SYS_waitid 236#define OSF_SYS_priocntlset 237#define OSF_SYS_sigsendset 238#define OSF_SYS_set_speculative 239#define OSF_SYS_msfs_syscall 240#define OSF_SYS_sysinfo 241#define OSF_SYS_uadmin 242#define OSF_SYS_fuser 243#define OSF_SYS_proplist_syscall 244#define OSF_SYS_ntp_adjtime 245#define OSF_SYS_ntp_gettime 246#define OSF_SYS_pathconf 247#define OSF_SYS_fpathconf 248#define OSF_SYS_uswitch 250#define OSF_SYS_usleep_thread 251#define OSF_SYS_audcntl 252#define OSF_SYS_audgen 253#define OSF_SYS_sysfs 254#define OSF_SYS_subOSF_SYS_info 255#define OSF_SYS_getsysinfo 256#define OSF_SYS_setsysinfo 257#define OSF_SYS_afs_syscall 258#define OSF_SYS_swapctl 259#define OSF_SYS_memcntl 260#define OSF_SYS_fdatasync 261/* translate system call arguments */struct xlate_table_t{ int target_val; int host_val;};intxlate_arg(int target_val, struct xlate_table_t *map, int map_sz, char *name){ int i; for (i=0; i < map_sz; i++) { if (target_val == map[i].target_val) return map[i].host_val; } /* not found, issue warning and return target_val */ warn("could not translate argument for `%s': %d", name, target_val); return target_val;}/* internal system call buffer size, used primarily for file name arguments, argument larger than this will be truncated */#define MAXBUFSIZE 1024/* total bytes to copy from a valid pointer argument for ioctl() calls, syscall.c does not decode ioctl() calls to determine the size of the arguments that reside in memory, instead, the ioctl() proxy simply copies NUM_IOCTL_BYTES bytes from the pointer argument to host memory */#define NUM_IOCTL_BYTES 128/* OSF ioctl() requests */#define OSF_TIOCGETP 0x40067408#define OSF_FIONREAD 0x4004667f/* target stat() buffer definition, the host stat buffer format is automagically mapped to/from this format in syscall.c */struct osf_statbuf{ word_t osf_st_dev; word_t osf_st_ino; word_t osf_st_mode; half_t osf_st_nlink; half_t pad0; /* to match Alpha/AXP padding... */ word_t osf_st_uid; word_t osf_st_gid; word_t osf_st_rdev; word_t pad1; /* to match Alpha/AXP padding... */ qword_t osf_st_size; word_t osf_st_atime; word_t osf_st_spare1; word_t osf_st_mtime; word_t osf_st_spare2; word_t osf_st_ctime; word_t osf_st_spare3; word_t osf_st_blksize; word_t osf_st_blocks; word_t osf_st_gennum; word_t osf_st_spare4;};struct osf_sgttyb { byte_t sg_ispeed; /* input speed */ byte_t sg_ospeed; /* output speed */ byte_t sg_erase; /* erase character */ byte_t sg_kill; /* kill character */ shalf_t sg_flags; /* mode flags */};#define OSF_NSIG 32#define OSF_SIG_BLOCK 1#define OSF_SIG_UNBLOCK 2#define OSF_SIG_SETMASK 3struct osf_sigcontext { qword_t sc_onstack; /* sigstack state to restore */ qword_t sc_mask; /* signal mask to restore */ qword_t sc_pc; /* pc at time of signal */ qword_t sc_ps; /* psl to retore */ qword_t sc_regs[32]; /* processor regs 0 to 31 */ qword_t sc_ownedfp; /* fp has been used */ qword_t sc_fpregs[32]; /* fp regs 0 to 31 */ qword_t sc_fpcr; /* floating point control register */ qword_t sc_fp_control; /* software fpcr */};struct osf_statfs { shalf_t f_type; /* type of filesystem (see below) */ shalf_t f_flags; /* copy of mount flags */ word_t f_fsize; /* fundamental filesystem block size */ word_t f_bsize; /* optimal transfer block size */ word_t f_blocks; /* total data blocks in file system, */ /* note: may not represent fs size. */ word_t f_bfree; /* free blocks in fs */ word_t f_bavail; /* free blocks avail to non-su */ word_t f_files; /* total file nodes in file system */ word_t f_ffree; /* free file nodes in fs */ qword_t f_fsid; /* file system id */ word_t f_spare[9]; /* spare for later */};struct osf_timeval{ sword_t osf_tv_sec; /* seconds */ sword_t osf_tv_usec; /* microseconds */};struct osf_timezone{ sword_t osf_tz_minuteswest; /* minutes west of Greenwich */ sword_t osf_tz_dsttime; /* type of dst correction */};/* target getrusage() buffer definition, the host stat buffer format is automagically mapped to/from this format in syscall.c */struct osf_rusage{ struct osf_timeval osf_ru_utime; struct osf_timeval osf_ru_stime; sword_t osf_ru_maxrss; sword_t osf_ru_ixrss; sword_t osf_ru_idrss; sword_t osf_ru_isrss; sword_t osf_ru_minflt; sword_t osf_ru_majflt; sword_t osf_ru_nswap; sword_t osf_ru_inblock; sword_t osf_ru_oublock; sword_t osf_ru_msgsnd; sword_t osf_ru_msgrcv; sword_t osf_ru_nsignals; sword_t osf_ru_nvcsw; sword_t osf_ru_nivcsw;};struct osf_rlimit{ qword_t osf_rlim_cur; /* current (soft) limit */ qword_t osf_rlim_max; /* maximum value for rlim_cur */};struct osf_sockaddr{ half_t sa_family; /* address family, AF_xxx */ byte_t sa_data[24]; /* 14 bytes of protocol address */};struct osf_iovec{ md_addr_t iov_base; /* starting address */ word_t iov_len; /* length in bytes */ word_t pad;};/* returns size of DIRENT structure */#define OSF_DIRENT_SZ(STR) \ (sizeof(word_t) + 2*sizeof(half_t) + (((strlen(STR) + 1) + 3)/4)*4) /* was: (sizeof(word_t) + 2*sizeof(half_t) + strlen(STR) + 1) */struct osf_dirent{ word_t d_ino; /* file number of entry */ half_t d_reclen; /* length of this record */ half_t d_namlen; /* length of string in d_name */ char d_name[256]; /* DUMMY NAME LENGTH */ /* the real maximum length is */ /* returned by pathconf() */ /* At this time, this MUST */ /* be 256 -- the kernel */ /* requires it */};/* open(2) flags for Alpha/AXP OSF target, syscall.c automagically maps between these codes to/from host open(2) flags */#define OSF_O_RDONLY 0x0000#define OSF_O_WRONLY 0x0001#define OSF_O_RDWR 0x0002#define OSF_O_NONBLOCK 0x0004#define OSF_O_APPEND 0x0008#define OSF_O_CREAT 0x0200#define OSF_O_TRUNC 0x0400#define OSF_O_EXCL 0x0800#define OSF_O_NOCTTY 0x1000#define OSF_O_SYNC 0x4000/* open(2) flags translation table for SimpleScalar target */struct { int osf_flag; int local_flag;} osf_flag_table[] = { /* target flag */ /* host flag */#ifdef _MSC_VER { OSF_O_RDONLY, _O_RDONLY }, { OSF_O_WRONLY, _O_WRONLY }, { OSF_O_RDWR, _O_RDWR }, { OSF_O_APPEND, _O_APPEND }, { OSF_O_CREAT, _O_CREAT }, { OSF_O_TRUNC, _O_TRUNC }, { OSF_O_EXCL, _O_EXCL },#ifdef _O_NONBLOCK { OSF_O_NONBLOCK, _O_NONBLOCK },#endif#ifdef _O_NOCTTY { OSF_O_NOCTTY, _O_NOCTTY },#endif#ifdef _O_SYNC { OSF_O_SYNC, _O_SYNC },#endif#else /* !_MSC_VER */ { OSF_O_RDONLY, O_RDONLY }, { OSF_O_WRONLY, O_WRONLY }, { OSF_O_RDWR, O_RDWR }, { OSF_O_APPEND, O_APPEND }, { OSF_O_CREAT, O_CREAT }, { OSF_O_TRUNC, O_TRUNC }, { OSF_O_EXCL, O_EXCL }, { OSF_O_NONBLOCK, O_NONBLOCK }, { OSF_O_NOCTTY, O_NOCTTY },#ifdef O_SYNC { OSF_O_SYNC, O_SYNC },#endif#endif /* _MSC_VER */};#define OSF_NFLAGS (sizeof(osf_flag_table)/sizeof(osf_flag_table[0]))qword_t sigmask = 0;qword_t sigaction_array[OSF_NSIG] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};/* setsockopt option names */#define OSF_SO_DEBUG 0x0001#define OSF_SO_ACCEPTCONN 0x0002#define OSF_SO_REUSEADDR 0x0004#define OSF_SO_KEEPALIVE 0x0008#define OSF_SO_DONTROUTE 0x0010#define OSF_SO_BROADCAST 0x0020#define OSF_SO_USELOOPBACK 0x0040#define OSF_SO_LINGER 0x0080#define OSF_SO_OOBINLINE 0x0100#define OSF_SO_REUSEPORT 0x0200struct xlate_table_t sockopt_map[] ={ { OSF_SO_DEBUG, SO_DEBUG },#ifdef SO_ACCEPTCONN { OSF_SO_ACCEPTCONN, SO_ACCEPTCONN },#endif { OSF_SO_REUSEADDR, SO_REUSEADDR }, { OSF_SO_KEEPALIVE, SO_KEEPALIVE }, { OSF_SO_DONTROUTE, SO_DONTROUTE }, { OSF_SO_BROADCAST, SO_BROADCAST },#ifdef SO_USELOOPBACK { OSF_SO_USELOOPBACK, SO_USELOOPBACK },#endif { OSF_SO_LINGER, SO_LINGER }, { OSF_SO_OOBINLINE, SO_OOBINLINE },#ifdef SO_REUSEPORT { OSF_SO_REUSEPORT, SO_REUSEPORT }#endif};/* setsockopt TCP options */#define OSF_TCP_NODELAY 0x01 /* don't delay send to coalesce packets */#define OSF_TCP_MAXSEG 0x02 /* maximum segment size */#define OSF_TCP_RPTR2RXT 0x03 /* set repeat count for R2 RXT timer */#define OSF_TCP_KEEPIDLE 0x04 /* secs before initial keepalive probe */#define OSF_TCP_KEEPINTVL 0x05 /* seconds between keepalive probes */#define OSF_TCP_KEEPCNT 0x06 /* num of keepalive probes before drop */#define OSF_TCP_KEEPINIT 0x07 /* initial connect timeout (seconds) */#define OSF_TCP_PUSH 0x08 /* set push bit in outbnd data packets */#define OSF_TCP_NODELACK 0x09 /* don't delay send to coalesce packets */struct xlate_table_t tcpopt_map[] ={ { OSF_TCP_NODELAY, TCP_NODELAY }, { OSF_TCP_MAXSEG, TCP_MAXSEG },#ifdef TCP_RPTR2RXT { OSF_TCP_RPTR2RXT, TCP_RPTR2RXT },#endif#ifdef TCP_KEEPIDLE { OSF_TCP_KEEPIDLE, TCP_KEEPIDLE },#endif#ifdef TCP_KEEPINTVL { OSF_TCP_KEEPINTVL, TCP_KEEPINTVL },#endif#ifdef TCP_KEEPCNT { OSF_TCP_KEEPCNT, TCP_KEEPCNT },#endif#ifdef TCP_KEEPINIT { OSF_TCP_KEEPINIT, TCP_KEEPINIT },#endif#ifdef TCP_PUSH { OSF_TCP_PUSH, TCP_PUSH },#endif#ifdef TCP_NODELACK { OSF_TCP_NODELACK, TCP_NODELACK }#endif};/* setsockopt level names */#define OSF_SOL_SOCKET 0xffff /* options for socket level */#define OSF_SOL_IP 0 /* dummy for IP */#define OSF_SOL_TCP 6 /* tcp */#define OSF_SOL_UDP 17 /* user datagram protocol */struct xlate_table_t socklevel_map[] ={#if defined(__svr4__) || defined(__osf__) { OSF_SOL_SOCKET, SOL_SOCKET }, { OSF_SOL_IP, IPPROTO_IP }, { OSF_SOL_TCP, IPPROTO_TCP }, { OSF_SOL_UDP, IPPROTO_UDP }#else { OSF_SOL_SOCKET, SOL_SOCKET }, { OSF_SOL_IP, SOL_IP }, { OSF_SOL_TCP, SOL_TCP }, { OSF_SOL_UDP, SOL_UDP }#endif};/* socket() address families */#define OSF_AF_UNSPEC 0#define OSF_AF_UNIX 1 /* Unix domain sockets */#define OSF_AF_INET 2 /* internet IP protocol */#define OSF_AF_IMPLINK 3 /* arpanet imp addresses */#define OSF_AF_PUP 4 /* pup protocols: e.g. BSP */#define OSF_AF_CHAOS 5 /* mit CHAOS protocols */#define OSF_AF_NS 6 /* XEROX NS protocols */#define OSF_AF_ISO 7 /* ISO protocols */struct xlate_table_t family_map[] ={ { OSF_AF_UNSPEC, AF_UNSPEC }, { OSF_AF_UNIX, AF_UNIX }, { OSF_AF_INET, AF_INET },#ifdef AF_IMPLINK { OSF_AF_IMPLINK, AF_IMPLINK },#endif#ifdef AF_PUP { OSF_AF_PUP, AF_PUP },#endif#ifdef AF_CHAOS { OSF_AF_CHAOS, AF_CHAOS },#endif#ifdef AF_NS { OSF_AF_NS, AF_NS },#endif#ifdef AF_ISO { OSF_AF_ISO, AF_ISO }#endif};/* socket() socket types */#define OSF_SOCK_STREAM 1 /* stream (connection) socket */#define OSF_SOCK_DGRAM 2 /* datagram (conn.less) socket */#define OSF_SOCK_RAW 3 /* raw socket */#define OSF_SOCK_RDM 4 /* reliably-delivered message */#define OSF_SOCK_SEQPACKET 5 /* sequential packet socket */struct xlate_table_t socktype_map[] ={ { OSF_SOCK_STREAM, SOCK_STREAM }, { OSF_SOCK_DGRAM, SOCK_DGRAM }, { OSF_SOCK_RAW, SOCK_RAW }, { OSF_SOCK_RDM, SOCK_RDM }, { OSF_SOCK_SEQPACKET, SOCK_SEQPACKET }};/* OSF table() call. Right now, we only support TBL_SYSINFO queries */#define OSF_TBL_SYSINFO 12struct osf_tbl_sysinfo { long si_user; /* user time */ long si_nice; /* nice time */ long si_sys; /* system time */ long si_idle; /* idle time */ long si_hz; long si_phz; long si_boottime; /* boot time in seconds */ long wait; /* wait time */};/* OSF SYSCALL -- standard system call sequence the kernel expects arguments to be passed with the normal C calling sequence; v0 should contain the system call number; on return from the kernel mode, a3 will be 0 to indicate no error and non-zero to indicate an error; if an error occurred v0 will contain an errno; if the kernel return an error, setup a valid gp and jmp to _cerror *//* syscall proxy handler, architect registers and memory are assumed to be precise when this function is called, register and memory are updated with the results of the sustem call */voidsys_syscall(struct regs_t *regs, /* registers to access */ mem_access_fn mem_fn, /* generic memory accessor */ struct mem_t *mem, /* memory space to access */ md_inst_t inst, /* system call inst */ int traceable) /* traceable system call? */{ qword_t syscode = regs->regs_R[MD_REG_V0]; /* fix for syscall() which uses CALL_PAL CALLSYS for making system calls */ if (syscode == OSF_SYS_syscall) syscode = regs->regs_R[MD_REG_A0]; /* first, check if an EIO trace is being consumed... */ if (traceable && sim_eio_fd != NULL) { eio_read_trace(sim_eio_fd, sim_num_insn, regs, mem_fn, mem, inst); /* kludge fix for sigreturn(), it modifies all registers */ if (syscode == OSF_SYS_sigreturn) { int i; struct osf_sigcontext sc; md_addr_t sc_addr = regs->regs_R[MD_REG_A0]; mem_bcopy(mem_fn, mem, Read, sc_addr, &sc, sizeof(struct osf_sigcontext)); regs->regs_NPC = sc.sc_pc; for (i=0; i < 32; ++i)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -