On 15 Dec 2016, at 18:17, Brandon Potter wrote:
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
Does this compile on anything but Linux? statfs.h doesn’t exists
elsewhere I guess? statfs is historic and still more or less OS
specific.
Did you actually implement statfs, or is this statvfs as in
http://pubs.opengroup.org/onlinepubs/000095399/basedefs/sys/statvfs.h.html
? Not sure what the linux syscall does there?
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
_______________________________________________
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev