linux.hh revision 6744
15443Sgblack@eecs.umich.edu/* 25443Sgblack@eecs.umich.edu * Copyright (c) 2004-2009 The Regents of The University of Michigan 35443Sgblack@eecs.umich.edu * All rights reserved. 45443Sgblack@eecs.umich.edu * 55443Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 65443Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 75443Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 85443Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 95443Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 105443Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 115443Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 125443Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 135443Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 145443Sgblack@eecs.umich.edu * this software without specific prior written permission. 155443Sgblack@eecs.umich.edu * 165443Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175443Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185443Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195443Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205443Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215443Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225443Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235443Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245443Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255443Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265443Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275443Sgblack@eecs.umich.edu * 285443Sgblack@eecs.umich.edu * Authors: Ali Saidi 295443Sgblack@eecs.umich.edu */ 305443Sgblack@eecs.umich.edu 315443Sgblack@eecs.umich.edu#ifndef __LINUX_HH__ 325443Sgblack@eecs.umich.edu#define __LINUX_HH__ 335443Sgblack@eecs.umich.edu 345443Sgblack@eecs.umich.edu#include "base/types.hh" 355443Sgblack@eecs.umich.edu#include "config/full_system.hh" 368229Snate@binkert.org 375606Snate@binkert.org#if FULL_SYSTEM 385606Snate@binkert.org 395443Sgblack@eecs.umich.educlass Linux {}; 406216Snate@binkert.org 419356Snilay@cs.wisc.edu#else //!FULL_SYSTEM 428232Snate@binkert.org 439356Snilay@cs.wisc.edu#include <string> 445443Sgblack@eecs.umich.edu 455443Sgblack@eecs.umich.edu#include "kern/operatingsystem.hh" 465443Sgblack@eecs.umich.edu 475606Snate@binkert.orgclass ThreadContext; 485443Sgblack@eecs.umich.educlass LiveProcess; 495635Sgblack@eecs.umich.edu 505443Sgblack@eecs.umich.edu/// 515443Sgblack@eecs.umich.edu/// This class encapsulates the types, structures, constants, 525443Sgblack@eecs.umich.edu/// functions, and syscall-number mappings specific to the Alpha Linux 535443Sgblack@eecs.umich.edu/// syscall interface. 545443Sgblack@eecs.umich.edu/// 555443Sgblack@eecs.umich.educlass Linux : public OperatingSystem 565443Sgblack@eecs.umich.edu{ 575443Sgblack@eecs.umich.edu 585443Sgblack@eecs.umich.edu public: 595443Sgblack@eecs.umich.edu 605443Sgblack@eecs.umich.edu //@{ 615443Sgblack@eecs.umich.edu /// Basic Linux types. 625443Sgblack@eecs.umich.edu typedef uint64_t size_t; 635443Sgblack@eecs.umich.edu typedef uint64_t off_t; 645443Sgblack@eecs.umich.edu typedef int64_t time_t; 655443Sgblack@eecs.umich.edu typedef int64_t clock_t; 665443Sgblack@eecs.umich.edu typedef uint32_t uid_t; 675443Sgblack@eecs.umich.edu typedef uint32_t gid_t; 685443Sgblack@eecs.umich.edu //@} 695443Sgblack@eecs.umich.edu 705443Sgblack@eecs.umich.edu /// Stat buffer. Note that we can't call it 'stat' since that 715443Sgblack@eecs.umich.edu /// gets #defined to something else on some systems. This type 725443Sgblack@eecs.umich.edu /// can be specialized by architecture specific "Linux" classes 735443Sgblack@eecs.umich.edu typedef struct { 745443Sgblack@eecs.umich.edu uint32_t st_dev; //!< device 755443Sgblack@eecs.umich.edu uint32_t st_ino; //!< inode 765443Sgblack@eecs.umich.edu uint32_t st_mode; //!< mode 775443Sgblack@eecs.umich.edu uint32_t st_nlink; //!< link count 785443Sgblack@eecs.umich.edu uint32_t st_uid; //!< owner's user ID 795443Sgblack@eecs.umich.edu uint32_t st_gid; //!< owner's group ID 805443Sgblack@eecs.umich.edu uint32_t st_rdev; //!< device number 815443Sgblack@eecs.umich.edu int32_t _pad1; //!< for alignment 825443Sgblack@eecs.umich.edu int64_t st_size; //!< file size in bytes 835443Sgblack@eecs.umich.edu uint64_t st_atimeX; //!< time of last access 845443Sgblack@eecs.umich.edu uint64_t st_mtimeX; //!< time of last modification 855443Sgblack@eecs.umich.edu uint64_t st_ctimeX; //!< time of last status change 865443Sgblack@eecs.umich.edu uint32_t st_blksize; //!< optimal I/O block size 875443Sgblack@eecs.umich.edu int32_t st_blocks; //!< number of blocks allocated 885443Sgblack@eecs.umich.edu uint32_t st_flags; //!< flags 895443Sgblack@eecs.umich.edu uint32_t st_gen; //!< unknown 905443Sgblack@eecs.umich.edu } tgt_stat; 915443Sgblack@eecs.umich.edu 925443Sgblack@eecs.umich.edu // same for stat64 935443Sgblack@eecs.umich.edu typedef struct { 945443Sgblack@eecs.umich.edu uint64_t st_dev; 955642Sgblack@eecs.umich.edu uint64_t st_ino; 965443Sgblack@eecs.umich.edu uint64_t st_rdev; 975443Sgblack@eecs.umich.edu int64_t st_size; 985443Sgblack@eecs.umich.edu uint64_t st_blocks; 995443Sgblack@eecs.umich.edu 1005443Sgblack@eecs.umich.edu uint32_t st_mode; 1015444Sgblack@eecs.umich.edu uint32_t st_uid; 1025444Sgblack@eecs.umich.edu uint32_t st_gid; 1036067Sgblack@eecs.umich.edu uint32_t st_blksize; 1046067Sgblack@eecs.umich.edu uint32_t st_nlink; 1055443Sgblack@eecs.umich.edu uint32_t __pad0; 1065443Sgblack@eecs.umich.edu 1075443Sgblack@eecs.umich.edu uint64_t st_atimeX; 1085443Sgblack@eecs.umich.edu uint64_t st_atime_nsec; 1095443Sgblack@eecs.umich.edu uint64_t st_mtimeX; 1105443Sgblack@eecs.umich.edu uint64_t st_mtime_nsec; 1115642Sgblack@eecs.umich.edu uint64_t st_ctimeX; 1125642Sgblack@eecs.umich.edu uint64_t st_ctime_nsec; 1135443Sgblack@eecs.umich.edu int64_t ___unused[3]; 1145443Sgblack@eecs.umich.edu } tgt_stat64; 1156067Sgblack@eecs.umich.edu 1166067Sgblack@eecs.umich.edu /// Length of strings in struct utsname (plus 1 for null char). 1175443Sgblack@eecs.umich.edu static const int _SYS_NMLN = 65; 1185443Sgblack@eecs.umich.edu 1195443Sgblack@eecs.umich.edu /// Interface struct for uname(). 1205443Sgblack@eecs.umich.edu struct utsname { 1215443Sgblack@eecs.umich.edu char sysname[_SYS_NMLN]; //!< System name. 1225443Sgblack@eecs.umich.edu char nodename[_SYS_NMLN]; //!< Node name. 1235443Sgblack@eecs.umich.edu char release[_SYS_NMLN]; //!< OS release. 1245443Sgblack@eecs.umich.edu char version[_SYS_NMLN]; //!< OS version. 1255443Sgblack@eecs.umich.edu char machine[_SYS_NMLN]; //!< Machine type. 1265443Sgblack@eecs.umich.edu }; 1275443Sgblack@eecs.umich.edu 1285443Sgblack@eecs.umich.edu /// Limit struct for getrlimit/setrlimit. 1295443Sgblack@eecs.umich.edu struct rlimit { 1305443Sgblack@eecs.umich.edu uint64_t rlim_cur; //!< soft limit 1315443Sgblack@eecs.umich.edu uint64_t rlim_max; //!< hard limit 1325443Sgblack@eecs.umich.edu }; 1335443Sgblack@eecs.umich.edu 1345443Sgblack@eecs.umich.edu /// For gettimeofday(). 1355443Sgblack@eecs.umich.edu struct timeval { 1365443Sgblack@eecs.umich.edu int64_t tv_sec; //!< seconds 1375443Sgblack@eecs.umich.edu int64_t tv_usec; //!< microseconds 1385443Sgblack@eecs.umich.edu }; 1395606Snate@binkert.org 1405606Snate@binkert.org /// Clock ticks per second, for times(). 1415606Snate@binkert.org static const int M5_SC_CLK_TCK = 100; 1425443Sgblack@eecs.umich.edu 1435642Sgblack@eecs.umich.edu /// For times(). 1445443Sgblack@eecs.umich.edu struct tms { 1455443Sgblack@eecs.umich.edu int64_t tms_utime; //!< user time 1465443Sgblack@eecs.umich.edu int64_t tms_stime; //!< system time 1475443Sgblack@eecs.umich.edu int64_t tms_cutime; //!< user time of children 1486067Sgblack@eecs.umich.edu int64_t tms_cstime; //!< system time of children 1496067Sgblack@eecs.umich.edu }; 1506067Sgblack@eecs.umich.edu 1515443Sgblack@eecs.umich.edu // For writev/readv 1525443Sgblack@eecs.umich.edu struct tgt_iovec { 1535443Sgblack@eecs.umich.edu uint64_t iov_base; // void * 1545443Sgblack@eecs.umich.edu uint64_t iov_len; 1555443Sgblack@eecs.umich.edu }; 1565443Sgblack@eecs.umich.edu 1575443Sgblack@eecs.umich.edu 1585443Sgblack@eecs.umich.edu /// For getrusage(). 1595443Sgblack@eecs.umich.edu struct rusage { 1605443Sgblack@eecs.umich.edu struct timeval ru_utime; //!< user time used 1615443Sgblack@eecs.umich.edu struct timeval ru_stime; //!< system time used 1625443Sgblack@eecs.umich.edu int64_t ru_maxrss; //!< max rss 1635443Sgblack@eecs.umich.edu int64_t ru_ixrss; //!< integral shared memory size 1645443Sgblack@eecs.umich.edu int64_t ru_idrss; //!< integral unshared data " 1655443Sgblack@eecs.umich.edu int64_t ru_isrss; //!< integral unshared stack " 1665443Sgblack@eecs.umich.edu int64_t ru_minflt; //!< page reclaims - total vmfaults 1675443Sgblack@eecs.umich.edu int64_t ru_majflt; //!< page faults 1685443Sgblack@eecs.umich.edu int64_t ru_nswap; //!< swaps 1695443Sgblack@eecs.umich.edu int64_t ru_inblock; //!< block input operations 1705443Sgblack@eecs.umich.edu int64_t ru_oublock; //!< block output operations 1715443Sgblack@eecs.umich.edu int64_t ru_msgsnd; //!< messages sent 1725443Sgblack@eecs.umich.edu int64_t ru_msgrcv; //!< messages received 1735443Sgblack@eecs.umich.edu int64_t ru_nsignals; //!< signals received 1745443Sgblack@eecs.umich.edu int64_t ru_nvcsw; //!< voluntary context switches 1755443Sgblack@eecs.umich.edu int64_t ru_nivcsw; //!< involuntary " 1765443Sgblack@eecs.umich.edu }; 1775443Sgblack@eecs.umich.edu 1785443Sgblack@eecs.umich.edu static int openSpecialFile(std::string path, LiveProcess *process, ThreadContext *tc); 1795443Sgblack@eecs.umich.edu static std::string procMeminfo(LiveProcess *process, ThreadContext *tc); 1805443Sgblack@eecs.umich.edu 1815443Sgblack@eecs.umich.edu}; // class Linux 1825443Sgblack@eecs.umich.edu 1835443Sgblack@eecs.umich.edu 1845443Sgblack@eecs.umich.edu#endif // FULL_SYSTEM 1855443Sgblack@eecs.umich.edu 1865635Sgblack@eecs.umich.edu#endif // __LINUX_HH__ 1875443Sgblack@eecs.umich.edu