linux.hh revision 5795
1451SN/A/* 25795Ssaidi@eecs.umich.edu * Copyright (c) 2004-2009 The Regents of The University of Michigan 3451SN/A * All rights reserved. 4451SN/A * 5451SN/A * Redistribution and use in source and binary forms, with or without 6451SN/A * modification, are permitted provided that the following conditions are 7451SN/A * met: redistributions of source code must retain the above copyright 8451SN/A * notice, this list of conditions and the following disclaimer; 9451SN/A * redistributions in binary form must reproduce the above copyright 10451SN/A * notice, this list of conditions and the following disclaimer in the 11451SN/A * documentation and/or other materials provided with the distribution; 12451SN/A * neither the name of the copyright holders nor the names of its 13451SN/A * contributors may be used to endorse or promote products derived from 14451SN/A * this software without specific prior written permission. 15451SN/A * 16451SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17451SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18451SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19451SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20451SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21451SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22451SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23451SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24451SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25451SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26451SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665Ssaidi@eecs.umich.edu * 282665Ssaidi@eecs.umich.edu * Authors: Ali Saidi 29451SN/A */ 30451SN/A 31451SN/A#ifndef __LINUX_HH__ 32451SN/A#define __LINUX_HH__ 332093SN/A#include "config/full_system.hh" 342093SN/A 352093SN/A#if FULL_SYSTEM 36451SN/A 37451SN/Aclass Linux {}; 38451SN/A 392093SN/A#else //!FULL_SYSTEM 402093SN/A 413113Sgblack@eecs.umich.edu#include <inttypes.h> 425795Ssaidi@eecs.umich.edu#include <string> 432093SN/A 443113Sgblack@eecs.umich.edu#include "kern/operatingsystem.hh" 452423SN/A 465795Ssaidi@eecs.umich.educlass ThreadContext; 475795Ssaidi@eecs.umich.educlass LiveProcess; 485795Ssaidi@eecs.umich.edu 492093SN/A/// 502093SN/A/// This class encapsulates the types, structures, constants, 512093SN/A/// functions, and syscall-number mappings specific to the Alpha Linux 522093SN/A/// syscall interface. 532093SN/A/// 543113Sgblack@eecs.umich.educlass Linux : public OperatingSystem 553113Sgblack@eecs.umich.edu{ 562093SN/A 572093SN/A public: 582093SN/A 592093SN/A //@{ 602093SN/A /// Basic Linux types. 613122Sgblack@eecs.umich.edu typedef uint64_t size_t; 622093SN/A typedef uint64_t off_t; 632093SN/A typedef int64_t time_t; 642093SN/A typedef uint32_t uid_t; 653122Sgblack@eecs.umich.edu typedef uint32_t gid_t; 662093SN/A //@} 672093SN/A 682093SN/A /// Stat buffer. Note that we can't call it 'stat' since that 693113Sgblack@eecs.umich.edu /// gets #defined to something else on some systems. This type 703113Sgblack@eecs.umich.edu /// can be specialized by architecture specific "Linux" classes 713113Sgblack@eecs.umich.edu typedef struct { 725543Ssaidi@eecs.umich.edu uint32_t st_dev; //!< device 735543Ssaidi@eecs.umich.edu uint32_t st_ino; //!< inode 745543Ssaidi@eecs.umich.edu uint32_t st_mode; //!< mode 755543Ssaidi@eecs.umich.edu uint32_t st_nlink; //!< link count 765543Ssaidi@eecs.umich.edu uint32_t st_uid; //!< owner's user ID 775543Ssaidi@eecs.umich.edu uint32_t st_gid; //!< owner's group ID 785543Ssaidi@eecs.umich.edu uint32_t st_rdev; //!< device number 795543Ssaidi@eecs.umich.edu int32_t _pad1; //!< for alignment 805543Ssaidi@eecs.umich.edu int64_t st_size; //!< file size in bytes 815543Ssaidi@eecs.umich.edu uint64_t st_atimeX; //!< time of last access 825543Ssaidi@eecs.umich.edu uint64_t st_mtimeX; //!< time of last modification 835543Ssaidi@eecs.umich.edu uint64_t st_ctimeX; //!< time of last status change 845543Ssaidi@eecs.umich.edu uint32_t st_blksize; //!< optimal I/O block size 855543Ssaidi@eecs.umich.edu int32_t st_blocks; //!< number of blocks allocated 865543Ssaidi@eecs.umich.edu uint32_t st_flags; //!< flags 875543Ssaidi@eecs.umich.edu uint32_t st_gen; //!< unknown 883113Sgblack@eecs.umich.edu } tgt_stat; 892093SN/A 902093SN/A // same for stat64 913113Sgblack@eecs.umich.edu typedef struct { 925543Ssaidi@eecs.umich.edu uint64_t st_dev; 935543Ssaidi@eecs.umich.edu uint64_t st_ino; 945543Ssaidi@eecs.umich.edu uint64_t st_rdev; 955543Ssaidi@eecs.umich.edu int64_t st_size; 965543Ssaidi@eecs.umich.edu uint64_t st_blocks; 972093SN/A 985543Ssaidi@eecs.umich.edu uint32_t st_mode; 995543Ssaidi@eecs.umich.edu uint32_t st_uid; 1005543Ssaidi@eecs.umich.edu uint32_t st_gid; 1015543Ssaidi@eecs.umich.edu uint32_t st_blksize; 1025543Ssaidi@eecs.umich.edu uint32_t st_nlink; 1035543Ssaidi@eecs.umich.edu uint32_t __pad0; 1042093SN/A 1055543Ssaidi@eecs.umich.edu uint64_t st_atimeX; 1065543Ssaidi@eecs.umich.edu uint64_t st_atime_nsec; 1075543Ssaidi@eecs.umich.edu uint64_t st_mtimeX; 1085543Ssaidi@eecs.umich.edu uint64_t st_mtime_nsec; 1095543Ssaidi@eecs.umich.edu uint64_t st_ctimeX; 1105543Ssaidi@eecs.umich.edu uint64_t st_ctime_nsec; 1115543Ssaidi@eecs.umich.edu int64_t ___unused[3]; 1123113Sgblack@eecs.umich.edu } tgt_stat64; 1132093SN/A 1142093SN/A /// Length of strings in struct utsname (plus 1 for null char). 1152093SN/A static const int _SYS_NMLN = 65; 1162093SN/A 1172093SN/A /// Interface struct for uname(). 1182093SN/A struct utsname { 1195543Ssaidi@eecs.umich.edu char sysname[_SYS_NMLN]; //!< System name. 1205543Ssaidi@eecs.umich.edu char nodename[_SYS_NMLN]; //!< Node name. 1215543Ssaidi@eecs.umich.edu char release[_SYS_NMLN]; //!< OS release. 1225543Ssaidi@eecs.umich.edu char version[_SYS_NMLN]; //!< OS version. 1235543Ssaidi@eecs.umich.edu char machine[_SYS_NMLN]; //!< Machine type. 1242093SN/A }; 1252093SN/A 1262093SN/A /// Limit struct for getrlimit/setrlimit. 1272093SN/A struct rlimit { 1285543Ssaidi@eecs.umich.edu uint64_t rlim_cur; //!< soft limit 1295543Ssaidi@eecs.umich.edu uint64_t rlim_max; //!< hard limit 1302093SN/A }; 1312093SN/A 1322093SN/A /// For gettimeofday(). 1332093SN/A struct timeval { 1345543Ssaidi@eecs.umich.edu int64_t tv_sec; //!< seconds 1355543Ssaidi@eecs.umich.edu int64_t tv_usec; //!< microseconds 1362093SN/A }; 1372093SN/A 1382093SN/A // For writev/readv 1392093SN/A struct tgt_iovec { 1402093SN/A uint64_t iov_base; // void * 1412093SN/A uint64_t iov_len; 1422093SN/A }; 1432093SN/A 1442093SN/A 1452093SN/A /// For getrusage(). 1462093SN/A struct rusage { 1475543Ssaidi@eecs.umich.edu struct timeval ru_utime; //!< user time used 1485543Ssaidi@eecs.umich.edu struct timeval ru_stime; //!< system time used 1495543Ssaidi@eecs.umich.edu int64_t ru_maxrss; //!< max rss 1505543Ssaidi@eecs.umich.edu int64_t ru_ixrss; //!< integral shared memory size 1515543Ssaidi@eecs.umich.edu int64_t ru_idrss; //!< integral unshared data " 1525543Ssaidi@eecs.umich.edu int64_t ru_isrss; //!< integral unshared stack " 1535543Ssaidi@eecs.umich.edu int64_t ru_minflt; //!< page reclaims - total vmfaults 1545543Ssaidi@eecs.umich.edu int64_t ru_majflt; //!< page faults 1555543Ssaidi@eecs.umich.edu int64_t ru_nswap; //!< swaps 1565543Ssaidi@eecs.umich.edu int64_t ru_inblock; //!< block input operations 1575543Ssaidi@eecs.umich.edu int64_t ru_oublock; //!< block output operations 1585543Ssaidi@eecs.umich.edu int64_t ru_msgsnd; //!< messages sent 1595543Ssaidi@eecs.umich.edu int64_t ru_msgrcv; //!< messages received 1605543Ssaidi@eecs.umich.edu int64_t ru_nsignals; //!< signals received 1615543Ssaidi@eecs.umich.edu int64_t ru_nvcsw; //!< voluntary context switches 1625543Ssaidi@eecs.umich.edu int64_t ru_nivcsw; //!< involuntary " 1632093SN/A }; 1642093SN/A 1655795Ssaidi@eecs.umich.edu static int openSpecialFile(std::string path, LiveProcess *process, ThreadContext *tc); 1665795Ssaidi@eecs.umich.edu static std::string procMeminfo(LiveProcess *process, ThreadContext *tc); 1675795Ssaidi@eecs.umich.edu 1682093SN/A}; // class Linux 1692093SN/A 1702093SN/A 1712093SN/A#endif // FULL_SYSTEM 1722093SN/A 173451SN/A#endif // __LINUX_HH__ 174