linux.hh revision 13537:2441d9a15e3c
14120Sgblack@eecs.umich.edu/*
24120Sgblack@eecs.umich.edu * Copyright (c) 2010, 2011-2012, 2015 ARM Limited
34120Sgblack@eecs.umich.edu * All rights reserved
44120Sgblack@eecs.umich.edu *
54120Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall
64120Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual
74120Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating
84120Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software
94120Sgblack@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
104120Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
114120Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
124120Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form.
134120Sgblack@eecs.umich.edu *
144120Sgblack@eecs.umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan
154120Sgblack@eecs.umich.edu * Copyright (c) 2007-2008 The Florida State University
164120Sgblack@eecs.umich.edu * All rights reserved.
174120Sgblack@eecs.umich.edu *
184120Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
194120Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
204120Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
214120Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
224120Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
234120Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
244120Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
254120Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
264120Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
274120Sgblack@eecs.umich.edu * this software without specific prior written permission.
284120Sgblack@eecs.umich.edu *
294120Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
304120Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
315334Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
324120Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
334120Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
344120Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
354120Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
364120Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
374120Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
384120Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
394120Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
404120Sgblack@eecs.umich.edu *
414120Sgblack@eecs.umich.edu * Authors: Ali Saidi
424120Sgblack@eecs.umich.edu *          Stephen Hines
434120Sgblack@eecs.umich.edu */
444120Sgblack@eecs.umich.edu
454120Sgblack@eecs.umich.edu#ifndef __ARCH_ARM_LINUX_LINUX_HH__
464120Sgblack@eecs.umich.edu#define __ARCH_ARM_LINUX_LINUX_HH__
474120Sgblack@eecs.umich.edu
484120Sgblack@eecs.umich.edu#include "arch/arm/utility.hh"
494120Sgblack@eecs.umich.edu#include "kern/linux/linux.hh"
504120Sgblack@eecs.umich.edu
514120Sgblack@eecs.umich.educlass ArmLinux : public Linux
524120Sgblack@eecs.umich.edu{
534120Sgblack@eecs.umich.edu  public:
544120Sgblack@eecs.umich.edu    static void
554120Sgblack@eecs.umich.edu    archClone(uint64_t flags,
564120Sgblack@eecs.umich.edu              Process *pp, Process *cp,
574120Sgblack@eecs.umich.edu              ThreadContext *ptc, ThreadContext *ctc,
584120Sgblack@eecs.umich.edu              uint64_t stack, uint64_t tls)
594120Sgblack@eecs.umich.edu    {
604120Sgblack@eecs.umich.edu        ArmISA::copyRegs(ptc, ctc);
614120Sgblack@eecs.umich.edu    }
624120Sgblack@eecs.umich.edu};
634120Sgblack@eecs.umich.edu
644120Sgblack@eecs.umich.educlass ArmLinux32 : public ArmLinux
654120Sgblack@eecs.umich.edu{
664120Sgblack@eecs.umich.edu  public:
674120Sgblack@eecs.umich.edu
684120Sgblack@eecs.umich.edu    static const int TGT_SIGHUP         = 0x000001;
694120Sgblack@eecs.umich.edu    static const int TGT_SIGINT         = 0x000002;
704120Sgblack@eecs.umich.edu    static const int TGT_SIGQUIT        = 0x000003;
714120Sgblack@eecs.umich.edu    static const int TGT_SIGILL         = 0x000004;
724120Sgblack@eecs.umich.edu    static const int TGT_SIGTRAP        = 0x000005;
734120Sgblack@eecs.umich.edu    static const int TGT_SIGABRT        = 0x000006;
744120Sgblack@eecs.umich.edu    static const int TGT_SIGIOT         = 0x000006;
754120Sgblack@eecs.umich.edu    static const int TGT_SIGBUS         = 0x000007;
764120Sgblack@eecs.umich.edu    static const int TGT_SIGFPE         = 0x000008;
774120Sgblack@eecs.umich.edu    static const int TGT_SIGKILL        = 0x000009;
784120Sgblack@eecs.umich.edu    static const int TGT_SIGUSR1        = 0x00000a;
794120Sgblack@eecs.umich.edu    static const int TGT_SIGSEGV        = 0x00000b;
804120Sgblack@eecs.umich.edu    static const int TGT_SIGUSR2        = 0x00000c;
814120Sgblack@eecs.umich.edu    static const int TGT_SIGPIPE        = 0x00000d;
824120Sgblack@eecs.umich.edu    static const int TGT_SIGALRM        = 0x00000e;
834120Sgblack@eecs.umich.edu    static const int TGT_SIGTERM        = 0x00000f;
844120Sgblack@eecs.umich.edu    static const int TGT_SIGSTKFLT      = 0x000010;
854120Sgblack@eecs.umich.edu    static const int TGT_SIGCHLD        = 0x000011;
864202Sbinkertn@umich.edu    static const int TGT_SIGCONT        = 0x000012;
875069Sgblack@eecs.umich.edu    static const int TGT_SIGSTOP        = 0x000013;
884202Sbinkertn@umich.edu    static const int TGT_SIGTSTP        = 0x000014;
895659Sgblack@eecs.umich.edu    static const int TGT_SIGTTIN        = 0x000015;
904601Sgblack@eecs.umich.edu    static const int TGT_SIGTTOU        = 0x000016;
915124Sgblack@eecs.umich.edu    static const int TGT_SIGURG         = 0x000017;
925083Sgblack@eecs.umich.edu    static const int TGT_SIGXCPU        = 0x000018;
934679Sgblack@eecs.umich.edu    static const int TGT_SIGXFSZ        = 0x000019;
946515Sgblack@eecs.umich.edu    static const int TGT_SIGVTALRM      = 0x00001a;
955083Sgblack@eecs.umich.edu    static const int TGT_SIGPROF        = 0x00001b;
964679Sgblack@eecs.umich.edu    static const int TGT_SIGWINCH       = 0x00001c;
974679Sgblack@eecs.umich.edu    static const int TGT_SIGIO          = 0x00001d;
986313Sgblack@eecs.umich.edu    static const int TGT_SIGPOLL        = 0x00001d;
996365Sgblack@eecs.umich.edu    static const int TGT_SIGPWR         = 0x00001e;
1005124Sgblack@eecs.umich.edu    static const int TGT_SIGSYS         = 0x00001f;
1014249Sgblack@eecs.umich.edu    static const int TGT_SIGUNUSED      = 0x00001f;
1024240Sgblack@eecs.umich.edu
1034202Sbinkertn@umich.edu    /// This table maps the target open() flags to the corresponding
1044997Sgblack@eecs.umich.edu    /// host open() flags.
1055135Sgblack@eecs.umich.edu    static SyscallFlagTransTable openFlagTable[];
1064997Sgblack@eecs.umich.edu
1076365Sgblack@eecs.umich.edu    /// Number of entries in openFlagTable[].
1086365Sgblack@eecs.umich.edu    static const int NUM_OPEN_FLAGS;
1094997Sgblack@eecs.umich.edu
1105800Snate@binkert.org    //@{
1115800Snate@binkert.org    /// Basic ARM Linux types
1124120Sgblack@eecs.umich.edu    typedef uint32_t size_t;
1134202Sbinkertn@umich.edu    typedef uint32_t off_t;
1145800Snate@binkert.org    typedef int32_t time_t;
1155904Sgblack@eecs.umich.edu    typedef int32_t clock_t;
1165904Sgblack@eecs.umich.edu    //@}
1175909Sgblack@eecs.umich.edu
1185649Sgblack@eecs.umich.edu    //@{
1195647Sgblack@eecs.umich.edu    /// open(2) flag values.
1205132Sgblack@eecs.umich.edu    static const int TGT_O_RDONLY    = 000000000; //!< O_RDONLY
1215132Sgblack@eecs.umich.edu    static const int TGT_O_WRONLY    = 000000001; //!< O_WRONLY
1224202Sbinkertn@umich.edu    static const int TGT_O_RDWR      = 000000002; //!< O_RDWR
1235647Sgblack@eecs.umich.edu    static const int TGT_O_CREAT     = 000000100; //!< O_CREAT
1245299Sgblack@eecs.umich.edu    static const int TGT_O_EXCL      = 000000200; //!< O_EXCL
1255245Sgblack@eecs.umich.edu    static const int TGT_O_NOCTTY    = 000000400; //!< O_NOCTTY
1265132Sgblack@eecs.umich.edu    static const int TGT_O_TRUNC     = 000001000; //!< O_TRUNC
1275086Sgblack@eecs.umich.edu    static const int TGT_O_APPEND    = 000002000; //!< O_APPEND
1285086Sgblack@eecs.umich.edu    static const int TGT_O_NONBLOCK  = 000004000; //!< O_NONBLOCK
1294202Sbinkertn@umich.edu    static const int TGT_O_DSYNC     = 000010000; //!< O_DSYNC
1304202Sbinkertn@umich.edu    static const int TGT_FASYNC      = 000020000; //!< FASYNC
1314120Sgblack@eecs.umich.edu    static const int TGT_O_DIRECT    = 000200000; //!< O_DIRECT
1324202Sbinkertn@umich.edu    static const int TGT_O_LARGEFILE = 000400000; //!< O_LARGEFILE
1334202Sbinkertn@umich.edu    static const int TGT_O_DIRECTORY = 000040000; //!< O_DIRECTORY
1344202Sbinkertn@umich.edu    static const int TGT_O_NOFOLLOW  = 000100000; //!< O_NOFOLLOW
1354120Sgblack@eecs.umich.edu    static const int TGT_O_NOATIME   = 001000000; //!< O_NOATIME
1365069Sgblack@eecs.umich.edu    static const int TGT_O_CLOEXEC   = 002000000; //!< O_NOATIME
1375081Sgblack@eecs.umich.edu    static const int TGT_O_SYNC      = 004010000; //!< O_SYNC
1385081Sgblack@eecs.umich.edu    static const int TGT_O_PATH      = 010000000; //!< O_PATH
1395081Sgblack@eecs.umich.edu    //@}
1405081Sgblack@eecs.umich.edu
1415081Sgblack@eecs.umich.edu    static const unsigned TGT_MAP_SHARED        = 0x00001;
1425081Sgblack@eecs.umich.edu    static const unsigned TGT_MAP_PRIVATE       = 0x00002;
1435081Sgblack@eecs.umich.edu    static const unsigned TGT_MAP_ANON          = 0x00020;
1445081Sgblack@eecs.umich.edu    static const unsigned TGT_MAP_DENYWRITE     = 0x00800;
1455081Sgblack@eecs.umich.edu    static const unsigned TGT_MAP_EXECUTABLE    = 0x01000;
1465081Sgblack@eecs.umich.edu    static const unsigned TGT_MAP_FILE          = 0x00000;
1475081Sgblack@eecs.umich.edu    static const unsigned TGT_MAP_GROWSDOWN     = 0x00100;
1485081Sgblack@eecs.umich.edu    static const unsigned TGT_MAP_HUGETLB       = 0x40000;
1495081Sgblack@eecs.umich.edu    static const unsigned TGT_MAP_LOCKED        = 0x02000;
1505081Sgblack@eecs.umich.edu    static const unsigned TGT_MAP_NONBLOCK      = 0x10000;
1515081Sgblack@eecs.umich.edu    static const unsigned TGT_MAP_NORESERVE     = 0x04000;
1525081Sgblack@eecs.umich.edu    static const unsigned TGT_MAP_POPULATE      = 0x08000;
1535081Sgblack@eecs.umich.edu    static const unsigned TGT_MAP_STACK         = 0x20000;
1545081Sgblack@eecs.umich.edu    static const unsigned TGT_MAP_ANONYMOUS     = 0x00020;
1555081Sgblack@eecs.umich.edu    static const unsigned TGT_MAP_FIXED         = 0x00010;
1565081Sgblack@eecs.umich.edu
1575081Sgblack@eecs.umich.edu    static const unsigned NUM_MMAP_FLAGS;
1585081Sgblack@eecs.umich.edu
1595081Sgblack@eecs.umich.edu    /// For table().
1605081Sgblack@eecs.umich.edu    static const int TBL_SYSINFO = 12;
1615081Sgblack@eecs.umich.edu
1625081Sgblack@eecs.umich.edu    /// Limit struct for getrlimit/setrlimit.
1635081Sgblack@eecs.umich.edu    struct rlimit {
1645081Sgblack@eecs.umich.edu        uint32_t  rlim_cur;     //!< soft limit
1655081Sgblack@eecs.umich.edu        uint32_t  rlim_max;     //!< hard limit
1665081Sgblack@eecs.umich.edu    };
1675081Sgblack@eecs.umich.edu
1685081Sgblack@eecs.umich.edu    /// For gettimeofday().
1695081Sgblack@eecs.umich.edu    struct timeval {
1705081Sgblack@eecs.umich.edu        int32_t tv_sec;         //!< seconds
1715081Sgblack@eecs.umich.edu        int32_t tv_usec;        //!< microseconds
1725081Sgblack@eecs.umich.edu    };
1735081Sgblack@eecs.umich.edu
1745081Sgblack@eecs.umich.edu    struct timespec {
1755081Sgblack@eecs.umich.edu        int32_t tv_sec;   //!< seconds
1765081Sgblack@eecs.umich.edu        int32_t tv_nsec;  //!< nanoseconds
1775081Sgblack@eecs.umich.edu    };
1785081Sgblack@eecs.umich.edu
1795081Sgblack@eecs.umich.edu    // For writev/readv
1805081Sgblack@eecs.umich.edu    struct tgt_iovec {
1815081Sgblack@eecs.umich.edu        uint32_t iov_base; // void *
1825081Sgblack@eecs.umich.edu        uint32_t iov_len;
1835081Sgblack@eecs.umich.edu    };
1845081Sgblack@eecs.umich.edu
1855081Sgblack@eecs.umich.edu
1865081Sgblack@eecs.umich.edu    typedef struct {
1875081Sgblack@eecs.umich.edu        uint32_t st_dev;
1885081Sgblack@eecs.umich.edu        uint32_t st_ino;
1895081Sgblack@eecs.umich.edu        uint16_t st_mode;
1905081Sgblack@eecs.umich.edu        uint16_t st_nlink;
1915081Sgblack@eecs.umich.edu        uint16_t st_uid;
1925680Sgblack@eecs.umich.edu        uint16_t st_gid;
1935081Sgblack@eecs.umich.edu        uint32_t st_rdev;
1945933Sgblack@eecs.umich.edu        uint32_t __pad1;
1955173Sgblack@eecs.umich.edu        uint32_t st_size;
1965359Sgblack@eecs.umich.edu        uint32_t st_blksize;
1975081Sgblack@eecs.umich.edu        uint32_t __pad2;
1985149Sgblack@eecs.umich.edu        uint32_t st_blocks;
1995298Sgblack@eecs.umich.edu        uint32_t st_atimeX;
2005081Sgblack@eecs.umich.edu        uint32_t st_atime_nsec;
2015081Sgblack@eecs.umich.edu        uint32_t st_mtimeX;
2025081Sgblack@eecs.umich.edu        uint32_t st_mtime_nsec;
2035081Sgblack@eecs.umich.edu        uint32_t st_ctimeX;
2045081Sgblack@eecs.umich.edu        uint32_t st_ctime_nsec;
2055081Sgblack@eecs.umich.edu    } tgt_stat;
2065081Sgblack@eecs.umich.edu
2075081Sgblack@eecs.umich.edu    typedef struct {
2085081Sgblack@eecs.umich.edu        uint64_t  st_dev;
2095081Sgblack@eecs.umich.edu        uint8_t   __pad0[4];
2105081Sgblack@eecs.umich.edu        uint32_t  __st_ino;
2115081Sgblack@eecs.umich.edu        uint32_t  st_mode;
2125081Sgblack@eecs.umich.edu        uint32_t  st_nlink;
2135081Sgblack@eecs.umich.edu        uint32_t  st_uid;
2145081Sgblack@eecs.umich.edu        uint32_t  st_gid;
2155081Sgblack@eecs.umich.edu        uint64_t  st_rdev;
2165081Sgblack@eecs.umich.edu        uint8_t   __pad3[4];
2175081Sgblack@eecs.umich.edu        int64_t   __attribute__ ((aligned (8))) st_size;
2185081Sgblack@eecs.umich.edu        uint32_t  st_blksize;
2195081Sgblack@eecs.umich.edu        uint64_t  __attribute__ ((aligned (8))) st_blocks;
2205081Sgblack@eecs.umich.edu        uint32_t  st_atimeX;
2215081Sgblack@eecs.umich.edu        uint32_t  st_atime_nsec;
2225081Sgblack@eecs.umich.edu        uint32_t  st_mtimeX;
2235081Sgblack@eecs.umich.edu        uint32_t  st_mtime_nsec;
2245081Sgblack@eecs.umich.edu        uint32_t  st_ctimeX;
2255081Sgblack@eecs.umich.edu        uint32_t  st_ctime_nsec;
2265081Sgblack@eecs.umich.edu        uint64_t  st_ino;
2275081Sgblack@eecs.umich.edu    } tgt_stat64;
2285081Sgblack@eecs.umich.edu
2295081Sgblack@eecs.umich.edu    typedef struct {
2305081Sgblack@eecs.umich.edu        int32_t  uptime;    /* Seconds since boot */
2315081Sgblack@eecs.umich.edu        uint32_t loads[3];  /* 1, 5, and 15 minute load averages */
2325081Sgblack@eecs.umich.edu        uint32_t totalram;  /* Total usable main memory size */
2335081Sgblack@eecs.umich.edu        uint32_t freeram;   /* Available memory size */
2345081Sgblack@eecs.umich.edu        uint32_t sharedram; /* Amount of shared memory */
2355081Sgblack@eecs.umich.edu        uint32_t bufferram; /* Memory used by buffers */
2365081Sgblack@eecs.umich.edu        uint32_t totalswap; /* Total swap space size */
2375081Sgblack@eecs.umich.edu        uint32_t freeswap;  /* swap space still available */
2385081Sgblack@eecs.umich.edu        uint16_t procs;     /* Number of current processes */
2395081Sgblack@eecs.umich.edu        uint32_t totalhigh; /* Total high memory size */
2405081Sgblack@eecs.umich.edu        uint32_t freehigh;  /* Available high memory size */
2415081Sgblack@eecs.umich.edu        uint32_t mem_unit;  /* Memory unit size in bytes */
2425081Sgblack@eecs.umich.edu    } tgt_sysinfo;
2435081Sgblack@eecs.umich.edu
2445081Sgblack@eecs.umich.edu    /// For getrusage().
2455081Sgblack@eecs.umich.edu    struct rusage {
2465081Sgblack@eecs.umich.edu        struct timeval ru_utime;        //!< user time used
2475081Sgblack@eecs.umich.edu        struct timeval ru_stime;        //!< system time used
2485081Sgblack@eecs.umich.edu        int32_t ru_maxrss;              //!< max rss
2495081Sgblack@eecs.umich.edu        int32_t ru_ixrss;               //!< integral shared memory size
2505081Sgblack@eecs.umich.edu        int32_t ru_idrss;               //!< integral unshared data "
2515081Sgblack@eecs.umich.edu        int32_t ru_isrss;               //!< integral unshared stack "
2525081Sgblack@eecs.umich.edu        int32_t ru_minflt;              //!< page reclaims - total vmfaults
2535081Sgblack@eecs.umich.edu        int32_t ru_majflt;              //!< page faults
2545081Sgblack@eecs.umich.edu        int32_t ru_nswap;               //!< swaps
2555081Sgblack@eecs.umich.edu        int32_t ru_inblock;             //!< block input operations
2565081Sgblack@eecs.umich.edu        int32_t ru_oublock;             //!< block output operations
2575081Sgblack@eecs.umich.edu        int32_t ru_msgsnd;              //!< messages sent
2585081Sgblack@eecs.umich.edu        int32_t ru_msgrcv;              //!< messages received
2595081Sgblack@eecs.umich.edu        int32_t ru_nsignals;            //!< signals received
2605081Sgblack@eecs.umich.edu        int32_t ru_nvcsw;               //!< voluntary context switches
2615081Sgblack@eecs.umich.edu        int32_t ru_nivcsw;              //!< involuntary "
2625081Sgblack@eecs.umich.edu    };
2635081Sgblack@eecs.umich.edu
2645081Sgblack@eecs.umich.edu    /// For times().
2655081Sgblack@eecs.umich.edu    struct tms {
2665081Sgblack@eecs.umich.edu        int32_t tms_utime;      //!< user time
2675081Sgblack@eecs.umich.edu        int32_t tms_stime;      //!< system time
2685081Sgblack@eecs.umich.edu        int32_t tms_cutime;     //!< user time of children
2695081Sgblack@eecs.umich.edu        int32_t tms_cstime;     //!< system time of children
2705081Sgblack@eecs.umich.edu    };
2715081Sgblack@eecs.umich.edu
2725081Sgblack@eecs.umich.edu    static void
2735081Sgblack@eecs.umich.edu    archClone(uint64_t flags,
2745081Sgblack@eecs.umich.edu              Process *pp, Process *cp,
2755081Sgblack@eecs.umich.edu              ThreadContext *ptc, ThreadContext *ctc,
2765081Sgblack@eecs.umich.edu              uint64_t stack, uint64_t tls)
2775081Sgblack@eecs.umich.edu    {
2785081Sgblack@eecs.umich.edu        ArmLinux::archClone(flags, pp, cp, ptc, ctc, stack, tls);
2795081Sgblack@eecs.umich.edu
2805081Sgblack@eecs.umich.edu        if (stack)
2815081Sgblack@eecs.umich.edu            ctc->setIntReg(ArmISA::INTREG_SP, stack);
2825081Sgblack@eecs.umich.edu    }
2835081Sgblack@eecs.umich.edu};
2845081Sgblack@eecs.umich.edu
2855081Sgblack@eecs.umich.educlass ArmLinux64 : public ArmLinux
2865081Sgblack@eecs.umich.edu{
2875081Sgblack@eecs.umich.edu  public:
2885081Sgblack@eecs.umich.edu
2895081Sgblack@eecs.umich.edu    static const int TGT_SIGHUP         = 0x000001;
2905081Sgblack@eecs.umich.edu    static const int TGT_SIGINT         = 0x000002;
2915081Sgblack@eecs.umich.edu    static const int TGT_SIGQUIT        = 0x000003;
2925081Sgblack@eecs.umich.edu    static const int TGT_SIGILL         = 0x000004;
2935081Sgblack@eecs.umich.edu    static const int TGT_SIGTRAP        = 0x000005;
2945081Sgblack@eecs.umich.edu    static const int TGT_SIGABRT        = 0x000006;
2955081Sgblack@eecs.umich.edu    static const int TGT_SIGIOT         = 0x000006;
2965081Sgblack@eecs.umich.edu    static const int TGT_SIGBUS         = 0x000007;
2975081Sgblack@eecs.umich.edu    static const int TGT_SIGFPE         = 0x000008;
2985081Sgblack@eecs.umich.edu    static const int TGT_SIGKILL        = 0x000009;
2995081Sgblack@eecs.umich.edu    static const int TGT_SIGUSR1        = 0x00000a;
3005081Sgblack@eecs.umich.edu    static const int TGT_SIGSEGV        = 0x00000b;
3015081Sgblack@eecs.umich.edu    static const int TGT_SIGUSR2        = 0x00000c;
3025081Sgblack@eecs.umich.edu    static const int TGT_SIGPIPE        = 0x00000d;
3035081Sgblack@eecs.umich.edu    static const int TGT_SIGALRM        = 0x00000e;
3045081Sgblack@eecs.umich.edu    static const int TGT_SIGTERM        = 0x00000f;
3055081Sgblack@eecs.umich.edu    static const int TGT_SIGSTKFLT      = 0x000010;
3065081Sgblack@eecs.umich.edu    static const int TGT_SIGCHLD        = 0x000011;
3075081Sgblack@eecs.umich.edu    static const int TGT_SIGCONT        = 0x000012;
3085081Sgblack@eecs.umich.edu    static const int TGT_SIGSTOP        = 0x000013;
3095081Sgblack@eecs.umich.edu    static const int TGT_SIGTSTP        = 0x000014;
3105081Sgblack@eecs.umich.edu    static const int TGT_SIGTTIN        = 0x000015;
3115081Sgblack@eecs.umich.edu    static const int TGT_SIGTTOU        = 0x000016;
3125081Sgblack@eecs.umich.edu    static const int TGT_SIGURG         = 0x000017;
3135081Sgblack@eecs.umich.edu    static const int TGT_SIGXCPU        = 0x000018;
3145081Sgblack@eecs.umich.edu    static const int TGT_SIGXFSZ        = 0x000019;
3155081Sgblack@eecs.umich.edu    static const int TGT_SIGVTALRM      = 0x00001a;
3165081Sgblack@eecs.umich.edu    static const int TGT_SIGPROF        = 0x00001b;
3175081Sgblack@eecs.umich.edu    static const int TGT_SIGWINCH       = 0x00001c;
3185081Sgblack@eecs.umich.edu    static const int TGT_SIGIO          = 0x00001d;
3195081Sgblack@eecs.umich.edu    static const int TGT_SIGPOLL        = 0x00001d;
3205081Sgblack@eecs.umich.edu    static const int TGT_SIGPWR         = 0x00001e;
3215081Sgblack@eecs.umich.edu    static const int TGT_SIGSYS         = 0x00001f;
3225081Sgblack@eecs.umich.edu    static const int TGT_SIGUNUSED      = 0x00001f;
3235081Sgblack@eecs.umich.edu
3245081Sgblack@eecs.umich.edu    /// This table maps the target open() flags to the corresponding
3255081Sgblack@eecs.umich.edu    /// host open() flags.
3265081Sgblack@eecs.umich.edu    static SyscallFlagTransTable openFlagTable[];
3275081Sgblack@eecs.umich.edu
3285081Sgblack@eecs.umich.edu    /// Number of entries in openFlagTable[].
3295081Sgblack@eecs.umich.edu    static const int NUM_OPEN_FLAGS;
3305081Sgblack@eecs.umich.edu
3315081Sgblack@eecs.umich.edu    //@{
3325081Sgblack@eecs.umich.edu    /// Basic ARM Linux types
3335081Sgblack@eecs.umich.edu    typedef uint64_t size_t;
3345081Sgblack@eecs.umich.edu    typedef uint64_t off_t;
3355081Sgblack@eecs.umich.edu    typedef int64_t time_t;
3365081Sgblack@eecs.umich.edu    typedef int64_t clock_t;
3375081Sgblack@eecs.umich.edu    //@}
3385081Sgblack@eecs.umich.edu
3395081Sgblack@eecs.umich.edu    //@{
3405081Sgblack@eecs.umich.edu    /// open(2) flag values.
3415081Sgblack@eecs.umich.edu    static const int TGT_O_RDONLY    = 000000000; //!< O_RDONLY
3425081Sgblack@eecs.umich.edu    static const int TGT_O_WRONLY    = 000000001; //!< O_WRONLY
3435081Sgblack@eecs.umich.edu    static const int TGT_O_RDWR      = 000000002; //!< O_RDWR
3445081Sgblack@eecs.umich.edu    static const int TGT_O_CREAT     = 000000100; //!< O_CREAT
3455081Sgblack@eecs.umich.edu    static const int TGT_O_EXCL      = 000000200; //!< O_EXCL
3465081Sgblack@eecs.umich.edu    static const int TGT_O_NOCTTY    = 000000400; //!< O_NOCTTY
3475081Sgblack@eecs.umich.edu    static const int TGT_O_TRUNC     = 000001000; //!< O_TRUNC
3485081Sgblack@eecs.umich.edu    static const int TGT_O_APPEND    = 000002000; //!< O_APPEND
3495081Sgblack@eecs.umich.edu    static const int TGT_O_NONBLOCK  = 000004000; //!< O_NONBLOCK
3505081Sgblack@eecs.umich.edu    static const int TGT_O_DSYNC     = 000010000; //!< O_DSYNC
3515081Sgblack@eecs.umich.edu    static const int TGT_FASYNC      = 000020000; //!< FASYNC
3525081Sgblack@eecs.umich.edu    static const int TGT_O_DIRECT    = 000200000; //!< O_DIRECT
3535081Sgblack@eecs.umich.edu    static const int TGT_O_LARGEFILE = 000400000; //!< O_LARGEFILE
3545081Sgblack@eecs.umich.edu    static const int TGT_O_DIRECTORY = 000040000; //!< O_DIRECTORY
3555069Sgblack@eecs.umich.edu    static const int TGT_O_NOFOLLOW  = 000100000; //!< O_NOFOLLOW
3564202Sbinkertn@umich.edu    static const int TGT_O_NOATIME   = 001000000; //!< O_NOATIME
3574202Sbinkertn@umich.edu    static const int TGT_O_CLOEXEC   = 002000000; //!< O_NOATIME
3584202Sbinkertn@umich.edu    static const int TGT_O_SYNC      = 004010000; //!< O_SYNC
3595069Sgblack@eecs.umich.edu    static const int TGT_O_PATH      = 010000000; //!< O_PATH
3605069Sgblack@eecs.umich.edu    //@}
3615069Sgblack@eecs.umich.edu
3625069Sgblack@eecs.umich.edu    /// For mmap().
3634202Sbinkertn@umich.edu    static SyscallFlagTransTable mmapFlagTable[];
3644202Sbinkertn@umich.edu
365    static const unsigned TGT_MAP_SHARED        = 0x00001;
366    static const unsigned TGT_MAP_PRIVATE       = 0x00002;
367    static const unsigned TGT_MAP_ANON          = 0x00020;
368    static const unsigned TGT_MAP_DENYWRITE     = 0x00800;
369    static const unsigned TGT_MAP_EXECUTABLE    = 0x01000;
370    static const unsigned TGT_MAP_FILE          = 0x00000;
371    static const unsigned TGT_MAP_GROWSDOWN     = 0x00100;
372    static const unsigned TGT_MAP_HUGETLB       = 0x40000;
373    static const unsigned TGT_MAP_LOCKED        = 0x02000;
374    static const unsigned TGT_MAP_NONBLOCK      = 0x10000;
375    static const unsigned TGT_MAP_NORESERVE     = 0x04000;
376    static const unsigned TGT_MAP_POPULATE      = 0x08000;
377    static const unsigned TGT_MAP_STACK         = 0x20000;
378    static const unsigned TGT_MAP_ANONYMOUS     = 0x00020;
379    static const unsigned TGT_MAP_FIXED         = 0x00010;
380
381    static const unsigned NUM_MMAP_FLAGS;
382
383    //@{
384    /// For getrusage().
385    static const int TGT_RUSAGE_SELF = 0;
386    static const int TGT_RUSAGE_CHILDREN = -1;
387    static const int TGT_RUSAGE_BOTH = -2;
388    //@}
389
390    //@{
391    /// ioctl() command codes.
392    static const unsigned TIOCGETP_   = 0x5401;
393    static const unsigned TIOCSETP_   = 0x80067409;
394    static const unsigned TIOCSETN_   = 0x8006740a;
395    static const unsigned TIOCSETC_   = 0x80067411;
396    static const unsigned TIOCGETC_   = 0x40067412;
397    static const unsigned FIONREAD_   = 0x4004667f;
398    static const unsigned TIOCISATTY_ = 0x2000745e;
399    static const unsigned TIOCGETS_   = 0x402c7413;
400    static const unsigned TIOCGETA_   = 0x5405;
401    static const unsigned TCSETAW_    = 0x5407;     // 2.6.15 kernel
402    //@}
403
404    /// For table().
405    static const int TBL_SYSINFO = 12;
406
407    /// Resource enumeration for getrlimit().
408    enum rlimit_resources {
409        TGT_RLIMIT_CPU = 0,
410        TGT_RLIMIT_FSIZE = 1,
411        TGT_RLIMIT_DATA = 2,
412        TGT_RLIMIT_STACK = 3,
413        TGT_RLIMIT_CORE = 4,
414        TGT_RLIMIT_RSS = 5,
415        TGT_RLIMIT_NPROC = 6,
416        TGT_RLIMIT_NOFILE = 7,
417        TGT_RLIMIT_MEMLOCK = 8,
418        TGT_RLIMIT_AS = 9,
419        TGT_RLIMIT_LOCKS = 10
420    };
421
422    /// Limit struct for getrlimit/setrlimit.
423    struct rlimit {
424        uint64_t  rlim_cur;     //!< soft limit
425        uint64_t  rlim_max;     //!< hard limit
426    };
427
428    /// For gettimeofday().
429    struct timeval {
430        int64_t tv_sec;         //!< seconds
431        int64_t tv_usec;        //!< microseconds
432    };
433
434    struct timespec {
435        int64_t tv_sec;   //!< seconds
436        int64_t tv_nsec;  //!< nanoseconds
437    };
438
439    // For writev/readv
440    struct tgt_iovec {
441        uint64_t iov_base; // void *
442        uint64_t iov_len;
443    };
444
445    typedef struct {
446        uint64_t st_dev;
447        uint64_t st_ino;
448        uint64_t st_nlink;
449        uint32_t st_mode;
450        uint32_t st_uid;
451        uint32_t st_gid;
452        uint32_t __pad0;
453        uint64_t st_rdev;
454        uint64_t st_size;
455        uint64_t st_blksize;
456        uint64_t st_blocks;
457        uint64_t st_atimeX;
458        uint64_t st_atime_nsec;
459        uint64_t st_mtimeX;
460        uint64_t st_mtime_nsec;
461        uint64_t st_ctimeX;
462        uint64_t st_ctime_nsec;
463    } tgt_stat;
464
465    typedef struct {
466        uint64_t st_dev;
467        uint64_t st_ino;
468        uint32_t st_mode;
469        uint32_t st_nlink;
470        uint32_t st_uid;
471        uint32_t st_gid;
472        uint32_t __pad0;
473        uint64_t st_rdev;
474        uint64_t st_size;
475        uint64_t st_blksize;
476        uint64_t st_blocks;
477        uint64_t st_atimeX;
478        uint64_t st_atime_nsec;
479        uint64_t st_mtimeX;
480        uint64_t st_mtime_nsec;
481        uint64_t st_ctimeX;
482        uint64_t st_ctime_nsec;
483    } tgt_stat64;
484
485    typedef struct {
486        int64_t  uptime;    /* Seconds since boot */
487        uint64_t loads[3];  /* 1, 5, and 15 minute load averages */
488        uint64_t totalram;  /* Total usable main memory size */
489        uint64_t freeram;   /* Available memory size */
490        uint64_t sharedram; /* Amount of shared memory */
491        uint64_t bufferram; /* Memory used by buffers */
492        uint64_t totalswap; /* Total swap space size */
493        uint64_t freeswap;  /* swap space still available */
494        uint16_t procs;     /* Number of current processes */
495        uint16_t pad;
496        uint64_t totalhigh; /* Total high memory size */
497        uint64_t freehigh;  /* Available high memory size */
498        uint32_t mem_unit;  /* Memory unit size in bytes */
499    } tgt_sysinfo;
500
501    /// For getrusage().
502    struct rusage {
503        struct timeval ru_utime;        //!< user time used
504        struct timeval ru_stime;        //!< system time used
505        int64_t ru_maxrss;              //!< max rss
506        int64_t ru_ixrss;               //!< integral shared memory size
507        int64_t ru_idrss;               //!< integral unshared data "
508        int64_t ru_isrss;               //!< integral unshared stack "
509        int64_t ru_minflt;              //!< page reclaims - total vmfaults
510        int64_t ru_majflt;              //!< page faults
511        int64_t ru_nswap;               //!< swaps
512        int64_t ru_inblock;             //!< block input operations
513        int64_t ru_oublock;             //!< block output operations
514        int64_t ru_msgsnd;              //!< messages sent
515        int64_t ru_msgrcv;              //!< messages received
516        int64_t ru_nsignals;            //!< signals received
517        int64_t ru_nvcsw;               //!< voluntary context switches
518        int64_t ru_nivcsw;              //!< involuntary "
519    };
520
521    /// For times().
522    struct tms {
523        int64_t tms_utime;      //!< user time
524        int64_t tms_stime;      //!< system time
525        int64_t tms_cutime;     //!< user time of children
526        int64_t tms_cstime;     //!< system time of children
527    };
528
529    static void archClone(uint64_t flags,
530                          Process *pp, Process *cp,
531                          ThreadContext *ptc, ThreadContext *ctc,
532                          uint64_t stack, uint64_t tls)
533    {
534        ArmLinux::archClone(flags, pp, cp, ptc, ctc, stack, tls);
535
536        if (stack)
537            ctc->setIntReg(ArmISA::INTREG_SP0, stack);
538    }
539};
540
541#endif
542