Hi Brandon, Could you have a look at this and come up with some form of solution so that gem5 compiles on BSD and OSX as well?
Thanks, Andreas On 22/12/2016, 10:30, "gem5-dev on behalf of Bjoern A. Zeeb" <[email protected] on behalf of [email protected]> wrote: >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.hhThu Dec 15 13:14:41 2016 -0500 >> +++ b/src/arch/x86/linux/linux.hhThu 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.ccThu Dec 15 13:14:41 2016 -0500 >> +++ b/src/arch/x86/linux/process.ccThu 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.hhThu Dec 15 13:14:41 2016 -0500 >> +++ b/src/sim/syscall_emul.hhThu 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 >> [email protected] >> http://m5sim.org/mailman/listinfo/gem5-dev >_______________________________________________ >gem5-dev mailing list >[email protected] >http://m5sim.org/mailman/listinfo/gem5-dev IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you. _______________________________________________ gem5-dev mailing list [email protected] http://m5sim.org/mailman/listinfo/gem5-dev
