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

📄 syscall.c

📁 一个很有名的硬件模拟器。可以模拟CPU
💻 C
📖 第 1 页 / 共 4 页
字号:
	    /* got an error, return details */	    regs->regs_R[2] = errno;	    regs->regs_R[7] = 1;	  }      }      break;    case SS_SYS_stat:    case SS_SYS_lstat:      {	char buf[MAXBUFSIZE];	struct ss_statbuf ss_sbuf;#ifdef _MSC_VER	struct _stat sbuf;#else /* !_MSC_VER */	struct stat sbuf;#endif /* _MSC_VER */	/* copy filename to host memory */	mem_strcpy(mem_fn, mem, Read, /*fName*/regs->regs_R[4], buf);	/* stat() the file */	if (syscode == SS_SYS_stat)	  /*result*/regs->regs_R[2] = stat(buf, &sbuf);	else /* syscode == SS_SYS_lstat */	  {#ifdef _MSC_VER	    warn("syscall lstat() not yet implemented for MSC...");	    regs->regs_R[7] = 0;	    break;#else /* !_MSC_VER */	    /*result*/regs->regs_R[2] = lstat(buf, &sbuf);#endif /* _MSC_VER */	  }	/* check for an error condition */	if (regs->regs_R[2] != -1)	  regs->regs_R[7] = 0;	else	  {	    /* got an error, return details */	    regs->regs_R[2] = errno;	    regs->regs_R[7] = 1;	  }	/* translate from host stat structure to target format */	ss_sbuf.ss_st_dev = MD_SWAPH(sbuf.st_dev);	ss_sbuf.ss_pad = 0;	ss_sbuf.ss_st_ino = MD_SWAPW(sbuf.st_ino);	ss_sbuf.ss_st_mode = MD_SWAPH(sbuf.st_mode);	ss_sbuf.ss_st_nlink = MD_SWAPH(sbuf.st_nlink);	ss_sbuf.ss_st_uid = MD_SWAPH(sbuf.st_uid);	ss_sbuf.ss_st_gid = MD_SWAPH(sbuf.st_gid);	ss_sbuf.ss_st_rdev = MD_SWAPH(sbuf.st_rdev);	ss_sbuf.ss_pad1 = 0;	ss_sbuf.ss_st_size = MD_SWAPW(sbuf.st_size);	ss_sbuf.ss_st_atime = MD_SWAPW(sbuf.st_atime);	ss_sbuf.ss_st_spare1 = 0;	ss_sbuf.ss_st_mtime = MD_SWAPW(sbuf.st_mtime);	ss_sbuf.ss_st_spare2 = 0;	ss_sbuf.ss_st_ctime = MD_SWAPW(sbuf.st_ctime);	ss_sbuf.ss_st_spare3 = 0;#ifndef _MSC_VER	ss_sbuf.ss_st_blksize = MD_SWAPW(sbuf.st_blksize);	ss_sbuf.ss_st_blocks = MD_SWAPW(sbuf.st_blocks);#endif /* !_MSC_VER */	ss_sbuf.ss_st_gennum = 0;	ss_sbuf.ss_st_spare4 = 0;	/* copy stat() results to simulator memory */	mem_bcopy(mem_fn, mem, Write, /*sbuf*/regs->regs_R[5],		  &ss_sbuf, sizeof(struct ss_statbuf));      }      break;    case SS_SYS_dup:      /* dup() the file descriptor */      /*fd*/regs->regs_R[2] = dup(/*fd*/regs->regs_R[4]);      /* check for an error condition */      if (regs->regs_R[2] != -1)	regs->regs_R[7] = 0;      else	{	  /* got an error, return details */	  regs->regs_R[2] = errno;	  regs->regs_R[7] = 1;	}      break;#ifndef _MSC_VER    case SS_SYS_pipe:      {	int fd[2];	/* copy pipe descriptors to host memory */;	mem_bcopy(mem_fn, mem, Read, /*fd's*/regs->regs_R[4], fd, sizeof(fd));	/* create a pipe */	/*result*/regs->regs_R[7] = pipe(fd);	/* copy descriptor results to result registers */	/*pipe1*/regs->regs_R[2] = fd[0];	/*pipe 2*/regs->regs_R[3] = fd[1];	/* check for an error condition */	if (regs->regs_R[7] == -1)	  {	    regs->regs_R[2] = errno;	    regs->regs_R[7] = 1;	  }      }      break;#endif    case SS_SYS_getgid:#ifdef _MSC_VER      warn("syscall getgid() not yet implemented for MSC...");      regs->regs_R[7] = 0;#else /* !_MSC_VER */      /* get current group id */      /*first result*/regs->regs_R[2] = getgid();      /* get current effective group id */      /*second result*/regs->regs_R[3] = getegid();	/* check for an error condition */      if (regs->regs_R[2] != -1)	regs->regs_R[7] = 0;      else	{	  /* got an error, return details */	  regs->regs_R[2] = errno;	  regs->regs_R[7] = 1;	}#endif /* _MSC_VER */      break;    case SS_SYS_ioctl:      {	char buf[NUM_IOCTL_BYTES];	int local_req = 0;	/* convert target ioctl() request to host ioctl() request values */	switch (/*req*/regs->regs_R[5]) {#ifdef TIOCGETP	case SS_IOCTL_TIOCGETP:	  local_req = TIOCGETP;	  break;#endif#ifdef TIOCSETP	case SS_IOCTL_TIOCSETP:	  local_req = TIOCSETP;	  break;#endif#ifdef TIOCGETP	case SS_IOCTL_TCGETP:	  local_req = TIOCGETP;	  break;#endif#ifdef TCGETA	case SS_IOCTL_TCGETA:	  local_req = TCGETA;	  break;#endif#ifdef TIOCGLTC	case SS_IOCTL_TIOCGLTC:	  local_req = TIOCGLTC;	  break;#endif#ifdef TIOCSLTC	case SS_IOCTL_TIOCSLTC:	  local_req = TIOCSLTC;	  break;#endif#ifdef TIOCGWINSZ	case SS_IOCTL_TIOCGWINSZ:	  local_req = TIOCGWINSZ;	  break;#endif#ifdef TCSETAW	case SS_IOCTL_TCSETAW:	  local_req = TCSETAW;	  break;#endif#ifdef TIOCGETC	case SS_IOCTL_TIOCGETC:	  local_req = TIOCGETC;	  break;#endif#ifdef TIOCSETC	case SS_IOCTL_TIOCSETC:	  local_req = TIOCSETC;	  break;#endif#ifdef TIOCLBIC	case SS_IOCTL_TIOCLBIC:	  local_req = TIOCLBIC;	  break;#endif#ifdef TIOCLBIS	case SS_IOCTL_TIOCLBIS:	  local_req = TIOCLBIS;	  break;#endif#ifdef TIOCLGET	case SS_IOCTL_TIOCLGET:	  local_req = TIOCLGET;	  break;#endif#ifdef TIOCLSET	case SS_IOCTL_TIOCLSET:	  local_req = TIOCLSET;	  break;#endif	}#if !defined(TIOCGETP) && (defined(linux) || defined(__CYGWIN32__))        if (!local_req && /*req*/regs->regs_R[5] == SS_IOCTL_TIOCGETP)          {            struct termios lbuf;            struct ss_sgttyb buf;            /* result */regs->regs_R[2] =                          tcgetattr(/* fd */(int)regs->regs_R[4], &lbuf);            /* translate results */            buf.sg_ispeed = lbuf.c_ispeed;            buf.sg_ospeed = lbuf.c_ospeed;            buf.sg_erase = lbuf.c_cc[VERASE];            buf.sg_kill = lbuf.c_cc[VKILL];            buf.sg_flags = 0;   /* FIXME: this is wrong... */            mem_bcopy(mem_fn, mem, Write,                      /* buf */regs->regs_R[6], &buf,                      sizeof(struct ss_sgttyb));            if (regs->regs_R[2] != -1)              regs->regs_R[7] = 0;            else /* probably not a typewriter, return details */              {                regs->regs_R[2] = errno;                regs->regs_R[7] = 1;              }          }        else#endif	if (!local_req)	  {	    /* FIXME: could not translate the ioctl() request, just warn user	       and ignore the request */	    warn("syscall: ioctl: ioctl code not supported d=%d, req=%d",		 regs->regs_R[4], regs->regs_R[5]);	    regs->regs_R[2] = 0;	    regs->regs_R[7] = 0;	  }	else	  {#ifdef _MSC_VER	    warn("syscall getgid() not yet implemented for MSC...");	    regs->regs_R[7] = 0;	    break;#else /* !_MSC_VER */#if 0 /* FIXME: needed? */#ifdef TIOCGETP	    if (local_req == TIOCGETP && sim_progfd)	      {		/* program I/O has been redirected to file, make		   termios() calls fail... */		/* got an error, return details */		regs->regs_R[2] = ENOTTY;		regs->regs_R[7] = 1;		break;	      }#endif#endif	    /* ioctl() code was successfully translated to a host code */	    /* if arg ptr exists, copy NUM_IOCTL_BYTES bytes to host mem */	    if (/*argp*/regs->regs_R[6] != 0)	      mem_bcopy(mem_fn, mem,			Read, /*argp*/regs->regs_R[6], buf, NUM_IOCTL_BYTES);	    /* perform the ioctl() call */	    /*result*/regs->regs_R[2] =	      ioctl(/*fd*/regs->regs_R[4], local_req, buf);	    /* if arg ptr exists, copy NUM_IOCTL_BYTES bytes from host mem */	    if (/*argp*/regs->regs_R[6] != 0)	      mem_bcopy(mem_fn, mem, Write, regs->regs_R[6],			buf, NUM_IOCTL_BYTES);	    /* check for an error condition */	    if (regs->regs_R[2] != -1)	      regs->regs_R[7] = 0;	    else	      {			/* got an error, return details */		regs->regs_R[2] = errno;		regs->regs_R[7] = 1;	      }#endif /* _MSC_VER */	  }      }      break;    case SS_SYS_fstat:      {	struct ss_statbuf ss_sbuf;#ifdef _MSC_VER	struct _stat sbuf;#else /* !_MSC_VER */	struct stat sbuf;#endif /* _MSC_VER */	/* fstat() the file */	/*result*/regs->regs_R[2] = fstat(/*fd*/regs->regs_R[4], &sbuf);	/* check for an error condition */	if (regs->regs_R[2] != -1)	  regs->regs_R[7] = 0;	else	  {	    /* got an error, return details */	    regs->regs_R[2] = errno;	    regs->regs_R[7] = 1;	  }	/* translate the stat structure to host format */	ss_sbuf.ss_st_dev = MD_SWAPH(sbuf.st_dev);	ss_sbuf.ss_pad = 0;	ss_sbuf.ss_st_ino = MD_SWAPW(sbuf.st_ino);	ss_sbuf.ss_st_mode = MD_SWAPH(sbuf.st_mode);	ss_sbuf.ss_st_nlink = MD_SWAPH(sbuf.st_nlink);	ss_sbuf.ss_st_uid = MD_SWAPH(sbuf.st_uid);	ss_sbuf.ss_st_gid = MD_SWAPH(sbuf.st_gid);	ss_sbuf.ss_st_rdev = MD_SWAPH(sbuf.st_rdev);	ss_sbuf.ss_pad1 = 0;	ss_sbuf.ss_st_size = MD_SWAPW(sbuf.st_size);	ss_sbuf.ss_st_atime = MD_SWAPW(sbuf.st_atime);        ss_sbuf.ss_st_spare1 = 0;	ss_sbuf.ss_st_mtime = MD_SWAPW(sbuf.st_mtime);        ss_sbuf.ss_st_spare2 = 0;	ss_sbuf.ss_st_ctime = MD_SWAPW(sbuf.st_ctime);        ss_sbuf.ss_st_spare3 = 0;#ifndef _MSC_VER	ss_sbuf.ss_st_blksize = MD_SWAPW(sbuf.st_blksize);	ss_sbuf.ss_st_blocks = MD_SWAPW(sbuf.st_blocks);#endif /* !_MSC_VER */        ss_sbuf.ss_st_gennum = 0;        ss_sbuf.ss_st_spare4 = 0;	/* copy fstat() results to simulator memory */	mem_bcopy(mem_fn, mem, Write, /*sbuf*/regs->regs_R[5],		  &ss_sbuf, sizeof(struct ss_statbuf));      }      break;    case SS_SYS_getpagesize:      /* get target pagesize */      regs->regs_R[2] = /* was: getpagesize() */MD_PAGE_SIZE;      /* check for an error condition */      if (regs->regs_R[2] != -1)	regs->regs_R[7] = 0;      else	{	  /* got an error, return details */	  regs->regs_R[2] = errno;	  regs->regs_R[7] = 1;	}      break;    case SS_SYS_setitimer:      /* FIXME: the sigvec system call is ignored */      regs->regs_R[2] = regs->regs_R[7] = 0;      warn("syscall: setitimer ignored");      break;    case SS_SYS_getdtablesize:#if defined(_AIX)      /* get descriptor table size */      regs->regs_R[2] = getdtablesize();      /* check for an error condition */      if (regs->regs_R[2] != -1)	regs->regs_R[7] = 0;      else	{	  /* got an error, return details */	  regs->regs_R[2] = errno;	  regs->regs_R[7] = 1;	}#elif defined(__CYGWIN32__) || defined(ultrix) || defined(_MSC_VER)      {	/* no comparable system call found, try some reasonable defaults */	warn("syscall: called getdtablesize()\n");	regs->regs_R[2] = 16;	regs->regs_R[7] = 0;      }#else      {	struct rlimit rl;	/* get descriptor table size in rlimit structure */	if (getrlimit(RLIMIT_NOFILE, &rl) != -1)	  {	    regs->regs_R[2] = rl.rlim_cur;	    regs->regs_R[7] = 0;	  }	else	  {	    /* got an error, return details */	    regs->regs_R[2] = errno;	    regs->regs_R[7] = 1;	  }      }#endif      break;    case SS_SYS_dup2:      /* dup2() the file descriptor */      regs->regs_R[2] =	dup2(/* fd1 */regs->regs_R[4], /* fd2 */regs->regs_R[5]);      /* check for an error condition */      if (regs->regs_R[2] != -1)	regs->regs_R[7] = 0;      else	{	  /* got an error, return details */	  regs->regs_R[2] = errno;	  regs->regs_R[7] = 1;	}      break;    case SS_SYS_fcntl:#ifdef _MSC_VER      warn("syscall fcntl() not yet implemented for MSC...");      regs->regs_R[7] = 0;#else /* !_MSC_VER */      /* get fcntl() information on the file */      regs->regs_R[2] =	fcntl(/*fd*/regs->regs_R[4], /*cmd*/regs->regs_R[5],	      /*arg*/regs->regs_R[6]);      /* check for an error condition */      if (regs->regs_R[2] != -1)	regs->regs_R[7] = 0;      else	{	  /* got an error, return details */	  regs->regs_R[2] = errno;	  regs->regs_R[7] = 1;	}#endif /* _MSC_VER */      break;    case SS_SYS_select:#ifdef _MSC_VER      warn("syscall select() not yet implemented for MSC...");      regs->regs_R[7] = 0;#else /* !_MSC_VER */      {	fd_set readfd, writefd, exceptfd;	fd_set *readfdp, *writefdp, *exceptfdp;	struct timeval timeout, *timeoutp;	word_t param5;	/* FIXME: swap words? */	/* read the 5th parameter (timeout) from the stack */	mem_bcopy(mem_fn, mem,		  Read, regs->regs_R[29]+16, &param5, sizeof(word_t));	/* copy read file descriptor set into host memory */	if (/*readfd*/regs->regs_R[5] != 0)	  {	    mem_bcopy(mem_fn, mem, Read, /*readfd*/regs->regs_R[5],		      &readfd, sizeof(fd_set));	    readfdp = &readfd;	  }	else	  readfdp = NULL;	/* copy write file descriptor set into host memory */	if (/*writefd*/regs->regs_R[6] != 0)	  {	    mem_bcopy(mem_fn, mem, Read, /*writefd*/regs->regs_R[6],		      &writefd, sizeof(fd_set));	    writefdp = &writefd;	  }	else	  writefdp = NULL;	/* copy exception file descriptor set into host memory */	if (/*exceptfd*/regs->regs_R[7] != 0)	  {	    mem_bcopy(mem_fn, mem, Read, /*exceptfd*/regs->regs_R[7],		      &exceptfd, sizeof(fd_set));	    exceptfdp = &exceptfd;	  }	else	  exceptfdp = NULL;	/* copy timeout value into host memory */

⌨️ 快捷键说明

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