41,47c41
< #include <dirent.h>
< #include <errno.h>
< #include <fcntl.h> // for host open() flags
< #include <string.h> // for memset()
< #include <sys/stat.h>
< #include <sys/types.h>
< #include <unistd.h>
---
> #include <inttypes.h>
49,50c43
< #include "arch/isa_traits.hh"
< #include "sim/syscall_emul.hh"
---
> #include "kern/operatingsystem.hh"
59c52,53
< class Solaris {
---
> class Solaris : public OperatingSystem
> {
65c59
< typedef uint64_t size_t;
---
> /* typedef uint64_t size_t;
74c68
< typedef uint32_t nlink_t;
---
> typedef uint32_t nlink_t;*/
77,83d70
< #if NO_STAT64
< typedef struct stat hst_stat;
< typedef struct stat hst_stat64;
< #else
< typedef struct stat hst_stat ;
< typedef struct stat64 hst_stat64;
< #endif
91c78
< struct tgt_stat {
---
> typedef struct {
100,102c87,90
< struct tgt_timespec st_atimeX; //!< time of last access
< struct tgt_timespec st_mtimeX; //!< time of last modification
< struct tgt_timespec st_ctimeX; //!< time of last status change
---
> //struct tgt_timespec st_atimeX; //!< time of last access
> //struct tgt_timespec st_mtimeX; //!< time of last modification
> //struct tgt_timespec st_ctimeX; //!< time of last status change
> int64_t st_atimeX, st_mtimeX, st_ctimeX;
106c94
< };
---
> } tgt_stat;
109c97
< struct tgt_stat64 {
---
> typedef struct {
118,120c106,109
< struct tgt_timespec st_atimeX; //!< time of last access
< struct tgt_timespec st_mtimeX; //!< time of last modification
< struct tgt_timespec st_ctimeX; //!< time of last status change
---
> //struct tgt_timespec st_atimeX; //!< time of last access
> //struct tgt_timespec st_mtimeX; //!< time of last modification
> //struct tgt_timespec st_ctimeX; //!< time of last status change
> int64_t st_atimeX, st_mtimeX, st_ctimeX;
124c113
< };
---
> } tgt_stat64;
130c119
< struct utsname {
---
> typedef struct utsname {
136c125
< };
---
> } utsname;
138,300d126
< /// Limit struct for getrlimit/setrlimit.
< struct rlimit {
< uint64_t rlim_cur; //!< soft limit
< uint64_t rlim_max; //!< hard limit
< };
<
< /// For gettimeofday().
< struct timeval {
< int64_t tv_sec; //!< seconds
< int64_t tv_usec; //!< microseconds
< };
<
< // For writev/readv
< struct tgt_iovec {
< uint64_t iov_base; // void *
< uint64_t iov_len;
< };
<
<
< /// For getrusage().
< struct rusage {
< struct timeval ru_utime; //!< user time used
< struct timeval ru_stime; //!< system time used
< int64_t ru_maxrss; //!< max rss
< int64_t ru_ixrss; //!< integral shared memory size
< int64_t ru_idrss; //!< integral unshared data "
< int64_t ru_isrss; //!< integral unshared stack "
< int64_t ru_minflt; //!< page reclaims - total vmfaults
< int64_t ru_majflt; //!< page faults
< int64_t ru_nswap; //!< swaps
< int64_t ru_inblock; //!< block input operations
< int64_t ru_oublock; //!< block output operations
< int64_t ru_msgsnd; //!< messages sent
< int64_t ru_msgrcv; //!< messages received
< int64_t ru_nsignals; //!< signals received
< int64_t ru_nvcsw; //!< voluntary context switches
< int64_t ru_nivcsw; //!< involuntary "
< };
<
< /// Helper function to convert a host stat buffer to a target stat
< /// buffer. Also copies the target buffer out to the simulated
< /// memory space. Used by stat(), fstat(), and lstat().
< #if !NO_STAT64
< static void
< copyOutStatBuf(TranslatingPort *mem, Addr addr, hst_stat *host)
< {
< using namespace TheISA;
<
< TypedBufferArg<Solaris::tgt_stat> tgt(addr);
<
< tgt->st_dev = htog(host->st_dev);
< tgt->st_ino = htog(host->st_ino);
< tgt->st_mode = htog(host->st_mode);
< tgt->st_nlink = htog(host->st_nlink);
< tgt->st_uid = htog(host->st_uid);
< tgt->st_gid = htog(host->st_gid);
< tgt->st_rdev = htog(host->st_rdev);
< tgt->st_size = htog(host->st_size);
< tgt->st_atimeX.tv_sec = htog((uint64_t)host->st_atime);
< tgt->st_mtimeX.tv_sec = htog((uint64_t)host->st_mtime);
< tgt->st_ctimeX.tv_sec = htog((uint64_t)host->st_ctime);
< #if defined(STAT_HAVE_NSEC)
< tgt->st_atimeX.tv_nsec = htog(host->st_atime_nsec);
< tgt->st_mtimeX.tv_nsec = htog(host->st_mtime_nsec);
< tgt->st_ctimeX.tv_nsec = htog(host->st_ctime_nsec);
< #else
< tgt->st_atimeX.tv_nsec = 0;
< tgt->st_mtimeX.tv_nsec = 0;
< tgt->st_ctimeX.tv_nsec = 0;
< #endif
< tgt->st_blksize = htog(host->st_blksize);
< tgt->st_blocks = htog(host->st_blocks);
< strncpy(tgt->st_fstype, "????", 16);
<
< tgt.copyOut(mem);
< }
< #else
< // Third version for bsd systems which no longer have any support for
< // the old stat() call and stat() is actually a stat64()
< static void
< copyOutStatBuf(TranslatingPort *mem, Addr addr, hst_stat64 *host)
< {
< using namespace TheISA;
<
< TypedBufferArg<Solaris::tgt_stat> tgt(addr);
<
< tgt->st_dev = htog(host->st_dev);
< tgt->st_ino = htog(host->st_ino);
< tgt->st_mode = htog(host->st_mode);
< tgt->st_nlink = htog(host->st_nlink);
< tgt->st_uid = htog(host->st_uid);
< tgt->st_gid = htog(host->st_gid);
< tgt->st_rdev = htog(host->st_rdev);
< tgt->st_size = htog(host->st_size);
< tgt->st_atimeX.tv_sec = htog((uint64_t)host->st_atime);
< tgt->st_mtimeX.tv_sec = htog((uint64_t)host->st_mtime);
< tgt->st_ctimeX.tv_sec = htog((uint64_t)host->st_ctime);
< #if defined(STAT_HAVE_NSEC)
< tgt->st_atimeX.tv_nsec = htog(host->st_atime_nsec);
< tgt->st_mtimeX.tv_nsec = htog(host->st_mtime_nsec);
< tgt->st_ctimeX.tv_nsec = htog(host->st_ctime_nsec);
< #else
< tgt->st_atimeX.tv_nsec = 0;
< tgt->st_mtimeX.tv_nsec = 0;
< tgt->st_ctimeX.tv_nsec = 0;
< #endif
< tgt->st_blksize = htog(host->st_blksize);
< tgt->st_blocks = htog(host->st_blocks);
< strncpy(tgt->st_fstype, "????", 16);
<
< tgt.copyOut(mem);
< }
< #endif
<
<
< // Same for stat64
< static void
< copyOutStat64Buf(TranslatingPort *mem, int fd, Addr addr, hst_stat64 *host)
< {
< using namespace TheISA;
<
< TypedBufferArg<Solaris::tgt_stat64> tgt(addr);
<
< // fd == 1 checks are because libc does some checks
< // that the stdout is interactive vs. a file
< // this makes it work on non-solaris systems
< if (fd == 1)
< tgt->st_dev = htog((uint64_t)0xA);
< else
< tgt->st_dev = htog((uint64_t)host->st_dev);
< // XXX What about STAT64_HAS_BROKEN_ST_INO ???
< tgt->st_ino = htog((uint64_t)host->st_ino);
< if (fd == 1)
< tgt->st_rdev = htog((uint64_t)0x880d);
< else
< tgt->st_rdev = htog((uint64_t)host->st_rdev);
< tgt->st_size = htog((int64_t)host->st_size);
< tgt->st_blocks = htog((uint64_t)host->st_blocks);
<
< if (fd == 1)
< tgt->st_mode = htog((uint32_t)0x2190);
< else
< tgt->st_mode = htog((uint32_t)host->st_mode);
< tgt->st_uid = htog((uint32_t)host->st_uid);
< tgt->st_gid = htog((uint32_t)host->st_gid);
< tgt->st_blksize = htog((uint32_t)host->st_blksize);
< tgt->st_nlink = htog((uint32_t)host->st_nlink);
< tgt->st_atimeX.tv_sec = htog((uint64_t)host->st_atime);
< tgt->st_mtimeX.tv_sec = htog((uint64_t)host->st_mtime);
< tgt->st_ctimeX.tv_sec = htog((uint64_t)host->st_ctime);
< #if defined(STAT_HAVE_NSEC)
< tgt->st_atimeX.tv_nsec = htog(host->st_atime_nsec);
< tgt->st_mtimeX.tv_nsec = htog(host->st_mtime_nsec);
< tgt->st_ctimeX.tv_nsec = htog(host->st_ctime_nsec);
< #else
< tgt->st_atimeX.tv_nsec = 0;
< tgt->st_mtimeX.tv_nsec = 0;
< tgt->st_ctimeX.tv_nsec = 0;
< #endif
<
< tgt.copyOut(mem);
< }
<