/*
 * 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 "kern/linux/flag_tables.hh"
#include "sim/byteswap.hh"

namespace gem5
{

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

class ArmFreebsd32 : public ArmFreebsd, public OpenFlagTable<ArmFreebsd32>
{
  public:
    //@{
    /// 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 constexpr int TGT_O_RDONLY    = 0x00000000; //!< O_RDONLY
    static constexpr int TGT_O_WRONLY    = 0x00000001; //!< O_WRONLY
    static constexpr int TGT_O_RDWR      = 0x00000002; //!< O_RDWR
    static constexpr int TGT_O_CREAT     = 0x00000200; //!< O_CREAT
    static constexpr int TGT_O_EXCL      = 0x00000800; //!< O_EXCL
    static constexpr int TGT_O_NOCTTY    = 0x00008000; //!< O_NOCTTY
    static constexpr int TGT_O_TRUNC     = 0x00000400; //!< O_TRUNC
    static constexpr int TGT_O_APPEND    = 0x00000008; //!< O_APPEND
    static constexpr int TGT_O_NONBLOCK  = 0x00000004; //!< O_NONBLOCK
    static constexpr int TGT_O_SYNC      = 0x00000080; //!< O_SYNC
    static constexpr int TGT_FASYNC      = 0x00000040; //!< FASYNC
    static constexpr int TGT_O_DIRECT    = 0x00010000; //!< O_DIRECT
    static constexpr int TGT_O_DIRECTORY = 0x00020000; //!< O_DIRECTORY
    static constexpr int TGT_O_NOFOLLOW  = 0x00000100; //!< O_NOFOLLOW
    static constexpr int TGT_O_CLOEXEC   = 0x00100000; //!< O_CLOEXEC
    //@}

    /// For mmap().
    static constexpr unsigned TGT_MAP_SHARED    = 0x0001;
    static constexpr unsigned TGT_MAP_PRIVATE   = 0x0002;
    static constexpr unsigned TGT_MAP_ANONYMOUS = 0x1000;
    static constexpr 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 OpenFlagTable<ArmFreebsd64>
{
  public:

    //@{
    /// 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 constexpr int TGT_O_RDONLY    = 0x00000000; //!< O_RDONLY
    static constexpr int TGT_O_WRONLY    = 0x00000001; //!< O_WRONLY
    static constexpr int TGT_O_RDWR      = 0x00000002; //!< O_RDWR
    static constexpr int TGT_O_CREAT     = 0x00000200; //!< O_CREAT
    static constexpr int TGT_O_EXCL      = 0x00000800; //!< O_EXCL
    static constexpr int TGT_O_NOCTTY    = 0x00008000; //!< O_NOCTTY
    static constexpr int TGT_O_TRUNC     = 0x00000400; //!< O_TRUNC
    static constexpr int TGT_O_APPEND    = 0x00000008; //!< O_APPEND
    static constexpr int TGT_O_NONBLOCK  = 0x00000004; //!< O_NONBLOCK
    static constexpr int TGT_O_SYNC      = 0x00000080; //!< O_SYNC
    static constexpr int TGT_FASYNC      = 0x00000040; //!< FASYNC
    static constexpr int TGT_O_DIRECT    = 0x00010000; //!< O_DIRECT
    static constexpr int TGT_O_DIRECTORY = 0x00020000; //!< O_DIRECTORY
    static constexpr int TGT_O_NOFOLLOW  = 0x00000100; //!< O_NOFOLLOW
    static constexpr int TGT_O_CLOEXEC   = 0x00100000; //!< O_CLOEXEC
    //@}

    /// For mmap().
    static constexpr unsigned TGT_MAP_SHARED    = 0x0001;
    static constexpr unsigned TGT_MAP_PRIVATE   = 0x0002;
    static constexpr unsigned TGT_MAP_ANONYMOUS = 0x1000;
    static constexpr 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
