📄 syscall.c
字号:
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 + -