process.hh revision 11919:54c2e390fc22
14403Srdreslin@umich.edu/* 21693Sstever@eecs.umich.edu * Copyright (c) 2014-2016 Advanced Micro Devices, Inc. 31693Sstever@eecs.umich.edu * Copyright (c) 2001-2005 The Regents of The University of Michigan 41693Sstever@eecs.umich.edu * All rights reserved. 51693Sstever@eecs.umich.edu * 61693Sstever@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 71693Sstever@eecs.umich.edu * modification, are permitted provided that the following conditions are 81693Sstever@eecs.umich.edu * met: redistributions of source code must retain the above copyright 91693Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 101693Sstever@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 111693Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 121693Sstever@eecs.umich.edu * documentation and/or other materials provided with the distribution; 131693Sstever@eecs.umich.edu * neither the name of the copyright holders nor the names of its 141693Sstever@eecs.umich.edu * contributors may be used to endorse or promote products derived from 151693Sstever@eecs.umich.edu * this software without specific prior written permission. 161693Sstever@eecs.umich.edu * 171693Sstever@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 181693Sstever@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 191693Sstever@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 201693Sstever@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 211693Sstever@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 221693Sstever@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 231693Sstever@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 241693Sstever@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 251693Sstever@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 261693Sstever@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 271693Sstever@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 281693Sstever@eecs.umich.edu * 293358Srdreslin@umich.edu * Authors: Nathan Binkert 303358Srdreslin@umich.edu * Steve Reinhardt 311516SN/A * Brandon Potter 326654Snate@binkert.org */ 336654Snate@binkert.org 346654Snate@binkert.org#ifndef __PROCESS_HH__ 356654Snate@binkert.org#define __PROCESS_HH__ 363358Srdreslin@umich.edu 373358Srdreslin@umich.edu#include <inttypes.h> 386654Snate@binkert.org 396654Snate@binkert.org#include <map> 401516SN/A#include <string> 413358Srdreslin@umich.edu#include <vector> 423358Srdreslin@umich.edu 433358Srdreslin@umich.edu#include "arch/registers.hh" 443358Srdreslin@umich.edu#include "base/statistics.hh" 453358Srdreslin@umich.edu#include "base/types.hh" 463358Srdreslin@umich.edu#include "config/the_isa.hh" 473358Srdreslin@umich.edu#include "mem/se_translating_port_proxy.hh" 483358Srdreslin@umich.edu#include "sim/fd_array.hh" 493358Srdreslin@umich.edu#include "sim/fd_entry.hh" 503358Srdreslin@umich.edu#include "sim/mem_state.hh" 513358Srdreslin@umich.edu#include "sim/sim_object.hh" 523358Srdreslin@umich.edu 533360Srdreslin@umich.edustruct ProcessParams; 543358Srdreslin@umich.edu 553360Srdreslin@umich.educlass EmulatedDriver; 563360Srdreslin@umich.educlass ObjectFile; 573360Srdreslin@umich.educlass PageTableBase; 585255Ssaidi@eecs.umich.educlass SyscallDesc; 593360Srdreslin@umich.educlass SyscallReturn; 603360Srdreslin@umich.educlass System; 613360Srdreslin@umich.educlass ThreadContext; 625255Ssaidi@eecs.umich.edu 633358Srdreslin@umich.educlass Process : public SimObject 644403Srdreslin@umich.edu{ 653360Srdreslin@umich.edu public: 663358Srdreslin@umich.edu Process(ProcessParams *params, ObjectFile *obj_file); 673358Srdreslin@umich.edu 683358Srdreslin@umich.edu void serialize(CheckpointOut &cp) const override; 693358Srdreslin@umich.edu void unserialize(CheckpointIn &cp) override; 703358Srdreslin@umich.edu 713358Srdreslin@umich.edu void initState() override; 723358Srdreslin@umich.edu DrainState drain() override; 733358Srdreslin@umich.edu 743358Srdreslin@umich.edu void syscall(int64_t callnum, ThreadContext *tc, Fault *fault); 753360Srdreslin@umich.edu virtual TheISA::IntReg getSyscallArg(ThreadContext *tc, int &i) = 0; 763360Srdreslin@umich.edu virtual TheISA::IntReg getSyscallArg(ThreadContext *tc, int &i, int width); 773360Srdreslin@umich.edu virtual void setSyscallArg(ThreadContext *tc, int i, 783360Srdreslin@umich.edu TheISA::IntReg val) = 0; 793358Srdreslin@umich.edu virtual void setSyscallReturn(ThreadContext *tc, 803358Srdreslin@umich.edu SyscallReturn return_value) = 0; 813358Srdreslin@umich.edu virtual SyscallDesc *getDesc(int callnum) = 0; 823358Srdreslin@umich.edu 834403Srdreslin@umich.edu inline uint64_t uid() { return _uid; } 844403Srdreslin@umich.edu inline uint64_t euid() { return _euid; } 855256Ssaidi@eecs.umich.edu inline uint64_t gid() { return _gid; } 865255Ssaidi@eecs.umich.edu inline uint64_t egid() { return _egid; } 873358Srdreslin@umich.edu inline uint64_t pid() { return _pid; } 883358Srdreslin@umich.edu inline uint64_t ppid() { return _ppid; } 894403Srdreslin@umich.edu inline uint64_t pgid() { return _pgid; } 904403Srdreslin@umich.edu inline uint64_t tgid() { return _tgid; } 915255Ssaidi@eecs.umich.edu inline void setpgid(uint64_t pgid) { _pgid = pgid; } 923358Srdreslin@umich.edu 933358Srdreslin@umich.edu const char *progName() const { return executable.c_str(); } 944403Srdreslin@umich.edu std::string fullPath(const std::string &filename); 955255Ssaidi@eecs.umich.edu std::string getcwd() const { return cwd; } 964403Srdreslin@umich.edu 973358Srdreslin@umich.edu /** 983358Srdreslin@umich.edu * Find an emulated device driver. 994403Srdreslin@umich.edu * 1005255Ssaidi@eecs.umich.edu * @param filename Name of the device (under /dev) 1014403Srdreslin@umich.edu * @return Pointer to driver object if found, else nullptr 1023358Srdreslin@umich.edu */ 1033358Srdreslin@umich.edu EmulatedDriver *findDriver(std::string filename); 1044403Srdreslin@umich.edu 1055255Ssaidi@eecs.umich.edu // This function acts as a callback to update the bias value in 1064403Srdreslin@umich.edu // the object file because the parameters needed to calculate the 1073358Srdreslin@umich.edu // bias are not available when the object file is created. 1083358Srdreslin@umich.edu void updateBias(); 1094403Srdreslin@umich.edu Addr getBias(); 1105255Ssaidi@eecs.umich.edu Addr getStartPC(); 1114403Srdreslin@umich.edu ObjectFile *getInterpreter(); 1124403Srdreslin@umich.edu 1133358Srdreslin@umich.edu // override of virtual SimObject method: register statistics 1143358Srdreslin@umich.edu void regStats() override; 1154403Srdreslin@umich.edu 1165255Ssaidi@eecs.umich.edu void allocateMem(Addr vaddr, int64_t size, bool clobber = false); 1174403Srdreslin@umich.edu 1184403Srdreslin@umich.edu /// Attempt to fix up a fault at vaddr by allocating a page on the stack. 1194403Srdreslin@umich.edu /// @return Whether the fault has been fixed. 1203360Srdreslin@umich.edu bool fixupStackFault(Addr vaddr); 1214403Srdreslin@umich.edu 1223358Srdreslin@umich.edu // After getting registered with system object, tell process which 1233358Srdreslin@umich.edu // system-wide context id it is assigned. 1244403Srdreslin@umich.edu void 1255255Ssaidi@eecs.umich.edu assignThreadContext(ContextID context_id) 1264403Srdreslin@umich.edu { 1273358Srdreslin@umich.edu contextIds.push_back(context_id); 1283358Srdreslin@umich.edu } 1294403Srdreslin@umich.edu 1305255Ssaidi@eecs.umich.edu // Find a free context to use 1314403Srdreslin@umich.edu ThreadContext *findFreeContext(); 1323358Srdreslin@umich.edu 1333358Srdreslin@umich.edu /** 1344403Srdreslin@umich.edu * After delegating a thread context to a child process 1355256Ssaidi@eecs.umich.edu * no longer should relate to the ThreadContext 1365255Ssaidi@eecs.umich.edu */ 1374403Srdreslin@umich.edu void revokeThreadContext(int context_id); 1383358Srdreslin@umich.edu 1393358Srdreslin@umich.edu /** 1404403Srdreslin@umich.edu * Does mmap region grow upward or downward from mmapEnd? Most 1415255Ssaidi@eecs.umich.edu * platforms grow downward, but a few (such as Alpha) grow upward 1424403Srdreslin@umich.edu * instead, so they can override this method to return false. 1434403Srdreslin@umich.edu */ 1444403Srdreslin@umich.edu virtual bool mmapGrowsDown() const { return true; } 1453360Srdreslin@umich.edu 1464403Srdreslin@umich.edu /** 1473358Srdreslin@umich.edu * Maps a contiguous range of virtual addresses in this process's 1483358Srdreslin@umich.edu * address space to a contiguous range of physical addresses. 1494403Srdreslin@umich.edu * This function exists primarily to expose the map operation to 1505255Ssaidi@eecs.umich.edu * python, so that configuration scripts can set up mappings in SE mode. 1514403Srdreslin@umich.edu * 1524403Srdreslin@umich.edu * @param vaddr The starting virtual address of the range. 1534403Srdreslin@umich.edu * @param paddr The starting physical address of the range. 1543360Srdreslin@umich.edu * @param size The length of the range in bytes. 1554403Srdreslin@umich.edu * @param cacheable Specifies whether accesses are cacheable. 1563358Srdreslin@umich.edu * @return True if the map operation was successful. (At this 1573358Srdreslin@umich.edu * point in time, the map operation always succeeds.) 1583358Srdreslin@umich.edu */ 1593358Srdreslin@umich.edu bool map(Addr vaddr, Addr paddr, int size, bool cacheable = true); 1603358Srdreslin@umich.edu 1613358Srdreslin@umich.edu void replicatePage(Addr vaddr, Addr new_paddr, ThreadContext *old_tc, 1623358Srdreslin@umich.edu ThreadContext *new_tc, bool alloc_page); 1633358Srdreslin@umich.edu 1643358Srdreslin@umich.edu void clone(ThreadContext *old_tc, ThreadContext *new_tc, Process *new_p, 1653358Srdreslin@umich.edu TheISA::IntReg flags); 1663358Srdreslin@umich.edu 1673358Srdreslin@umich.edu // thread contexts associated with this process 1683358Srdreslin@umich.edu std::vector<ContextID> contextIds; 1693358Srdreslin@umich.edu 1703358Srdreslin@umich.edu // system object which owns this process 1713358Srdreslin@umich.edu System *system; 1723358Srdreslin@umich.edu 1733358Srdreslin@umich.edu Stats::Scalar numSyscalls; // track how many system calls are executed 1743358Srdreslin@umich.edu 1753358Srdreslin@umich.edu bool useArchPT; // flag for using architecture specific page table 1763358Srdreslin@umich.edu bool kvmInSE; // running KVM requires special initialization 1773358Srdreslin@umich.edu 1783358Srdreslin@umich.edu PageTableBase* pTable; 1793358Srdreslin@umich.edu 1803358Srdreslin@umich.edu SETranslatingPortProxy initVirtMem; // memory proxy for initial image load 1813358Srdreslin@umich.edu 1823358Srdreslin@umich.edu ObjectFile *objFile; 1833358Srdreslin@umich.edu std::vector<std::string> argv; 1843358Srdreslin@umich.edu std::vector<std::string> envp; 1853358Srdreslin@umich.edu std::string cwd; 1863358Srdreslin@umich.edu std::string executable; 1873358Srdreslin@umich.edu 1883358Srdreslin@umich.edu // Id of the owner of the process 1893358Srdreslin@umich.edu uint64_t _uid; 1903358Srdreslin@umich.edu uint64_t _euid; 1913358Srdreslin@umich.edu uint64_t _gid; 1921516SN/A uint64_t _egid; 1933358Srdreslin@umich.edu 1943358Srdreslin@umich.edu // pid of the process and it's parent 1953358Srdreslin@umich.edu uint64_t _pid; 1961516SN/A uint64_t _ppid; 1973358Srdreslin@umich.edu uint64_t _pgid; 1983358Srdreslin@umich.edu uint64_t _tgid; 1993358Srdreslin@umich.edu 2008931Sandreas.hansson@arm.com // Emulated drivers available to this process 2013358Srdreslin@umich.edu std::vector<EmulatedDriver *> drivers; 2021516SN/A 2033358Srdreslin@umich.edu std::shared_ptr<FDArray> fds; 2043358Srdreslin@umich.edu 2053358Srdreslin@umich.edu bool *exitGroup; 2063358Srdreslin@umich.edu std::shared_ptr<MemState> memState; 2073358Srdreslin@umich.edu 2083358Srdreslin@umich.edu /** 2093358Srdreslin@umich.edu * Calls a futex wakeup at the address specified by this pointer when 2108847Sandreas.hansson@arm.com * this process exits. 2118847Sandreas.hansson@arm.com */ 2128847Sandreas.hansson@arm.com uint64_t childClearTID; 2138847Sandreas.hansson@arm.com 2143358Srdreslin@umich.edu // Process was forked with SIGCHLD set. 2153358Srdreslin@umich.edu bool *sigchld; 2163358Srdreslin@umich.edu}; 2173358Srdreslin@umich.edu 2183358Srdreslin@umich.edu#endif // __PROCESS_HH__ 2193358Srdreslin@umich.edu