⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 syscall.c

📁 一个很有名的硬件模拟器。可以模拟CPU
💻 C
📖 第 1 页 / 共 5 页
字号:
#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 + -