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

📄 syscall.c

📁 一个很有名的硬件模拟器。可以模拟CPU
💻 C
📖 第 1 页 / 共 5 页
字号:
		regs->regs_R[MD_REG_V0] = errno;		regs->regs_R[7] = 1;	      }	  }      }      break;#endif    case OSF_SYS_fstat:      {	struct osf_statbuf osf_sbuf;#ifdef _MSC_VER        struct _stat sbuf;#else /* !_MSC_VER */	struct stat sbuf;#endif /* _MSC_VER */	/* fstat() the file */	/*result*/regs->regs_R[MD_REG_V0] =	  fstat(/*fd*/regs->regs_R[MD_REG_A0], &sbuf);	/* check for an error condition */	if (regs->regs_R[MD_REG_V0] != (qword_t)-1)	  regs->regs_R[MD_REG_A3] = 0;	else /* got an error, return details */	  {	    regs->regs_R[MD_REG_A3] = -1;	    regs->regs_R[MD_REG_V0] = errno;	  }	/* translate the stat structure to host format */	osf_sbuf.osf_st_dev = MD_SWAPW(sbuf.st_dev);	osf_sbuf.osf_st_ino = MD_SWAPW(sbuf.st_ino);	osf_sbuf.osf_st_mode = MD_SWAPW(sbuf.st_mode);	osf_sbuf.osf_st_nlink = MD_SWAPH(sbuf.st_nlink);	osf_sbuf.osf_st_uid = MD_SWAPW(sbuf.st_uid);	osf_sbuf.osf_st_gid = MD_SWAPW(sbuf.st_gid);	osf_sbuf.osf_st_rdev = MD_SWAPW(sbuf.st_rdev);	osf_sbuf.osf_st_size = MD_SWAPQ(sbuf.st_size);	osf_sbuf.osf_st_atime = MD_SWAPW(sbuf.st_atime);	osf_sbuf.osf_st_mtime = MD_SWAPW(sbuf.st_mtime);	osf_sbuf.osf_st_ctime = MD_SWAPW(sbuf.st_ctime);#ifndef _MSC_VER	osf_sbuf.osf_st_blksize = MD_SWAPW(sbuf.st_blksize);	osf_sbuf.osf_st_blocks = MD_SWAPW(sbuf.st_blocks);#endif /* !_MSC_VER */	/* copy fstat() results to simulator memory */	mem_bcopy(mem_fn, mem, Write, /*sbuf*/regs->regs_R[MD_REG_A1],		  &osf_sbuf, sizeof(struct osf_statbuf));      }      break;    case OSF_SYS_getpagesize:      /* get target pagesize */      regs->regs_R[MD_REG_V0] = /* was: getpagesize() */MD_PAGE_SIZE;      /* check for an error condition */      if (regs->regs_R[MD_REG_V0] != (qword_t)-1)	regs->regs_R[MD_REG_A3] = 0;      else /* got an error, return details */	{	  regs->regs_R[MD_REG_A3] = -1;	  regs->regs_R[MD_REG_V0] = errno;	}      break;    case OSF_SYS_setitimer:      /* FIXME: the sigvec system call is ignored */      warn("syscall: setitimer ignored");      regs->regs_R[MD_REG_A3] = 0;      break;    case OSF_SYS_table:      {	qword_t table_id, table_index, buf_addr, num_elem, size_elem;	struct osf_tbl_sysinfo sysinfo;		table_id = regs->regs_R[MD_REG_A1];	table_index = regs->regs_R[MD_REG_A2];	buf_addr = regs->regs_R[MD_REG_A3];	num_elem = regs->regs_R[MD_REG_A4];	size_elem = regs->regs_R[MD_REG_A5];		switch(table_id)	{	case OSF_TBL_SYSINFO:	  if (table_index != 0)	    {	      panic("table: table id TBL_SYSINFO requires 0 index, got %08d",		    table_index );	    }	  else if (num_elem != 1)	    {	      panic("table: table id TBL_SYSINFO requires 1 elts, got %08d",		    num_elem );	    }	  else	    {	      struct rusage rusage_info;	      	      /* use getrusage() to determine user & system time */	      if (getrusage(RUSAGE_SELF, &rusage_info) < 0)		{		  /* abort the system call */		  regs->regs_R[MD_REG_A3] = -1;		  /* not kosher to pass off errno of getrusage() as errno		     of table(), but what the heck... */		  regs->regs_R[MD_REG_V0] = errno;		  break;		}	      	      /* use sysconf() to determine clock tick frequency */	      sysinfo.si_hz = sysconf(_SC_CLK_TCK);	      /* convert user and system time into clock ticks */	      sysinfo.si_user = rusage_info.ru_utime.tv_sec * sysinfo.si_hz + 		(rusage_info.ru_utime.tv_usec * sysinfo.si_hz) / 1000000UL;	      sysinfo.si_sys = rusage_info.ru_stime.tv_sec * sysinfo.si_hz + 		(rusage_info.ru_stime.tv_usec * sysinfo.si_hz) / 1000000UL;	      /* following can't be determined in a portable manner and		 are ignored */	      sysinfo.si_nice = 0;	      sysinfo.si_idle = 0;	      sysinfo.si_phz = 0;	      sysinfo.si_boottime = 0;	      sysinfo.wait = 0;	      /* copy structure into simulator memory */	      mem_bcopy(mem_fn, mem, Write, buf_addr,			&sysinfo, sizeof(struct osf_tbl_sysinfo));	      /* return success */	      regs->regs_R[MD_REG_A3] = 0;	    }	  break;	default:	  warn("table: unsupported table id %d requested, ignored", table_id);	  regs->regs_R[MD_REG_A3] = 0;	}      }      break;    case OSF_SYS_getdtablesize:#if defined(_AIX) || defined(__alpha)      /* get descriptor table size */      regs->regs_R[MD_REG_V0] = getdtablesize();      /* check for an error condition */      if (regs->regs_R[MD_REG_V0] != (qword_t)-1)	regs->regs_R[MD_REG_A3] = 0;      else /* got an error, return details */	{	  regs->regs_R[MD_REG_A3] = -1;	  regs->regs_R[MD_REG_V0] = errno;	}#elif defined(ultrix)      {	/* no comparable system call found, try some reasonable defaults */	warn("syscall: called getdtablesize\n");	regs->regs_R[MD_REG_V0] = 16;	regs->regs_R[MD_REG_A3] = 0;      }#elif defined(MIN_SYSCALL_MODE)      {	/* no comparable system call found, try some reasonable defaults */	warn("syscall: called getdtablesize\n");	regs->regs_R[MD_REG_V0] = 16;	regs->regs_R[MD_REG_A3] = 0;      }#else      {	struct rlimit rl;	/* get descriptor table size in rlimit structure */	if (getrlimit(RLIMIT_NOFILE, &rl) != (qword_t)-1)	  {	    regs->regs_R[MD_REG_V0] = rl.rlim_cur;	    regs->regs_R[MD_REG_A3] = 0;	  }	else /* got an error, return details */	  {	    regs->regs_R[MD_REG_A3] = -1;	    regs->regs_R[MD_REG_V0] = errno;	  }      }#endif      break;    case OSF_SYS_dup2:      /* dup2() the file descriptor */      regs->regs_R[MD_REG_V0] =	dup2(/*fd1*/regs->regs_R[MD_REG_A0], /*fd2*/regs->regs_R[MD_REG_A1]);      /* check for an error condition */      if (regs->regs_R[MD_REG_V0] != (qword_t)-1)	regs->regs_R[MD_REG_A3] = 0;      else /* got an error, return details */	{	  regs->regs_R[MD_REG_A3] = -1;	  regs->regs_R[MD_REG_V0] = errno;	}      break;    case OSF_SYS_fcntl:#ifdef _MSC_VER      warn("syscall fcntl() not yet implemented for MSC...");      regs->regs_R[MD_REG_A3] = 0;#else /* !_MSC_VER */      /* get fcntl() information on the file */      regs->regs_R[MD_REG_V0] =	fcntl(/*fd*/regs->regs_R[MD_REG_A0],	      /*cmd*/regs->regs_R[MD_REG_A1], /*arg*/regs->regs_R[MD_REG_A2]);      /* check for an error condition */      if (regs->regs_R[MD_REG_V0] != (qword_t)-1)	regs->regs_R[MD_REG_A3] = 0;      else /* got an error, return details */	{	  regs->regs_R[MD_REG_A3] = -1;	  regs->regs_R[MD_REG_V0] = errno;	}#endif /* _MSC_VER */      break;#if 0    case OSF_SYS_sigvec:      /* FIXME: the sigvec system call is ignored */      warn("syscall: sigvec ignored");      regs->regs_R[MD_REG_A3] = 0;      break;#endif#if 0    case OSF_SYS_sigblock:      /* FIXME: the sigblock system call is ignored */      warn("syscall: sigblock ignored");      regs->regs_R[MD_REG_A3] = 0;      break;#endif#if 0    case OSF_SYS_sigsetmask:      /* FIXME: the sigsetmask system call is ignored */      warn("syscall: sigsetmask ignored");      regs->regs_R[MD_REG_A3] = 0;      break;#endif    case OSF_SYS_gettimeofday:#ifdef _MSC_VER      warn("syscall gettimeofday() not yet implemented for MSC...");      regs->regs_R[MD_REG_A3] = 0;#else /* _MSC_VER */      {	struct osf_timeval osf_tv;	struct timeval tv, *tvp;	struct osf_timezone osf_tz;	struct timezone tz, *tzp;	if (/*timeval*/regs->regs_R[MD_REG_A0] != 0)	  {	    /* copy timeval into host memory */	    mem_bcopy(mem_fn, mem, Read, /*timeval*/regs->regs_R[MD_REG_A0],		      &osf_tv, sizeof(struct osf_timeval));	    /* convert target timeval structure to host format */	    tv.tv_sec = MD_SWAPW(osf_tv.osf_tv_sec);	    tv.tv_usec = MD_SWAPW(osf_tv.osf_tv_usec);	    tvp = &tv;	  }	else	  tvp = NULL;	if (/*timezone*/regs->regs_R[MD_REG_A1] != 0)	  {	    /* copy timezone into host memory */	    mem_bcopy(mem_fn, mem, Read, /*timezone*/regs->regs_R[MD_REG_A1],		      &osf_tz, sizeof(struct osf_timezone));	    /* convert target timezone structure to host format */	    tz.tz_minuteswest = MD_SWAPW(osf_tz.osf_tz_minuteswest);	    tz.tz_dsttime = MD_SWAPW(osf_tz.osf_tz_dsttime);	    tzp = &tz;	  }	else	  tzp = NULL;	/* get time of day */	/*result*/regs->regs_R[MD_REG_V0] = gettimeofday(tvp, tzp);	/* check for an error condition */	if (regs->regs_R[MD_REG_V0] != (qword_t)-1)	  regs->regs_R[MD_REG_A3] = 0;	else /* got an error, return details */	  {	    regs->regs_R[MD_REG_A3] = -1;	    regs->regs_R[MD_REG_V0] = errno;	  }	if (/*timeval*/regs->regs_R[MD_REG_A0] != 0)	  {	    /* convert host timeval structure to target format */	    osf_tv.osf_tv_sec = MD_SWAPW(tv.tv_sec);	    osf_tv.osf_tv_usec = MD_SWAPW(tv.tv_usec);	    /* copy timeval to target memory */	    mem_bcopy(mem_fn, mem, Write, /*timeval*/regs->regs_R[MD_REG_A0],		      &osf_tv, sizeof(struct osf_timeval));	  }	if (/*timezone*/regs->regs_R[MD_REG_A1] != 0)	  {	    /* convert host timezone structure to target format */	    osf_tz.osf_tz_minuteswest = MD_SWAPW(tz.tz_minuteswest);	    osf_tz.osf_tz_dsttime = MD_SWAPW(tz.tz_dsttime);	    /* copy timezone to target memory */	    mem_bcopy(mem_fn, mem, Write, /*timezone*/regs->regs_R[MD_REG_A1],		      &osf_tz, sizeof(struct osf_timezone));	  }      }#endif /* !_MSC_VER */      break;    case OSF_SYS_getrusage:#if defined(__svr4__) || defined(__USLC__) || defined(hpux) || defined(__hpux) || defined(_AIX)      {	struct tms tms_buf;	struct osf_rusage rusage;	/* get user and system times */	if (times(&tms_buf) != (qword_t)-1)	  {	    /* no error */	    regs->regs_R[MD_REG_V0] = 0;	    regs->regs_R[MD_REG_A3] = 0;	  }	else /* got an error, indicate result */	  {	    regs->regs_R[MD_REG_A3] = -1;	    regs->regs_R[MD_REG_V0] = errno;	  }	/* initialize target rusage result structure */#if defined(__svr4__)	memset(&rusage, '\0', sizeof(struct osf_rusage));#else /* !defined(__svr4__) */	bzero(&rusage, sizeof(struct osf_rusage));#endif	/* convert from host rusage structure to target format */	rusage.osf_ru_utime.osf_tv_sec = MD_SWAPW(tms_buf.tms_utime/CLK_TCK);	rusage.osf_ru_utime.osf_tv_sec =	  MD_SWAPW(rusage.osf_ru_utime.osf_tv_sec);	rusage.osf_ru_utime.osf_tv_usec = 0;	rusage.osf_ru_stime.osf_tv_sec = MD_SWAPW(tms_buf.tms_stime/CLK_TCK);	rusage.osf_ru_stime.osf_tv_sec =	  MD_SWAPW(rusage.osf_ru_stime.osf_tv_sec);	rusage.osf_ru_stime.osf_tv_usec = 0;	/* copy rusage results into target memory */	mem_bcopy(mem_fn, mem, Write, /*rusage*/regs->regs_R[MD_REG_A1],		  &rusage, sizeof(struct osf_rusage));      }#elif defined(__unix__)      {	struct rusage local_rusage;	struct osf_rusage rusage;	/* get rusage information */	/*result*/regs->regs_R[MD_REG_V0] =	  getrusage(/*who*/regs->regs_R[MD_REG_A0], &local_rusage);	/* check for an error condition */	if (regs->regs_R[MD_REG_V0] != (qword_t)-1)	  regs->regs_R[MD_REG_A3] = 0;	else /* got an error, return details */	  {	    regs->regs_R[MD_REG_A3] = -1;	    regs->regs_R[MD_REG_V0] = errno;	  }	/* convert from host rusage structure to target format */	rusage.osf_ru_utime.osf_tv_sec =	  MD_SWAPW(local_rusage.ru_utime.tv_sec);	rusage.osf_ru_utime.osf_tv_usec =	  MD_SWAPW(local_rusage.ru_utime.tv_usec);	rusage.osf_ru_utime.osf_tv_sec =	  MD_SWAPW(local_rusage.ru_utime.tv_sec);	rusage.osf_ru_utime.osf_tv_usec =	  MD_SWAPW(local_rusage.ru_utime.tv_usec);	rusage.osf_ru_stime.osf_tv_sec =	  MD_SWAPW(local_rusage.ru_stime.tv_sec);	rusage.osf_ru_stime.osf_tv_usec =	  MD_SWAPW(local_rusage.ru_stime.tv_usec);	rusage.osf_ru_stime.osf_tv_sec =	  MD_SWAPW(local_rusage.ru_stime.tv_sec);	rusage.osf_ru_stime.osf_tv_usec =	  MD_SWAPW(local_rusage.ru_stime.tv_usec);	rusage.osf_ru_maxrss = MD_SWAPW(local_rusage.ru_maxrss);	rusage.osf_ru_ixrss = MD_SWAPW(local_rusage.ru_ixrss);	rusage.osf_ru_idrss = MD_SWAPW(local_rusage.ru_idrss);	rusage.osf_ru_isrss = MD_SWAPW(local_rusage.ru_isrss);	rusage.osf_ru_minflt = MD_SWAPW(local_rusage.ru_minflt);	rusage.osf_ru_majflt = MD_SWAPW(local_rusage.ru_majflt);	rusage.osf_ru_nswap = MD_SWAPW(local_rusage.ru_nswap);	rusage.osf_ru_inblock = MD_SWAPW(local_rusage.ru_inblock);	rusage.osf_ru_oublock = MD_SWAPW(local_rusage.ru_oublock);	rusage.osf_ru_msgsnd = MD_SWAPW(local_rusage.ru_msgsnd);	rusage.osf_ru_msgrcv = MD_SWAPW(local_rusage.ru_msgrcv);	rusage.osf_ru_nsignals = MD_SWAPW(local_rusage.ru_nsignals);	rusage.osf_ru_nvcsw = MD_SWAPW(local_rusage.ru_nvcsw);	rusage.osf_ru_nivcsw = MD_SWAPW(local_rusage.ru_nivcsw);	/* copy rusage results into target memory */	mem_bcopy(mem_fn, mem, Write, /*rusage*/regs->regs_R[MD_REG_A1],		  &rusage, sizeof(struct osf_rusage));      }#elif /* defined(__CYGWIN32__) || */ defined(_MSC_VER)	    warn("syscall: called getrusage\n");            regs->regs_R[7] = 0;#else#error No getrusage() implementation!#endif      break;    case OSF_SYS_utimes:      {	char buf[MAXBUFSIZE];	/* copy filename to host memory */	mem_strcpy(mem_fn, mem, Read, /*fname*/regs->regs_R[MD_REG_A0], buf);	if (/*timeval*/regs->regs_R[MD_REG_A1] == 0)	  {#if defined(hpux) || defined(__hpux) || defined(linux)	    /* no utimes() in hpux, use utime() instead */	    /*result*/regs->regs_R[MD_REG_V0] = utime(buf, NULL);#elif defined(_MSC_VER)            /* no utimes() in MSC, use utime() instead */	    /*result*/regs->regs_R[MD_REG_V0] = utime(buf, NULL);#elif defined(__svr4__) || defined(__USLC__) || defined(unix) || defined(_AIX) || defined(__alpha)	    /*result*/regs->regs_R[MD_REG_V0] = utimes(buf, NULL);#elif defined(__CYGWIN32__)	    warn("syscall: called utimes\n");#else#error No utimes() implementation!#endif	  }	else	  {	    struct osf_timeval osf_tval[2];#ifndef _MSC_VER	    struct timeval tval[2];#endif /* !_MSC_VER */	    /* copy timeval structure to host memory */	    mem_bcopy(mem_fn, mem, Read, /*timeout*/regs->regs_R[MD_REG_A1],		      osf_tval, 2*sizeof(struct osf_timeval));#ifndef _MSC_VER	    /* convert timeval structure to host format */	    tval[0].tv_sec = MD_SWAPW(osf_tval[0].osf_tv_sec);	    tval[0].tv_usec = MD_SWAPW(osf_tval[0].osf_tv_usec);	    tval[1].tv_sec = MD_SWAPW(osf_tval[1].osf_tv_sec);	    tval[1].tv_usec = MD_SWAPW(osf_tval[1].osf_tv_usec);#end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -