linux.hh revision 9141:593fe25c86a6
17584SAli.Saidi@arm.com/*
29958Smatt.evans@arm.com * Copyright (c) 2010 ARM Limited
37584SAli.Saidi@arm.com * All rights reserved
47584SAli.Saidi@arm.com *
57584SAli.Saidi@arm.com * The license below extends only to copyright in the software and shall
67584SAli.Saidi@arm.com * not be construed as granting a license to any other intellectual
77584SAli.Saidi@arm.com * property including but not limited to intellectual property relating
87584SAli.Saidi@arm.com * to a hardware implementation of the functionality of the software
97584SAli.Saidi@arm.com * licensed hereunder.  You may use the software subject to the license
107584SAli.Saidi@arm.com * terms below provided that you ensure that this notice is replicated
117584SAli.Saidi@arm.com * unmodified and in its entirety in all distributions of the software,
127584SAli.Saidi@arm.com * modified or unmodified, in source code or in binary form.
137584SAli.Saidi@arm.com *
147584SAli.Saidi@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan
157584SAli.Saidi@arm.com * Copyright (c) 2007-2008 The Florida State University
167584SAli.Saidi@arm.com * All rights reserved.
177584SAli.Saidi@arm.com *
187584SAli.Saidi@arm.com * Redistribution and use in source and binary forms, with or without
197584SAli.Saidi@arm.com * modification, are permitted provided that the following conditions are
207584SAli.Saidi@arm.com * met: redistributions of source code must retain the above copyright
217584SAli.Saidi@arm.com * notice, this list of conditions and the following disclaimer;
227584SAli.Saidi@arm.com * redistributions in binary form must reproduce the above copyright
237584SAli.Saidi@arm.com * notice, this list of conditions and the following disclaimer in the
247584SAli.Saidi@arm.com * documentation and/or other materials provided with the distribution;
257584SAli.Saidi@arm.com * neither the name of the copyright holders nor the names of its
267584SAli.Saidi@arm.com * contributors may be used to endorse or promote products derived from
277584SAli.Saidi@arm.com * this software without specific prior written permission.
287584SAli.Saidi@arm.com *
297584SAli.Saidi@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
307584SAli.Saidi@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
317584SAli.Saidi@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
327584SAli.Saidi@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
337584SAli.Saidi@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
347584SAli.Saidi@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
357584SAli.Saidi@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
367584SAli.Saidi@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
377584SAli.Saidi@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
387584SAli.Saidi@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
397584SAli.Saidi@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
407584SAli.Saidi@arm.com *
419958Smatt.evans@arm.com * Authors: Ali Saidi
427584SAli.Saidi@arm.com *          Stephen Hines
437584SAli.Saidi@arm.com */
447584SAli.Saidi@arm.com
457584SAli.Saidi@arm.com#ifndef __ARCH_ARM_LINUX_LINUX_HH__
467584SAli.Saidi@arm.com#define __ARCH_ARM_LINUX_LINUX_HH__
479958Smatt.evans@arm.com
487584SAli.Saidi@arm.com#include "kern/linux/linux.hh"
497584SAli.Saidi@arm.com
507584SAli.Saidi@arm.comclass ArmLinux : public Linux
517584SAli.Saidi@arm.com{
527584SAli.Saidi@arm.com  public:
537584SAli.Saidi@arm.com
547584SAli.Saidi@arm.com    /// This table maps the target open() flags to the corresponding
557584SAli.Saidi@arm.com    /// host open() flags.
567584SAli.Saidi@arm.com    static OpenFlagTransTable openFlagTable[];
577584SAli.Saidi@arm.com
587584SAli.Saidi@arm.com    /// Number of entries in openFlagTable[].
598524SAli.Saidi@ARM.com    static const int NUM_OPEN_FLAGS;
608524SAli.Saidi@ARM.com
618524SAli.Saidi@ARM.com    //@{
628524SAli.Saidi@ARM.com    /// Basic ARM Linux types
638524SAli.Saidi@ARM.com    typedef uint32_t size_t;
647584SAli.Saidi@arm.com    typedef uint32_t off_t;
657584SAli.Saidi@arm.com    typedef int32_t time_t;
667584SAli.Saidi@arm.com    typedef int32_t clock_t;
679004Skoansin.tan@gmail.com    //@}
687584SAli.Saidi@arm.com
697584SAli.Saidi@arm.com    //@{
708060SAli.Saidi@ARM.com    /// open(2) flag values.
718060SAli.Saidi@ARM.com    static const int TGT_O_RDONLY    = 00000000; //!< O_RDONLY
729004Skoansin.tan@gmail.com    static const int TGT_O_WRONLY    = 00000001; //!< O_WRONLY
738060SAli.Saidi@ARM.com    static const int TGT_O_RDWR      = 00000002; //!< O_RDWR
748060SAli.Saidi@ARM.com    static const int TGT_O_CREAT     = 00000100; //!< O_CREAT
757584SAli.Saidi@arm.com    static const int TGT_O_EXCL      = 00000200; //!< O_EXCL
767584SAli.Saidi@arm.com    static const int TGT_O_NOCTTY    = 00000400; //!< O_NOCTTY
777584SAli.Saidi@arm.com    static const int TGT_O_TRUNC     = 00001000; //!< O_TRUNC
787950SAli.Saidi@ARM.com    static const int TGT_O_APPEND    = 00002000; //!< O_APPEND
797950SAli.Saidi@ARM.com    static const int TGT_O_NONBLOCK  = 00004000; //!< O_NONBLOCK
807950SAli.Saidi@ARM.com    static const int TGT_O_SYNC      = 00010000; //!< O_SYNC
817950SAli.Saidi@ARM.com    static const int TGT_FASYNC      = 00020000; //!< FASYNC
827950SAli.Saidi@ARM.com    static const int TGT_O_DIRECT    = 00040000; //!< O_DIRECT
837950SAli.Saidi@ARM.com    static const int TGT_O_LARGEFILE = 00100000; //!< O_LARGEFILE
847950SAli.Saidi@ARM.com    static const int TGT_O_DIRECTORY = 00200000; //!< O_DIRECTORY
857950SAli.Saidi@ARM.com    static const int TGT_O_NOFOLLOW  = 00400000; //!< O_NOFOLLOW
867950SAli.Saidi@ARM.com    static const int TGT_O_NOATIME   = 01000000; //!< O_NOATIME
877950SAli.Saidi@ARM.com    static const int TGT_O_CLOEXEC   = 02000000; //!< O_NOATIME
887950SAli.Saidi@ARM.com
897950SAli.Saidi@ARM.com
907950SAli.Saidi@ARM.com    //@}
917950SAli.Saidi@ARM.com
927950SAli.Saidi@ARM.com    /// For mmap().
937950SAli.Saidi@ARM.com    static const unsigned TGT_MAP_ANONYMOUS = 0x20;
947950SAli.Saidi@ARM.com    static const unsigned TGT_MAP_FIXED     = 0x10;
957950SAli.Saidi@ARM.com
967950SAli.Saidi@ARM.com    //@{
977950SAli.Saidi@ARM.com    /// For getrusage().
987950SAli.Saidi@ARM.com    static const int TGT_RUSAGE_SELF = 0;
998281SAli.Saidi@ARM.com    static const int TGT_RUSAGE_CHILDREN = -1;
1008281SAli.Saidi@ARM.com    static const int TGT_RUSAGE_BOTH = -2;
1018281SAli.Saidi@ARM.com    //@}
1028299Schander.sudanthi@arm.com
1038299Schander.sudanthi@arm.com    /// For table().
1048299Schander.sudanthi@arm.com    static const int TBL_SYSINFO = 12;
1058870SAli.Saidi@ARM.com
1068870SAli.Saidi@ARM.com    /// Resource enumeration for getrlimit().
1078988SAli.Saidi@ARM.com    enum rlimit_resources {
1089958Smatt.evans@arm.com        TGT_RLIMIT_CPU = 0,
1099958Smatt.evans@arm.com        TGT_RLIMIT_FSIZE = 1,
1109958Smatt.evans@arm.com        TGT_RLIMIT_DATA = 2,
1119958Smatt.evans@arm.com        TGT_RLIMIT_STACK = 3,
1129958Smatt.evans@arm.com        TGT_RLIMIT_CORE = 4,
1139958Smatt.evans@arm.com        TGT_RLIMIT_RSS = 5,
1149958Smatt.evans@arm.com        TGT_RLIMIT_NPROC = 6,
1159958Smatt.evans@arm.com        TGT_RLIMIT_NOFILE = 7,
1167584SAli.Saidi@arm.com        TGT_RLIMIT_MEMLOCK = 8,
1178299Schander.sudanthi@arm.com        TGT_RLIMIT_AS = 9,
1188299Schander.sudanthi@arm.com        TGT_RLIMIT_LOCKS = 10
1199958Smatt.evans@arm.com    };
1207584SAli.Saidi@arm.com
1217584SAli.Saidi@arm.com    /// Limit struct for getrlimit/setrlimit.
1227584SAli.Saidi@arm.com    struct rlimit {
1237584SAli.Saidi@arm.com        uint32_t  rlim_cur;     //!< soft limit
1247584SAli.Saidi@arm.com        uint32_t  rlim_max;     //!< hard limit
1257584SAli.Saidi@arm.com    };
1267584SAli.Saidi@arm.com
1277584SAli.Saidi@arm.com    /// For gettimeofday().
1287584SAli.Saidi@arm.com    struct timeval {
1297584SAli.Saidi@arm.com        int32_t tv_sec;         //!< seconds
1307584SAli.Saidi@arm.com        int32_t tv_usec;        //!< microseconds
1317584SAli.Saidi@arm.com    };
1327584SAli.Saidi@arm.com
1337584SAli.Saidi@arm.com    // For writev/readv
1347584SAli.Saidi@arm.com    struct tgt_iovec {
1357950SAli.Saidi@ARM.com        uint32_t iov_base; // void *
1367950SAli.Saidi@ARM.com        uint32_t iov_len;
1377950SAli.Saidi@ARM.com    };
1387950SAli.Saidi@ARM.com
1397950SAli.Saidi@ARM.com
1407950SAli.Saidi@ARM.com    typedef struct {
1417950SAli.Saidi@ARM.com        uint32_t st_dev;
1427950SAli.Saidi@ARM.com        uint32_t st_ino;
1437950SAli.Saidi@ARM.com        uint16_t st_mode;
1447584SAli.Saidi@arm.com        uint16_t st_nlink;
1458281SAli.Saidi@ARM.com        uint16_t st_uid;
1468281SAli.Saidi@ARM.com        uint16_t st_gid;
1478281SAli.Saidi@ARM.com        uint32_t st_rdev;
1488524SAli.Saidi@ARM.com        uint32_t st_size;
1498524SAli.Saidi@ARM.com        uint32_t st_blksize;
1508524SAli.Saidi@ARM.com        uint32_t st_blocks;
1519958Smatt.evans@arm.com        uint32_t st_atimeX;
1529958Smatt.evans@arm.com        uint32_t st_atime_nsec;
1539958Smatt.evans@arm.com        uint32_t st_mtimeX;
1549958Smatt.evans@arm.com        uint32_t st_mtime_nsec;
1559958Smatt.evans@arm.com        uint32_t st_ctimeX;
1569958Smatt.evans@arm.com        uint32_t st_ctime_nsec;
1579958Smatt.evans@arm.com    } tgt_stat;
1589958Smatt.evans@arm.com
1599958Smatt.evans@arm.com    typedef struct {
1609958Smatt.evans@arm.com        uint64_t  st_dev;
1619958Smatt.evans@arm.com        uint8_t   __pad0[4];
1629958Smatt.evans@arm.com        uint32_t  __st_ino;
1639958Smatt.evans@arm.com        uint32_t  st_mode;
1649958Smatt.evans@arm.com        uint32_t  st_nlink;
1659958Smatt.evans@arm.com        uint32_t  st_uid;
1669958Smatt.evans@arm.com        uint32_t  st_gid;
1679958Smatt.evans@arm.com        uint64_t  st_rdev;
1689958Smatt.evans@arm.com        uint8_t   __pad3[4];
1699958Smatt.evans@arm.com        int64_t   __attribute__ ((aligned (8))) st_size;
1709958Smatt.evans@arm.com        uint32_t  st_blksize;
1719958Smatt.evans@arm.com        uint64_t  __attribute__ ((aligned (8))) st_blocks;
1729958Smatt.evans@arm.com        uint32_t  st_atimeX;
1739958Smatt.evans@arm.com        uint32_t  st_atime_nsec;
1749958Smatt.evans@arm.com        uint32_t  st_mtimeX;
1759958Smatt.evans@arm.com        uint32_t  st_mtime_nsec;
1769958Smatt.evans@arm.com        uint32_t  st_ctimeX;
1779958Smatt.evans@arm.com        uint32_t  st_ctime_nsec;
1789958Smatt.evans@arm.com        uint64_t  st_ino;
1799958Smatt.evans@arm.com    } tgt_stat64;
1809958Smatt.evans@arm.com
1819958Smatt.evans@arm.com    typedef struct {
1829958Smatt.evans@arm.com        int32_t  uptime;    /* Seconds since boot */
1839958Smatt.evans@arm.com        uint32_t loads[3];  /* 1, 5, and 15 minute load averages */
1849958Smatt.evans@arm.com        uint32_t totalram;  /* Total usable main memory size */
1859958Smatt.evans@arm.com        uint32_t freeram;   /* Available memory size */
1869958Smatt.evans@arm.com        uint32_t sharedram; /* Amount of shared memory */
1879958Smatt.evans@arm.com        uint32_t bufferram; /* Memory used by buffers */
1889958Smatt.evans@arm.com        uint32_t totalswap; /* Total swap space size */
1899958Smatt.evans@arm.com        uint32_t freeswap;  /* swap space still available */
1909958Smatt.evans@arm.com        uint16_t procs;     /* Number of current processes */
1919958Smatt.evans@arm.com        uint32_t totalhigh; /* Total high memory size */
1929958Smatt.evans@arm.com        uint32_t freehigh;  /* Available high memory size */
1939958Smatt.evans@arm.com        uint32_t mem_unit;  /* Memory unit size in bytes */
1949958Smatt.evans@arm.com    } tgt_sysinfo;
1959958Smatt.evans@arm.com
1969958Smatt.evans@arm.com    /// For getrusage().
1979958Smatt.evans@arm.com    struct rusage {
1989958Smatt.evans@arm.com        struct timeval ru_utime;        //!< user time used
1999958Smatt.evans@arm.com        struct timeval ru_stime;        //!< system time used
2009958Smatt.evans@arm.com        int32_t ru_maxrss;              //!< max rss
2019958Smatt.evans@arm.com        int32_t ru_ixrss;               //!< integral shared memory size
2029958Smatt.evans@arm.com        int32_t ru_idrss;               //!< integral unshared data "
2039958Smatt.evans@arm.com        int32_t ru_isrss;               //!< integral unshared stack "
2049958Smatt.evans@arm.com        int32_t ru_minflt;              //!< page reclaims - total vmfaults
2059958Smatt.evans@arm.com        int32_t ru_majflt;              //!< page faults
2069958Smatt.evans@arm.com        int32_t ru_nswap;               //!< swaps
2079958Smatt.evans@arm.com        int32_t ru_inblock;             //!< block input operations
2089958Smatt.evans@arm.com        int32_t ru_oublock;             //!< block output operations
2099958Smatt.evans@arm.com        int32_t ru_msgsnd;              //!< messages sent
2109958Smatt.evans@arm.com        int32_t ru_msgrcv;              //!< messages received
2119958Smatt.evans@arm.com        int32_t ru_nsignals;            //!< signals received
2129958Smatt.evans@arm.com        int32_t ru_nvcsw;               //!< voluntary context switches
2139958Smatt.evans@arm.com        int32_t ru_nivcsw;              //!< involuntary "
2149958Smatt.evans@arm.com    };
2159958Smatt.evans@arm.com
2169958Smatt.evans@arm.com    /// For times().
2179958Smatt.evans@arm.com    struct tms {
2189958Smatt.evans@arm.com        int32_t tms_utime;      //!< user time
2199958Smatt.evans@arm.com        int32_t tms_stime;      //!< system time
2209958Smatt.evans@arm.com        int32_t tms_cutime;     //!< user time of children
2219958Smatt.evans@arm.com        int32_t tms_cstime;     //!< system time of children
2229958Smatt.evans@arm.com    };
2239958Smatt.evans@arm.com
2249958Smatt.evans@arm.com
2259958Smatt.evans@arm.com};
2269958Smatt.evans@arm.com
2279958Smatt.evans@arm.com#endif
2289958Smatt.evans@arm.com