/*
 * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com>
 * All rights reserved.
 *
 * This software was developed by the University of Cambridge Computer
 * Laboratory as part of the CTSRD Project, with support from the UK Higher
 * Education Innovation Fund (HEIF).
 *
 * 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.
 */

#ifndef __ARCH_ARM_FREEBSD_FREEBSD_HH__
#define __ARCH_ARM_FREEBSD_FREEBSD_HH__

#include <map>

#include "kern/freebsd/freebsd.hh"
#include "sim/byteswap.hh"

namespace gem5
{

class ArmFreebsd : public FreeBSD
{
  public:
    static const ByteOrder byteOrder = ByteOrder::little;
};

class ArmFreebsd32 : public ArmFreebsd
{
  public:
    /// This table maps the target open() flags to the corresponding
    /// host open() flags.
    static const std::map<int, int> openFlagTable;

    //@{
    /// Basic ARM FreeBSD types
    typedef uint32_t size_t;
    typedef uint32_t off_t;
    typedef int32_t time_t;
    typedef int32_t clock_t;
    //@}

    //@{
    /// open(2) flag values.
    static const int TGT_O_RDONLY    = 0x00000000; //!< O_RDONLY
    static const int TGT_O_WRONLY    = 0x00000001; //!< O_WRONLY
    static const int TGT_O_RDWR      = 0x00000002; //!< O_RDWR
    static const int TGT_O_CREAT     = 0x00000200; //!< O_CREAT
    static const int TGT_O_EXCL      = 0x00000800; //!< O_EXCL
    static const int TGT_O_NOCTTY    = 0x00008000; //!< O_NOCTTY
    static const int TGT_O_TRUNC     = 0x00000400; //!< O_TRUNC
    static const int TGT_O_APPEND    = 0x00000008; //!< O_APPEND
    static const int TGT_O_NONBLOCK  = 0x00000004; //!< O_NONBLOCK
    static const int TGT_O_SYNC      = 0x00000080; //!< O_SYNC
    static const int TGT_FASYNC      = 0x00000040; //!< FASYNC
    static const int TGT_O_DIRECT    = 0x00010000; //!< O_DIRECT
    static const int TGT_O_DIRECTORY = 0x00020000; //!< O_DIRECTORY
    static const int TGT_O_NOFOLLOW  = 0x00000100; //!< O_NOFOLLOW
    static const int TGT_O_CLOEXEC   = 0x00100000; //!< O_CLOEXEC
    //@}

    /// For mmap().
    static const unsigned TGT_MAP_SHARED    = 0x0001;
    static const unsigned TGT_MAP_PRIVATE   = 0x0002;
    static const unsigned TGT_MAP_ANONYMOUS = 0x1000;
    static const unsigned TGT_MAP_FIXED     = 0x0010;

    /// Limit struct for getrlimit/setrlimit.
    struct rlimit
    {
        uint32_t  rlim_cur;     //!< soft limit
        uint32_t  rlim_max;     //!< hard limit
    };

    /// For gettimeofday().
    struct timeval
    {
        int32_t tv_sec;         //!< seconds
        int32_t tv_usec;        //!< microseconds
    };

    // For writev/readv
    struct tgt_iovec
    {
        uint32_t iov_base; // void *
        uint32_t iov_len;
    };

    /*
     * sizeof st 120
     * sizeof st_dev 4
     * sizeof st_ino 4
     * sizeof st_mode 2
     * sizeof st_nlink 2
     * sizeof st_uid 4
     * sizeof st_gid 4
     * sizeof st_rdev 4
     * sizeof st_atim 16
     * sizeof st_size 8
     * sizeof st_blocks 8
     * sizeof st_blksize 4
     * sizeof st_flags 4
     * sizeof st_gen 4
     * sizeof st_lspare 4
     */

    struct tgt_stat
    {
        uint32_t   st_dev;
        uint32_t   st_ino;
        uint16_t   st_mode;
        uint16_t   st_nlink;
        uint32_t   st_uid;
        uint32_t   st_gid;
        uint32_t   st_rdev;
        uint64_t   st_atimeX;
        uint64_t   st_atime_nsec;
        uint64_t   st_mtimeX;
        uint64_t   st_mtime_nsec;
        uint64_t   st_ctimeX;
        uint64_t   st_ctime_nsec;
        uint64_t   st_size;
        uint64_t   st_blocks;
        uint32_t   st_blksize;
        uint32_t   st_flags;
        uint32_t   st_gen;
        uint32_t   st_lspare;
        uint64_t   st_birthtimX;
        uint64_t   st_birthtim;
    };

    struct tgt_stat64
    {
        uint32_t   st_dev;
        uint32_t   st_ino;
        uint16_t   st_mode;
        uint16_t   st_nlink;
        uint32_t   st_uid;
        uint32_t   st_gid;
        uint32_t   st_rdev;
        uint64_t   st_atimeX;
        uint64_t   st_atime_nsec;
        uint64_t   st_mtimeX;
        uint64_t   st_mtime_nsec;
        uint64_t   st_ctimeX;
        uint64_t   st_ctime_nsec;
        uint64_t   st_size;
        uint64_t   st_blocks;
        uint32_t   st_blksize;
        uint32_t   st_flags;
        uint32_t   st_gen;
        uint32_t   st_lspare;
        uint64_t   st_birthtimX;
        uint64_t   st_birthtim;
    };

    /// For getrusage().
    struct rusage
    {
        struct timeval ru_utime;        //!< user time used
        struct timeval ru_stime;        //!< system time used
        int32_t ru_maxrss;              //!< max rss
        int32_t ru_ixrss;               //!< integral shared memory size
        int32_t ru_idrss;               //!< integral unshared data "
        int32_t ru_isrss;               //!< integral unshared stack "
        int32_t ru_minflt;              //!< page reclaims - total vmfaults
        int32_t ru_majflt;              //!< page faults
        int32_t ru_nswap;               //!< swaps
        int32_t ru_inblock;             //!< block input operations
        int32_t ru_oublock;             //!< block output operations
        int32_t ru_msgsnd;              //!< messages sent
        int32_t ru_msgrcv;              //!< messages received
        int32_t ru_nsignals;            //!< signals received
        int32_t ru_nvcsw;               //!< voluntary context switches
        int32_t ru_nivcsw;              //!< involuntary "
    };

    /// For times().
    struct tms
    {
        int32_t tms_utime;      //!< user time
        int32_t tms_stime;      //!< system time
        int32_t tms_cutime;     //!< user time of children
        int32_t tms_cstime;     //!< system time of children
    };
};

class ArmFreebsd64 : public ArmFreebsd
{
  public:

    /// This table maps the target open() flags to the corresponding
    /// host open() flags.
    static const std::map<int, int> openFlagTable;

    //@{
    /// Basic ARM FreeBSD types
    typedef uint64_t size_t;
    typedef uint64_t off_t;
    typedef int64_t time_t;
    typedef int64_t clock_t;
    //@}

    //@{
    /// open(2) flag values.
    static const int TGT_O_RDONLY    = 0x00000000; //!< O_RDONLY
    static const int TGT_O_WRONLY    = 0x00000001; //!< O_WRONLY
    static const int TGT_O_RDWR      = 0x00000002; //!< O_RDWR
    static const int TGT_O_CREAT     = 0x00000200; //!< O_CREAT
    static const int TGT_O_EXCL      = 0x00000800; //!< O_EXCL
    static const int TGT_O_NOCTTY    = 0x00008000; //!< O_NOCTTY
    static const int TGT_O_TRUNC     = 0x00000400; //!< O_TRUNC
    static const int TGT_O_APPEND    = 0x00000008; //!< O_APPEND
    static const int TGT_O_NONBLOCK  = 0x00000004; //!< O_NONBLOCK
    static const int TGT_O_SYNC      = 0x00000080; //!< O_SYNC
    static const int TGT_FASYNC      = 0x00000040; //!< FASYNC
    static const int TGT_O_DIRECT    = 0x00010000; //!< O_DIRECT
    static const int TGT_O_DIRECTORY = 0x00020000; //!< O_DIRECTORY
    static const int TGT_O_NOFOLLOW  = 0x00000100; //!< O_NOFOLLOW
    static const int TGT_O_CLOEXEC   = 0x00100000; //!< O_CLOEXEC
    //@}

    /// For mmap().
    static const unsigned TGT_MAP_SHARED    = 0x0001;
    static const unsigned TGT_MAP_PRIVATE   = 0x0002;
    static const unsigned TGT_MAP_ANONYMOUS = 0x1000;
    static const unsigned TGT_MAP_FIXED     = 0x0010;

    //@{
    /// For getrusage().
    static const int TGT_RUSAGE_SELF = 0;
    static const int TGT_RUSAGE_CHILDREN = -1;
    static const int TGT_RUSAGE_THREAD = 1;
    //@}

    /// Resource enumeration for getrlimit().
    enum rlimit_resources
    {
        TGT_RLIMIT_CPU = 0,
        TGT_RLIMIT_FSIZE = 1,
        TGT_RLIMIT_DATA = 2,
        TGT_RLIMIT_STACK = 3,
        TGT_RLIMIT_CORE = 4,
        TGT_RLIMIT_RSS = 5,
        TGT_RLIMIT_MEMLOCK = 6,
        TGT_RLIMIT_NPROC = 7,
        TGT_RLIMIT_NOFILE = 8,
        TGT_RLIMIT_SBSIZE = 9,
        TGT_RLIMIT_VMEM = 10,
        TGT_RLIMIT_AS = TGT_RLIMIT_VMEM,
        TGT_RLIMIT_NPTS = 11,
        TGT_RLIMIT_SWAP = 12,
        TGT_RLIMIT_KQUEUES = 13
    };

    /// 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;
    };

    struct tgt_stat
    {
        uint32_t   st_dev;
        uint32_t   st_ino;
        uint16_t   st_mode;
        uint16_t   st_nlink;
        uint32_t   st_uid;
        uint32_t   st_gid;
        uint32_t   st_rdev;
        uint64_t   st_atimeX;
        uint64_t   st_atime_nsec;
        uint64_t   st_mtimeX;
        uint64_t   st_mtime_nsec;
        uint64_t   st_ctimeX;
        uint64_t   st_ctime_nsec;
        uint64_t   st_size;
        uint64_t   st_blocks;
        uint32_t   st_blksize;
        uint32_t   st_flags;
        uint32_t   st_gen;
        uint32_t   st_lspare;
        uint64_t   st_birthtimX;
        uint64_t   st_birthtim;
    };

    struct tgt_stat64
    {
        uint32_t   st_dev;
        uint32_t   st_ino;
        uint16_t   st_mode;
        uint16_t   st_nlink;
        uint32_t   st_uid;
        uint32_t   st_gid;
        uint32_t   st_rdev;
        uint64_t   st_atimeX;
        uint64_t   st_atime_nsec;
        uint64_t   st_mtimeX;
        uint64_t   st_mtime_nsec;
        uint64_t   st_ctimeX;
        uint64_t   st_ctime_nsec;
        uint64_t   st_size;
        uint64_t   st_blocks;
        uint32_t   st_blksize;
        uint32_t   st_flags;
        uint32_t   st_gen;
        uint32_t   st_lspare;
        uint64_t   st_birthtimX;
        uint64_t   st_birthtim;
    };

    /// 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 "
    };

    /// For times().
    struct tms
    {
        int64_t tms_utime;      //!< user time
        int64_t tms_stime;      //!< system time
        int64_t tms_cutime;     //!< user time of children
        int64_t tms_cstime;     //!< system time of children
    };
};

} // namespace gem5

#endif
