1/* 2 * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com> 3 * All rights reserved. 4 * 5 * This software was developed by the University of Cambridge Computer 6 * Laboratory as part of the CTSRD Project, with support from the UK Higher 7 * Education Innovation Fund (HEIF). 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions are 11 * met: redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer; 13 * redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution; 16 * neither the name of the copyright holders nor the names of its 17 * contributors may be used to endorse or promote products derived from 18 * this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33#ifndef __ARCH_ARM_FREEBSD_FREEBSD_HH__ 34#define __ARCH_ARM_FREEBSD_FREEBSD_HH__ 35 36#include "kern/freebsd/freebsd.hh" 37 38class ArmFreebsd32 : public FreeBSD 39{ 40 public: 41 42 /// This table maps the target open() flags to the corresponding 43 /// host open() flags. 44 static SyscallFlagTransTable openFlagTable[]; 45 46 /// Number of entries in openFlagTable[]. 47 static const int NUM_OPEN_FLAGS; 48 49 //@{ 50 /// Basic ARM FreeBSD types 51 typedef uint32_t size_t; 52 typedef uint32_t off_t; 53 typedef int32_t time_t; 54 typedef int32_t clock_t; 55 //@} 56 57 //@{ 58 /// open(2) flag values. 59 static const int TGT_O_RDONLY = 0x00000000; //!< O_RDONLY 60 static const int TGT_O_WRONLY = 0x00000001; //!< O_WRONLY 61 static const int TGT_O_RDWR = 0x00000002; //!< O_RDWR 62 static const int TGT_O_CREAT = 0x00000200; //!< O_CREAT 63 static const int TGT_O_EXCL = 0x00000800; //!< O_EXCL 64 static const int TGT_O_NOCTTY = 0x00008000; //!< O_NOCTTY 65 static const int TGT_O_TRUNC = 0x00000400; //!< O_TRUNC 66 static const int TGT_O_APPEND = 0x00000008; //!< O_APPEND 67 static const int TGT_O_NONBLOCK = 0x00000004; //!< O_NONBLOCK 68 static const int TGT_O_SYNC = 0x00000080; //!< O_SYNC 69 static const int TGT_FASYNC = 0x00000040; //!< FASYNC 70 static const int TGT_O_DIRECT = 0x00010000; //!< O_DIRECT 71 static const int TGT_O_DIRECTORY = 0x00020000; //!< O_DIRECTORY 72 static const int TGT_O_NOFOLLOW = 0x00000100; //!< O_NOFOLLOW 73 static const int TGT_O_CLOEXEC = 0x00100000; //!< O_CLOEXEC 74 //@} 75 76 /// For mmap(). 77 static const unsigned TGT_MAP_SHARED = 0x0001; 78 static const unsigned TGT_MAP_PRIVATE = 0x0002; 79 static const unsigned TGT_MAP_ANONYMOUS = 0x1000; 80 static const unsigned TGT_MAP_FIXED = 0x0010; 81 82 /// Limit struct for getrlimit/setrlimit. 83 struct rlimit { 84 uint32_t rlim_cur; //!< soft limit 85 uint32_t rlim_max; //!< hard limit 86 }; 87 88 /// For gettimeofday(). 89 struct timeval { 90 int32_t tv_sec; //!< seconds 91 int32_t tv_usec; //!< microseconds 92 }; 93 94 // For writev/readv 95 struct tgt_iovec { 96 uint32_t iov_base; // void * 97 uint32_t iov_len; 98 }; 99 100 /* 101 * sizeof st 120 102 * sizeof st_dev 4 103 * sizeof st_ino 4 104 * sizeof st_mode 2 105 * sizeof st_nlink 2 106 * sizeof st_uid 4 107 * sizeof st_gid 4 108 * sizeof st_rdev 4 109 * sizeof st_atim 16 110 * sizeof st_size 8 111 * sizeof st_blocks 8 112 * sizeof st_blksize 4 113 * sizeof st_flags 4 114 * sizeof st_gen 4 115 * sizeof st_lspare 4 116 */ 117 118 typedef struct { 119 uint32_t st_dev; 120 uint32_t st_ino; 121 uint16_t st_mode; 122 uint16_t st_nlink; 123 uint32_t st_uid; 124 uint32_t st_gid; 125 uint32_t st_rdev; 126 uint64_t st_atimeX; 127 uint64_t st_atime_nsec; 128 uint64_t st_mtimeX; 129 uint64_t st_mtime_nsec; 130 uint64_t st_ctimeX; 131 uint64_t st_ctime_nsec; 132 uint64_t st_size; 133 uint64_t st_blocks; 134 uint32_t st_blksize; 135 uint32_t st_flags; 136 uint32_t st_gen; 137 uint32_t st_lspare; 138 uint64_t st_birthtimX; 139 uint64_t st_birthtim; 140 } tgt_stat; 141 142 typedef struct { 143 uint32_t st_dev; 144 uint32_t st_ino; 145 uint16_t st_mode; 146 uint16_t st_nlink; 147 uint32_t st_uid; 148 uint32_t st_gid; 149 uint32_t st_rdev; 150 uint64_t st_atimeX; 151 uint64_t st_atime_nsec; 152 uint64_t st_mtimeX; 153 uint64_t st_mtime_nsec; 154 uint64_t st_ctimeX; 155 uint64_t st_ctime_nsec; 156 uint64_t st_size; 157 uint64_t st_blocks; 158 uint32_t st_blksize; 159 uint32_t st_flags; 160 uint32_t st_gen; 161 uint32_t st_lspare; 162 uint64_t st_birthtimX; 163 uint64_t st_birthtim; 164 } tgt_stat64; 165 166 /// For getrusage(). 167 struct rusage { 168 struct timeval ru_utime; //!< user time used 169 struct timeval ru_stime; //!< system time used 170 int32_t ru_maxrss; //!< max rss 171 int32_t ru_ixrss; //!< integral shared memory size 172 int32_t ru_idrss; //!< integral unshared data " 173 int32_t ru_isrss; //!< integral unshared stack " 174 int32_t ru_minflt; //!< page reclaims - total vmfaults 175 int32_t ru_majflt; //!< page faults 176 int32_t ru_nswap; //!< swaps 177 int32_t ru_inblock; //!< block input operations 178 int32_t ru_oublock; //!< block output operations 179 int32_t ru_msgsnd; //!< messages sent 180 int32_t ru_msgrcv; //!< messages received 181 int32_t ru_nsignals; //!< signals received 182 int32_t ru_nvcsw; //!< voluntary context switches 183 int32_t ru_nivcsw; //!< involuntary " 184 }; 185 186 /// For times(). 187 struct tms { 188 int32_t tms_utime; //!< user time 189 int32_t tms_stime; //!< system time 190 int32_t tms_cutime; //!< user time of children 191 int32_t tms_cstime; //!< system time of children 192 }; 193}; 194 195class ArmFreebsd64 : public FreeBSD 196{ 197 public: 198 199 /// This table maps the target open() flags to the corresponding 200 /// host open() flags. 201 static SyscallFlagTransTable openFlagTable[]; 202 203 /// Number of entries in openFlagTable[]. 204 static const int NUM_OPEN_FLAGS; 205 206 //@{ 207 /// Basic ARM FreeBSD types 208 typedef uint64_t size_t; 209 typedef uint64_t off_t; 210 typedef int64_t time_t; 211 typedef int64_t clock_t; 212 //@} 213 214 //@{ 215 /// open(2) flag values. 216 static const int TGT_O_RDONLY = 0x00000000; //!< O_RDONLY 217 static const int TGT_O_WRONLY = 0x00000001; //!< O_WRONLY 218 static const int TGT_O_RDWR = 0x00000002; //!< O_RDWR 219 static const int TGT_O_CREAT = 0x00000200; //!< O_CREAT 220 static const int TGT_O_EXCL = 0x00000800; //!< O_EXCL 221 static const int TGT_O_NOCTTY = 0x00008000; //!< O_NOCTTY 222 static const int TGT_O_TRUNC = 0x00000400; //!< O_TRUNC 223 static const int TGT_O_APPEND = 0x00000008; //!< O_APPEND 224 static const int TGT_O_NONBLOCK = 0x00000004; //!< O_NONBLOCK 225 static const int TGT_O_SYNC = 0x00000080; //!< O_SYNC 226 static const int TGT_FASYNC = 0x00000040; //!< FASYNC 227 static const int TGT_O_DIRECT = 0x00010000; //!< O_DIRECT 228 static const int TGT_O_DIRECTORY = 0x00020000; //!< O_DIRECTORY 229 static const int TGT_O_NOFOLLOW = 0x00000100; //!< O_NOFOLLOW 230 static const int TGT_O_CLOEXEC = 0x00100000; //!< O_CLOEXEC 231 //@} 232 233 /// For mmap(). 234 static const unsigned TGT_MAP_SHARED = 0x0001; 235 static const unsigned TGT_MAP_PRIVATE = 0x0002; 236 static const unsigned TGT_MAP_ANONYMOUS = 0x1000; 237 static const unsigned TGT_MAP_FIXED = 0x0010; 238 239 //@{ 240 /// For getrusage(). 241 static const int TGT_RUSAGE_SELF = 0; 242 static const int TGT_RUSAGE_CHILDREN = -1; 243 static const int TGT_RUSAGE_THREAD = 1; 244 //@} 245 246 /// Resource enumeration for getrlimit(). 247 enum rlimit_resources { 248 TGT_RLIMIT_CPU = 0, 249 TGT_RLIMIT_FSIZE = 1, 250 TGT_RLIMIT_DATA = 2, 251 TGT_RLIMIT_STACK = 3, 252 TGT_RLIMIT_CORE = 4, 253 TGT_RLIMIT_RSS = 5, 254 TGT_RLIMIT_MEMLOCK = 6, 255 TGT_RLIMIT_NPROC = 7, 256 TGT_RLIMIT_NOFILE = 8, 257 TGT_RLIMIT_SBSIZE = 9, 258 TGT_RLIMIT_VMEM = 10, 259 TGT_RLIMIT_AS = TGT_RLIMIT_VMEM, 260 TGT_RLIMIT_NPTS = 11, 261 TGT_RLIMIT_SWAP = 12, 262 TGT_RLIMIT_KQUEUES = 13 263 }; 264 265 /// Limit struct for getrlimit/setrlimit. 266 struct rlimit { 267 uint64_t rlim_cur; //!< soft limit 268 uint64_t rlim_max; //!< hard limit 269 }; 270 271 /// For gettimeofday(). 272 struct timeval { 273 int64_t tv_sec; //!< seconds 274 int64_t tv_usec; //!< microseconds 275 }; 276 277 // For writev/readv 278 struct tgt_iovec { 279 uint64_t iov_base; // void * 280 uint64_t iov_len; 281 }; 282 283 typedef struct { 284 uint32_t st_dev; 285 uint32_t st_ino; 286 uint16_t st_mode; 287 uint16_t st_nlink; 288 uint32_t st_uid; 289 uint32_t st_gid; 290 uint32_t st_rdev; 291 uint64_t st_atimeX; 292 uint64_t st_atime_nsec; 293 uint64_t st_mtimeX; 294 uint64_t st_mtime_nsec; 295 uint64_t st_ctimeX; 296 uint64_t st_ctime_nsec; 297 uint64_t st_size; 298 uint64_t st_blocks; 299 uint32_t st_blksize; 300 uint32_t st_flags; 301 uint32_t st_gen; 302 uint32_t st_lspare; 303 uint64_t st_birthtimX; 304 uint64_t st_birthtim; 305 } tgt_stat; 306 307 typedef struct { 308 uint32_t st_dev; 309 uint32_t st_ino; 310 uint16_t st_mode; 311 uint16_t st_nlink; 312 uint32_t st_uid; 313 uint32_t st_gid; 314 uint32_t st_rdev; 315 uint64_t st_atimeX; 316 uint64_t st_atime_nsec; 317 uint64_t st_mtimeX; 318 uint64_t st_mtime_nsec; 319 uint64_t st_ctimeX; 320 uint64_t st_ctime_nsec; 321 uint64_t st_size; 322 uint64_t st_blocks; 323 uint32_t st_blksize; 324 uint32_t st_flags; 325 uint32_t st_gen; 326 uint32_t st_lspare; 327 uint64_t st_birthtimX; 328 uint64_t st_birthtim; 329 } tgt_stat64; 330 331 /// For getrusage(). 332 struct rusage { 333 struct timeval ru_utime; //!< user time used 334 struct timeval ru_stime; //!< system time used 335 int64_t ru_maxrss; //!< max rss 336 int64_t ru_ixrss; //!< integral shared memory size 337 int64_t ru_idrss; //!< integral unshared data " 338 int64_t ru_isrss; //!< integral unshared stack " 339 int64_t ru_minflt; //!< page reclaims - total vmfaults 340 int64_t ru_majflt; //!< page faults 341 int64_t ru_nswap; //!< swaps 342 int64_t ru_inblock; //!< block input operations 343 int64_t ru_oublock; //!< block output operations 344 int64_t ru_msgsnd; //!< messages sent 345 int64_t ru_msgrcv; //!< messages received 346 int64_t ru_nsignals; //!< signals received 347 int64_t ru_nvcsw; //!< voluntary context switches 348 int64_t ru_nivcsw; //!< involuntary " 349 }; 350 351 /// For times(). 352 struct tms { 353 int64_t tms_utime; //!< user time 354 int64_t tms_stime; //!< system time 355 int64_t tms_cutime; //!< user time of children 356 int64_t tms_cstime; //!< system time of children 357 }; 358}; 359 360#endif 361