linux.hh revision 6744
15443Sgblack@eecs.umich.edu/*
25443Sgblack@eecs.umich.edu * Copyright (c) 2004-2009 The Regents of The University of Michigan
35443Sgblack@eecs.umich.edu * All rights reserved.
45443Sgblack@eecs.umich.edu *
55443Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
65443Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
75443Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
85443Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
95443Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
105443Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
115443Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
125443Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
135443Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
145443Sgblack@eecs.umich.edu * this software without specific prior written permission.
155443Sgblack@eecs.umich.edu *
165443Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175443Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185443Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195443Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205443Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215443Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225443Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235443Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245443Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255443Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265443Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275443Sgblack@eecs.umich.edu *
285443Sgblack@eecs.umich.edu * Authors: Ali Saidi
295443Sgblack@eecs.umich.edu */
305443Sgblack@eecs.umich.edu
315443Sgblack@eecs.umich.edu#ifndef __LINUX_HH__
325443Sgblack@eecs.umich.edu#define __LINUX_HH__
335443Sgblack@eecs.umich.edu
345443Sgblack@eecs.umich.edu#include "base/types.hh"
355443Sgblack@eecs.umich.edu#include "config/full_system.hh"
368229Snate@binkert.org
375606Snate@binkert.org#if FULL_SYSTEM
385606Snate@binkert.org
395443Sgblack@eecs.umich.educlass Linux {};
406216Snate@binkert.org
419356Snilay@cs.wisc.edu#else //!FULL_SYSTEM
428232Snate@binkert.org
439356Snilay@cs.wisc.edu#include <string>
445443Sgblack@eecs.umich.edu
455443Sgblack@eecs.umich.edu#include "kern/operatingsystem.hh"
465443Sgblack@eecs.umich.edu
475606Snate@binkert.orgclass ThreadContext;
485443Sgblack@eecs.umich.educlass LiveProcess;
495635Sgblack@eecs.umich.edu
505443Sgblack@eecs.umich.edu///
515443Sgblack@eecs.umich.edu/// This class encapsulates the types, structures, constants,
525443Sgblack@eecs.umich.edu/// functions, and syscall-number mappings specific to the Alpha Linux
535443Sgblack@eecs.umich.edu/// syscall interface.
545443Sgblack@eecs.umich.edu///
555443Sgblack@eecs.umich.educlass Linux : public OperatingSystem
565443Sgblack@eecs.umich.edu{
575443Sgblack@eecs.umich.edu
585443Sgblack@eecs.umich.edu  public:
595443Sgblack@eecs.umich.edu
605443Sgblack@eecs.umich.edu    //@{
615443Sgblack@eecs.umich.edu    /// Basic Linux types.
625443Sgblack@eecs.umich.edu    typedef uint64_t size_t;
635443Sgblack@eecs.umich.edu    typedef uint64_t off_t;
645443Sgblack@eecs.umich.edu    typedef int64_t time_t;
655443Sgblack@eecs.umich.edu    typedef int64_t clock_t;
665443Sgblack@eecs.umich.edu    typedef uint32_t uid_t;
675443Sgblack@eecs.umich.edu    typedef uint32_t gid_t;
685443Sgblack@eecs.umich.edu    //@}
695443Sgblack@eecs.umich.edu
705443Sgblack@eecs.umich.edu    /// Stat buffer.  Note that we can't call it 'stat' since that
715443Sgblack@eecs.umich.edu    /// gets #defined to something else on some systems. This type
725443Sgblack@eecs.umich.edu    /// can be specialized by architecture specific "Linux" classes
735443Sgblack@eecs.umich.edu    typedef struct {
745443Sgblack@eecs.umich.edu        uint32_t        st_dev;         //!< device
755443Sgblack@eecs.umich.edu        uint32_t        st_ino;         //!< inode
765443Sgblack@eecs.umich.edu        uint32_t        st_mode;        //!< mode
775443Sgblack@eecs.umich.edu        uint32_t        st_nlink;       //!< link count
785443Sgblack@eecs.umich.edu        uint32_t        st_uid;         //!< owner's user ID
795443Sgblack@eecs.umich.edu        uint32_t        st_gid;         //!< owner's group ID
805443Sgblack@eecs.umich.edu        uint32_t        st_rdev;        //!< device number
815443Sgblack@eecs.umich.edu        int32_t         _pad1;          //!< for alignment
825443Sgblack@eecs.umich.edu        int64_t         st_size;        //!< file size in bytes
835443Sgblack@eecs.umich.edu        uint64_t        st_atimeX;      //!< time of last access
845443Sgblack@eecs.umich.edu        uint64_t        st_mtimeX;      //!< time of last modification
855443Sgblack@eecs.umich.edu        uint64_t        st_ctimeX;      //!< time of last status change
865443Sgblack@eecs.umich.edu        uint32_t        st_blksize;     //!< optimal I/O block size
875443Sgblack@eecs.umich.edu        int32_t         st_blocks;      //!< number of blocks allocated
885443Sgblack@eecs.umich.edu        uint32_t        st_flags;       //!< flags
895443Sgblack@eecs.umich.edu        uint32_t        st_gen;         //!< unknown
905443Sgblack@eecs.umich.edu    } tgt_stat;
915443Sgblack@eecs.umich.edu
925443Sgblack@eecs.umich.edu    // same for stat64
935443Sgblack@eecs.umich.edu    typedef struct {
945443Sgblack@eecs.umich.edu        uint64_t        st_dev;
955642Sgblack@eecs.umich.edu        uint64_t        st_ino;
965443Sgblack@eecs.umich.edu        uint64_t        st_rdev;
975443Sgblack@eecs.umich.edu        int64_t         st_size;
985443Sgblack@eecs.umich.edu        uint64_t        st_blocks;
995443Sgblack@eecs.umich.edu
1005443Sgblack@eecs.umich.edu        uint32_t        st_mode;
1015444Sgblack@eecs.umich.edu        uint32_t        st_uid;
1025444Sgblack@eecs.umich.edu        uint32_t        st_gid;
1036067Sgblack@eecs.umich.edu        uint32_t        st_blksize;
1046067Sgblack@eecs.umich.edu        uint32_t        st_nlink;
1055443Sgblack@eecs.umich.edu        uint32_t        __pad0;
1065443Sgblack@eecs.umich.edu
1075443Sgblack@eecs.umich.edu        uint64_t        st_atimeX;
1085443Sgblack@eecs.umich.edu        uint64_t        st_atime_nsec;
1095443Sgblack@eecs.umich.edu        uint64_t        st_mtimeX;
1105443Sgblack@eecs.umich.edu        uint64_t        st_mtime_nsec;
1115642Sgblack@eecs.umich.edu        uint64_t        st_ctimeX;
1125642Sgblack@eecs.umich.edu        uint64_t        st_ctime_nsec;
1135443Sgblack@eecs.umich.edu        int64_t         ___unused[3];
1145443Sgblack@eecs.umich.edu    } tgt_stat64;
1156067Sgblack@eecs.umich.edu
1166067Sgblack@eecs.umich.edu    /// Length of strings in struct utsname (plus 1 for null char).
1175443Sgblack@eecs.umich.edu    static const int _SYS_NMLN = 65;
1185443Sgblack@eecs.umich.edu
1195443Sgblack@eecs.umich.edu    /// Interface struct for uname().
1205443Sgblack@eecs.umich.edu    struct utsname {
1215443Sgblack@eecs.umich.edu        char sysname[_SYS_NMLN];        //!< System name.
1225443Sgblack@eecs.umich.edu        char nodename[_SYS_NMLN];       //!< Node name.
1235443Sgblack@eecs.umich.edu        char release[_SYS_NMLN];        //!< OS release.
1245443Sgblack@eecs.umich.edu        char version[_SYS_NMLN];        //!< OS version.
1255443Sgblack@eecs.umich.edu        char machine[_SYS_NMLN];        //!< Machine type.
1265443Sgblack@eecs.umich.edu    };
1275443Sgblack@eecs.umich.edu
1285443Sgblack@eecs.umich.edu    /// Limit struct for getrlimit/setrlimit.
1295443Sgblack@eecs.umich.edu    struct rlimit {
1305443Sgblack@eecs.umich.edu        uint64_t  rlim_cur;     //!< soft limit
1315443Sgblack@eecs.umich.edu        uint64_t  rlim_max;     //!< hard limit
1325443Sgblack@eecs.umich.edu    };
1335443Sgblack@eecs.umich.edu
1345443Sgblack@eecs.umich.edu    /// For gettimeofday().
1355443Sgblack@eecs.umich.edu    struct timeval {
1365443Sgblack@eecs.umich.edu        int64_t tv_sec;         //!< seconds
1375443Sgblack@eecs.umich.edu        int64_t tv_usec;        //!< microseconds
1385443Sgblack@eecs.umich.edu    };
1395606Snate@binkert.org
1405606Snate@binkert.org    /// Clock ticks per second, for times().
1415606Snate@binkert.org    static const int M5_SC_CLK_TCK = 100;
1425443Sgblack@eecs.umich.edu
1435642Sgblack@eecs.umich.edu    /// For times().
1445443Sgblack@eecs.umich.edu    struct tms {
1455443Sgblack@eecs.umich.edu        int64_t tms_utime;      //!< user time
1465443Sgblack@eecs.umich.edu        int64_t tms_stime;      //!< system time
1475443Sgblack@eecs.umich.edu        int64_t tms_cutime;     //!< user time of children
1486067Sgblack@eecs.umich.edu        int64_t tms_cstime;     //!< system time of children
1496067Sgblack@eecs.umich.edu    };
1506067Sgblack@eecs.umich.edu
1515443Sgblack@eecs.umich.edu    // For writev/readv
1525443Sgblack@eecs.umich.edu    struct tgt_iovec {
1535443Sgblack@eecs.umich.edu        uint64_t iov_base; // void *
1545443Sgblack@eecs.umich.edu        uint64_t iov_len;
1555443Sgblack@eecs.umich.edu    };
1565443Sgblack@eecs.umich.edu
1575443Sgblack@eecs.umich.edu
1585443Sgblack@eecs.umich.edu    /// For getrusage().
1595443Sgblack@eecs.umich.edu    struct rusage {
1605443Sgblack@eecs.umich.edu        struct timeval ru_utime;        //!< user time used
1615443Sgblack@eecs.umich.edu        struct timeval ru_stime;        //!< system time used
1625443Sgblack@eecs.umich.edu        int64_t ru_maxrss;              //!< max rss
1635443Sgblack@eecs.umich.edu        int64_t ru_ixrss;               //!< integral shared memory size
1645443Sgblack@eecs.umich.edu        int64_t ru_idrss;               //!< integral unshared data "
1655443Sgblack@eecs.umich.edu        int64_t ru_isrss;               //!< integral unshared stack "
1665443Sgblack@eecs.umich.edu        int64_t ru_minflt;              //!< page reclaims - total vmfaults
1675443Sgblack@eecs.umich.edu        int64_t ru_majflt;              //!< page faults
1685443Sgblack@eecs.umich.edu        int64_t ru_nswap;               //!< swaps
1695443Sgblack@eecs.umich.edu        int64_t ru_inblock;             //!< block input operations
1705443Sgblack@eecs.umich.edu        int64_t ru_oublock;             //!< block output operations
1715443Sgblack@eecs.umich.edu        int64_t ru_msgsnd;              //!< messages sent
1725443Sgblack@eecs.umich.edu        int64_t ru_msgrcv;              //!< messages received
1735443Sgblack@eecs.umich.edu        int64_t ru_nsignals;            //!< signals received
1745443Sgblack@eecs.umich.edu        int64_t ru_nvcsw;               //!< voluntary context switches
1755443Sgblack@eecs.umich.edu        int64_t ru_nivcsw;              //!< involuntary "
1765443Sgblack@eecs.umich.edu    };
1775443Sgblack@eecs.umich.edu
1785443Sgblack@eecs.umich.edu    static int openSpecialFile(std::string path, LiveProcess *process, ThreadContext *tc);
1795443Sgblack@eecs.umich.edu    static std::string procMeminfo(LiveProcess *process, ThreadContext *tc);
1805443Sgblack@eecs.umich.edu
1815443Sgblack@eecs.umich.edu};  // class Linux
1825443Sgblack@eecs.umich.edu
1835443Sgblack@eecs.umich.edu
1845443Sgblack@eecs.umich.edu#endif // FULL_SYSTEM
1855443Sgblack@eecs.umich.edu
1865635Sgblack@eecs.umich.edu#endif // __LINUX_HH__
1875443Sgblack@eecs.umich.edu