| /* | |
| * 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 |