📄 syscall.c
字号:
/* 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, ¶m5, 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 + -