changeset deaf82fd2e7c in /z/repo/gem5 details: http://repo.gem5.org/gem5?cmd=changeset;node=deaf82fd2e7c description: syscall_emul: add support for x86 statfs system calls
diffstat: src/arch/x86/linux/linux.hh | 18 ++++++++++++++++++ src/arch/x86/linux/process.cc | 2 +- src/sim/syscall_emul.hh | 32 ++++++++++++++++++++++++++++++-- 3 files changed, 49 insertions(+), 3 deletions(-) diffs (110 lines): diff -r 104a404d426e -r deaf82fd2e7c src/arch/x86/linux/linux.hh --- a/src/arch/x86/linux/linux.hh Thu Dec 15 13:14:41 2016 -0500 +++ b/src/arch/x86/linux/linux.hh Thu Dec 15 13:16:03 2016 -0500 @@ -67,6 +67,24 @@ int64_t unused0[3]; } tgt_stat64; + typedef struct { + long val[2]; + } tgt_fsid; + + typedef struct { + long f_type; + long f_bsize; + long f_blocks; + long f_bfree; + long f_bavail; + long f_files; + long f_ffree; + tgt_fsid f_fsid; + long f_namelen; + long f_frsize; + long f_spare[5]; + } tgt_statfs; + static const int TGT_SIGHUP = 0x000001; static const int TGT_SIGINT = 0x000002; static const int TGT_SIGQUIT = 0x000003; diff -r 104a404d426e -r deaf82fd2e7c src/arch/x86/linux/process.cc --- a/src/arch/x86/linux/process.cc Thu Dec 15 13:14:41 2016 -0500 +++ b/src/arch/x86/linux/process.cc Thu Dec 15 13:16:03 2016 -0500 @@ -355,7 +355,7 @@ /* 134 */ SyscallDesc("uselib", unimplementedFunc), /* 135 */ SyscallDesc("personality", unimplementedFunc), /* 136 */ SyscallDesc("ustat", unimplementedFunc), - /* 137 */ SyscallDesc("statfs", unimplementedFunc), + /* 137 */ SyscallDesc("statfs", statfsFunc<X86Linux64>), /* 138 */ SyscallDesc("fstatfs", unimplementedFunc), /* 139 */ SyscallDesc("sysfs", unimplementedFunc), /* 140 */ SyscallDesc("getpriority", unimplementedFunc), diff -r 104a404d426e -r deaf82fd2e7c src/sim/syscall_emul.hh --- a/src/sim/syscall_emul.hh Thu Dec 15 13:14:41 2016 -0500 +++ b/src/sim/syscall_emul.hh Thu Dec 15 13:16:03 2016 -0500 @@ -62,6 +62,7 @@ #include <fcntl.h> #include <sys/mman.h> #include <sys/stat.h> +#include <sys/statfs.h> #include <sys/time.h> #include <sys/uio.h> #include <unistd.h> @@ -451,6 +452,7 @@ // ////////////////////////////////////////////////////////////////////// + typedef struct statfs hst_statfs; #if NO_STAT64 typedef struct stat hst_stat; typedef struct stat hst_stat64; @@ -556,6 +558,32 @@ tgt.copyOut(mem); } +template <class OS> +static void +copyOutStatfsBuf(SETranslatingPortProxy &mem, Addr addr, + hst_statfs *host) +{ + TypedBufferArg<typename OS::tgt_statfs> tgt(addr); + +#if defined(__OpenBSD__) || defined(__APPLE__) || defined(__FreeBSD__) + tgt->f_type = 0; +#else + tgt->f_type = TheISA::htog(host->f_type); +#endif + tgt->f_bsize = TheISA::htog(host->f_bsize); + tgt->f_blocks = TheISA::htog(host->f_blocks); + tgt->f_bfree = TheISA::htog(host->f_bfree); + tgt->f_bavail = TheISA::htog(host->f_bavail); + tgt->f_files = TheISA::htog(host->f_files); + tgt->f_ffree = TheISA::htog(host->f_ffree); + memcpy(&tgt->f_fsid, &host->f_fsid, sizeof(host->f_fsid)); + tgt->f_namelen = TheISA::htog(host->f_namelen); + tgt->f_frsize = TheISA::htog(host->f_frsize); + memcpy(&tgt->f_spare, &host->f_spare, sizeof(host->f_spare)); + + tgt.copyOut(mem); +} + /// Target ioctl() handler. For the most part, programs call ioctl() /// only to find out if their stdout is a tty, to determine whether to /// do line or block buffering. We always claim that output fds are @@ -1156,7 +1184,7 @@ if (result < 0) return -errno; - OS::copyOutStatfsBuf(tc->getMemProxy(), bufPtr, &hostBuf); + copyOutStatfsBuf<OS>(tc->getMemProxy(), bufPtr, &hostBuf); return 0; } @@ -1182,7 +1210,7 @@ if (result < 0) return -errno; - OS::copyOutStatfsBuf(tc->getMemProxy(), bufPtr, &hostBuf); + copyOutStatfsBuf<OS>(tc->getMemProxy(), bufPtr, &hostBuf); return 0; } _______________________________________________ gem5-dev mailing list gem5-dev@gem5.org http://m5sim.org/mailman/listinfo/gem5-dev