Changes to correct stat behavior
authorGabe Black <gblack@eecs.umich.edu>
Sat, 16 Sep 2006 01:43:12 +0000 (21:43 -0400)
committerGabe Black <gblack@eecs.umich.edu>
Sat, 16 Sep 2006 01:43:12 +0000 (21:43 -0400)
--HG--
extra : convert_revision : 43e5788105738aebd79acb05301bb7da68bfe129

src/arch/sparc/linux/linux.hh
src/kern/linux/linux.hh
src/kern/operatingsystem.hh [new file with mode: 0644]
src/kern/solaris/solaris.hh
src/kern/tru64/tru64.hh
src/sim/syscall_emul.hh

index 926c2cb77ee498fcdbe1dea826c77a41d8d5e99f..fefd27197ba95ae4b3927fa2ea5c3d704468c481 100644 (file)
@@ -37,6 +37,25 @@ class SparcLinux : public Linux
 {
   public:
 
+    typedef struct {
+        uint32_t st_dev;
+        char __pad1[4];
+        uint64_t st_ino;
+        uint32_t st_mode;
+        uint16_t st_nlink;
+        uint32_t st_uid;
+        uint32_t st_gid;
+        uint32_t st_rdev;
+        char __pad2[4];
+        int64_t st_size;
+        int64_t st_atimeX;
+        int64_t st_mtimeX;
+        int64_t st_ctimeX;
+        int64_t st_blksize;
+        int64_t st_blocks;
+        uint64_t __unused4[2];
+    } tgt_stat;
+
     static OpenFlagTransTable openFlagTable[];
 
     static const int TGT_O_RDONLY      = 0x00000000;   //!< O_RDONLY
index e3f554a22fe0d01127d772028080240768d54ab3..3a2677642a4e65a89ce4b4c6bd19417e2dfb5b76 100644 (file)
@@ -38,48 +38,33 @@ class Linux {};
 
 #else //!FULL_SYSTEM
 
-#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>
 
-#include "arch/isa_traits.hh"
-#include "sim/syscall_emul.hh"
-
-class TranslatingPort;
+#include "kern/operatingsystem.hh"
 
 ///
 /// This class encapsulates the types, structures, constants,
 /// functions, and syscall-number mappings specific to the Alpha Linux
 /// syscall interface.
 ///
-class Linux {
+class Linux : public OperatingSystem
+{
 
   public:
 
     //@{
     /// Basic Linux types.
-    typedef uint64_t size_t;
+/*    typedef uint64_t size_t;
     typedef uint64_t off_t;
     typedef int64_t time_t;
     typedef uint32_t uid_t;
-    typedef uint32_t gid_t;
+    typedef uint32_t gid_t;*/
     //@}
 
-#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
-
     /// Stat buffer.  Note that we can't call it 'stat' since that
-    /// gets #defined to something else on some systems.
-    struct tgt_stat {
+    /// gets #defined to something else on some systems. This type
+    /// can be specialized by architecture specific "Linux" classes
+    typedef struct {
         uint32_t       st_dev;         //!< device
         uint32_t       st_ino;         //!< inode
         uint32_t       st_mode;        //!< mode
@@ -96,10 +81,10 @@ class Linux {
         int32_t                st_blocks;      //!< number of blocks allocated
         uint32_t       st_flags;       //!< flags
         uint32_t       st_gen;         //!< unknown
-    };
+    } tgt_stat;
 
     // same for stat64
-    struct tgt_stat64 {
+    typedef struct {
         uint64_t       st_dev;
         uint64_t       st_ino;
         uint64_t       st_rdev;
@@ -113,14 +98,14 @@ class Linux {
         uint32_t       st_nlink;
         uint32_t       __pad0;
 
-        uint64_t       tgt_st_atime;
+        uint64_t       st_atimeX;
         uint64_t       st_atime_nsec;
-        uint64_t       tgt_st_mtime;
+        uint64_t       st_mtimeX;
         uint64_t       st_mtime_nsec;
-        uint64_t       tgt_st_ctime;
+        uint64_t       st_ctimeX;
         uint64_t       st_ctime_nsec;
         int64_t                ___unused[3];
-    };
+    } tgt_stat64;
 
     /// Length of strings in struct utsname (plus 1 for null char).
     static const int _SYS_NMLN = 65;
@@ -173,110 +158,6 @@ class Linux {
         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<Linux::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 = htog(host->st_atime);
-        tgt->st_mtimeX = htog(host->st_mtime);
-        tgt->st_ctimeX = htog(host->st_ctime);
-        tgt->st_blksize = htog(host->st_blksize);
-        tgt->st_blocks = htog(host->st_blocks);
-
-        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<Linux::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 = htog(host->st_atime);
-        tgt->st_mtimeX = htog(host->st_mtime);
-        tgt->st_ctimeX = htog(host->st_ctime);
-        tgt->st_blksize = htog(host->st_blksize);
-        tgt->st_blocks = htog(host->st_blocks);
-
-        tgt.copyOut(mem);
-    }
-#endif
-
-
-    // Same for stat64
-    static void
-    copyOutStat64Buf(TranslatingPort *mem, int fd, Addr addr, hst_stat64 *host)
-    {
-        using namespace TheISA;
-
-        TypedBufferArg<Linux::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-linux 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->tgt_st_atime = htog((uint64_t)host->st_atime);
-        tgt->tgt_st_mtime = htog((uint64_t)host->st_mtime);
-        tgt->tgt_st_ctime = htog((uint64_t)host->st_ctime);
-#if defined(STAT_HAVE_NSEC)
-        tgt->st_atime_nsec = htog(host->st_atime_nsec);
-        tgt->st_mtime_nsec = htog(host->st_mtime_nsec);
-        tgt->st_ctime_nsec = htog(host->st_ctime_nsec);
-#else
-        tgt->st_atime_nsec = 0;
-        tgt->st_mtime_nsec = 0;
-        tgt->st_ctime_nsec = 0;
-#endif
-
-        tgt.copyOut(mem);
-    }
-
 };  // class Linux
 
 
diff --git a/src/kern/operatingsystem.hh b/src/kern/operatingsystem.hh
new file mode 100644 (file)
index 0000000..99358ae
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2004-2005 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Gabe Black
+ */
+
+#ifndef __KERN_OPERATINGSYSTEM_HH__
+#define __KERN_OPERATINGSYSTEM_HH__
+
+#include "config/full_system.hh"
+
+#include <inttypes.h>
+
+#if FULL_SYSTEM
+
+class OperatingSystem {};
+
+#else //!FULL_SYSTEM
+
+/// This struct is used to build an target-OS-dependent table that
+/// maps the target's open() flags to the host open() flags.
+struct OpenFlagTransTable {
+    int tgtFlag;       //!< Target system flag value.
+    int hostFlag;      //!< Corresponding host system flag value.
+};
+
+
+///
+/// This class encapsulates the types, structures, constants,
+/// functions, and syscall-number mappings specific to an operating system
+/// syscall interface.
+///
+class OperatingSystem {
+
+  public:
+
+    /// Stat buffer.  Note that we can't call it 'stat' since that
+    /// gets #defined to something else on some systems. This type
+    /// can be specialized by architecture specific "Linux" classes
+    typedef void tgt_stat;
+
+    // same for stat64
+    typedef void tgt_stat64;
+
+    /// Length of strings in struct utsname (plus 1 for null char).
+    static const int _SYS_NMLN = 65;
+
+    /// Interface struct for uname().
+    typedef struct {
+        char sysname[_SYS_NMLN];       //!< System name.
+        char nodename[_SYS_NMLN];      //!< Node name.
+        char release[_SYS_NMLN];       //!< OS release.
+        char version[_SYS_NMLN];       //!< OS version.
+        char machine[_SYS_NMLN];       //!< Machine type.
+    } utsname;
+
+    /// Limit struct for getrlimit/setrlimit.
+    typedef struct {
+        uint64_t  rlim_cur;    //!< soft limit
+        uint64_t  rlim_max;    //!< hard limit
+    } rlimit;
+
+    /// For gettimeofday().
+    typedef struct {
+        int64_t tv_sec;                //!< seconds
+        int64_t tv_usec;       //!< microseconds
+    } timeval;
+
+    // For writev/readv
+    typedef struct {
+        uint64_t iov_base; // void *
+        uint64_t iov_len;
+    } tgt_iovec;
+
+
+    /// For getrusage().
+    typedef struct {
+        timeval ru_utime;      //!< user time used
+        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 "
+    } rusage;
+
+};  // class OperatingSystem
+
+
+#endif // FULL_SYSTEM
+
+#endif // __OPERATINGSYSTEM_HH__
index b819fb6d260e639351ad027ae03ee2f319f92415..a5ca41cddeb54e887c08adc885e5824dc9234a73 100644 (file)
@@ -38,16 +38,9 @@ class Solaris {};
 
 #else //!FULL_SYSTEM
 
-#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>
 
-#include "arch/isa_traits.hh"
-#include "sim/syscall_emul.hh"
+#include "kern/operatingsystem.hh"
 
 class TranslatingPort;
 
@@ -56,13 +49,14 @@ class TranslatingPort;
 /// functions, and syscall-number mappings specific to the Solaris
 /// syscall interface.
 ///
-class Solaris {
+class Solaris : public OperatingSystem
+{
 
   public:
 
     //@{
     /// Basic Solaris types.
-    typedef uint64_t size_t;
+/*    typedef uint64_t size_t;
     typedef uint64_t off_t;
     typedef int64_t time_t;
     typedef int32_t uid_t;
@@ -71,16 +65,9 @@ class Solaris {
     typedef uint64_t ino_t;
     typedef uint64_t dev_t;
     typedef uint32_t mode_t;
-    typedef uint32_t nlink_t;
+    typedef uint32_t nlink_t;*/
     //@}
 
-#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
     struct tgt_timespec {
         int64_t tv_sec;
         int64_t tv_nsec;
@@ -88,7 +75,7 @@ class Solaris {
 
     /// Stat buffer.  Note that we can't call it 'stat' since that
     /// gets #defined to something else on some systems.
-    struct tgt_stat {
+    typedef struct {
         uint64_t       st_dev;         //!< device
         uint64_t       st_ino;         //!< inode
         uint32_t       st_mode;        //!< mode
@@ -97,16 +84,17 @@ class Solaris {
         int32_t                st_gid;         //!< owner's group ID
         uint64_t       st_rdev;        //!< device number
         int64_t                st_size;        //!< file size in bytes
-        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;
         int32_t                st_blksize;     //!< optimal I/O block size
         int64_t                st_blocks;      //!< number of blocks allocated
         char            st_fstype[16];
-    };
+    } tgt_stat;
 
     // same for stat64
-    struct tgt_stat64 {
+    typedef struct {
         uint64_t       st_dev;         //!< device
         uint64_t       st_ino;         //!< inode
         uint32_t       st_mode;        //!< mode
@@ -115,188 +103,26 @@ class Solaris {
         int32_t                st_gid;         //!< owner's group ID
         uint64_t       st_rdev;        //!< device number
         int64_t                st_size;        //!< file size in bytes
-        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;
         int32_t                st_blksize;     //!< optimal I/O block size
         int64_t                st_blocks;      //!< number of blocks allocated
         char            st_fstype[16];
-    };
+    } tgt_stat64;
 
     /// Length of strings in struct utsname (plus 1 for null char).
     static const int _SYS_NMLN = 257;
 
     /// Interface struct for uname().
-    struct utsname {
+    typedef struct utsname {
         char sysname[_SYS_NMLN];       //!< System name.
         char nodename[_SYS_NMLN];      //!< Node name.
         char release[_SYS_NMLN];       //!< OS release.
         char version[_SYS_NMLN];       //!< OS version.
         char machine[_SYS_NMLN];       //!< Machine type.
-    };
-
-    /// 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);
-    }
+    } utsname;
 
 };  // class Solaris
 
index d2b7c862f38edde7b8e6ecf72cdc2d8e0c68c017..63d4f3a9b38f81d60c8f6201d438571bd055bacf 100644 (file)
@@ -32,6 +32,7 @@
 #ifndef __TRU64_HH__
 #define __TRU64_HH__
 #include "config/full_system.hh"
+#include "kern/operatingsystem.hh"
 
 #if FULL_SYSTEM
 
@@ -69,7 +70,8 @@ class TranslatingPort;
 /// functions, and syscall-number mappings specific to the Alpha Tru64
 /// syscall interface.
 ///
-class Tru64 {
+class Tru64 : public OperatingSystem
+{
 
   public:
 
index 69ef314216afcc1e58ce35d66b04845349e38033..978e0bce772426fb75615e9c7e64072b43222083 100644 (file)
 #ifdef __CYGWIN32__
 #include <sys/fcntl.h> // for O_BINARY
 #endif
+#include <sys/stat.h>
+#include <fcntl.h>
 #include <sys/uio.h>
 
-#include "arch/isa_traits.hh"  // for Addr
+#include "sim/host.hh" // for Addr
 #include "base/chunk_generator.hh"
 #include "base/intmath.hh"     // for RoundUp
 #include "base/misc.hh"
@@ -305,15 +307,6 @@ SyscallReturn getgidPseudoFunc(SyscallDesc *desc, int num,
                                Process *p, ThreadContext *tc);
 
 
-/// This struct is used to build an target-OS-dependent table that
-/// maps the target's open() flags to the host open() flags.
-struct OpenFlagTransTable {
-    int tgtFlag;       //!< Target system flag value.
-    int hostFlag;      //!< Corresponding host system flag value.
-};
-
-
-
 /// A readable name for 1,000,000, for converting microseconds to seconds.
 const int one_million = 1000000;
 
@@ -340,6 +333,92 @@ getElapsedTime(T1 &sec, T2 &usec)
 //
 //////////////////////////////////////////////////////////////////////
 
+#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
+
+//// 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().
+
+template <typename target_stat, typename host_stat>
+static void
+convertStatBuf(target_stat &tgt, host_stat *host, bool fakeTTY = false)
+{
+    if (fakeTTY)
+        tgt->st_dev = 0xA;
+    else
+        tgt->st_dev = host->st_dev;
+    tgt->st_dev = htog(tgt->st_dev);
+    tgt->st_ino = host->st_ino;
+    tgt->st_ino = htog(tgt->st_ino);
+    if (fakeTTY)
+        tgt->st_rdev = 0x880d;
+    else
+        tgt->st_rdev = host->st_rdev;
+    tgt->st_rdev = htog(tgt->st_rdev);
+    tgt->st_size = host->st_size;
+    tgt->st_size = htog(tgt->st_size);
+    tgt->st_atimeX = host->st_atimeX;
+    tgt->st_atimeX = htog(tgt->st_atimeX);
+    tgt->st_mtimeX = host->st_mtimeX;
+    tgt->st_mtimeX = htog(tgt->st_mtimeX);
+    tgt->st_ctimeX = host->st_ctimeX;
+    tgt->st_ctimeX = htog(tgt->st_ctimeX);
+    tgt->st_blksize = host->st_blksize;
+    tgt->st_blksize = htog(tgt->st_blksize);
+    tgt->st_blocks = host->st_blocks;
+    tgt->st_blocks = htog(tgt->st_blocks);
+}
+
+// Same for stat64
+
+template <typename target_stat, typename host_stat64>
+static void
+convertStat64Buf(target_stat &tgt, host_stat64 *host, bool fakeTTY = false)
+{
+    convertStatBuf<target_stat, host_stat64>(tgt, host, fakeTTY);
+#if defined(STAT_HAVE_NSEC)
+    tgt->st_atime_nsec = host->st_atime_nsec;
+    tgt->st_atime_nsec = htog(tgt->st_atime_nsec);
+    tgt->st_mtime_nsec = host->st_mtime_nsec;
+    tgt->st_mtime_nsec = htog(tgt->st_mtime_nsec);
+    tgt->st_ctime_nsec = host->st_ctime_nsec;
+    tgt->st_ctime_nsec = htog(tgt->st_ctime_nsec);
+#else
+    tgt->st_atime_nsec = 0;
+    tgt->st_mtime_nsec = 0;
+    tgt->st_ctime_nsec = 0;
+#endif
+}
+
+//Here are a couple convenience functions
+template<class OS>
+static void
+copyOutStatBuf(TranslatingPort * mem, Addr addr,
+        hst_stat *host, bool fakeTTY = false)
+{
+    typedef TypedBufferArg<typename OS::tgt_stat> tgt_stat_buf;
+    tgt_stat_buf tgt(addr);
+    convertStatBuf<tgt_stat_buf, hst_stat>(tgt, host, fakeTTY);
+    tgt.copyOut(mem);
+}
+
+template<class OS>
+static void
+copyOutStat64Buf(TranslatingPort * mem, Addr addr,
+        hst_stat64 *host, bool fakeTTY = false)
+{
+    typedef TypedBufferArg<typename OS::tgt_stat64> tgt_stat_buf;
+    tgt_stat_buf tgt(addr);
+    convertStatBuf<tgt_stat_buf, hst_stat64>(tgt, host, fakeTTY);
+    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.
@@ -492,7 +571,7 @@ statFunc(SyscallDesc *desc, int callnum, Process *process,
     if (result < 0)
         return -errno;
 
-    OS::copyOutStatBuf(tc->getMemPort(), tc->getSyscallArg(1), &hostBuf);
+    copyOutStatBuf<OS>(tc->getMemPort(), tc->getSyscallArg(1), &hostBuf);
 
     return 0;
 }
@@ -521,7 +600,7 @@ fstat64Func(SyscallDesc *desc, int callnum, Process *process,
     if (result < 0)
         return -errno;
 
-    OS::copyOutStat64Buf(tc->getMemPort(), fd, tc->getSyscallArg(1), &hostBuf);
+    copyOutStat64Buf<OS>(tc->getMemPort(), fd, tc->getSyscallArg(1), &hostBuf);
 
     return 0;
 }
@@ -544,7 +623,7 @@ lstatFunc(SyscallDesc *desc, int callnum, Process *process,
     if (result < 0)
         return -errno;
 
-    OS::copyOutStatBuf(tc->getMemPort(), tc->getSyscallArg(1), &hostBuf);
+    copyOutStatBuf<OS>(tc->getMemPort(), tc->getSyscallArg(1), &hostBuf);
 
     return 0;
 }
@@ -571,7 +650,7 @@ lstat64Func(SyscallDesc *desc, int callnum, Process *process,
     if (result < 0)
         return -errno;
 
-    OS::copyOutStat64Buf(tc->getMemPort(), -1, tc->getSyscallArg(1), &hostBuf);
+    copyOutStat64Buf<OS>(tc->getMemPort(), -1, tc->getSyscallArg(1), &hostBuf);
 
     return 0;
 }
@@ -595,7 +674,7 @@ fstatFunc(SyscallDesc *desc, int callnum, Process *process,
     if (result < 0)
         return -errno;
 
-    OS::copyOutStatBuf(tc->getMemPort(), tc->getSyscallArg(1), &hostBuf);
+    copyOutStatBuf<OS>(tc->getMemPort(), tc->getSyscallArg(1), &hostBuf);
 
     return 0;
 }
@@ -618,7 +697,7 @@ statfsFunc(SyscallDesc *desc, int callnum, Process *process,
     if (result < 0)
         return -errno;
 
-    OS::copyOutStatfsBuf(tc->getMemPort(), tc->getSyscallArg(1), &hostBuf);
+    copyOutStatfsBuf<OS>(tc->getMemPort(), tc->getSyscallArg(1), &hostBuf);
 
     return 0;
 }
@@ -641,7 +720,7 @@ fstatfsFunc(SyscallDesc *desc, int callnum, Process *process,
     if (result < 0)
         return -errno;
 
-    OS::copyOutStatfsBuf(tc->getMemPort(), tc->getSyscallArg(1), &hostBuf);
+    copyOutStatfsBuf<OS>(tc->getMemPort(), tc->getSyscallArg(1), &hostBuf);
 
     return 0;
 }