process.hh revision 11905:4a771f8756ad
113481Sgiacomo.travaglini@arm.com/* 213481Sgiacomo.travaglini@arm.com * Copyright (c) 2014-2016 Advanced Micro Devices, Inc. 313481Sgiacomo.travaglini@arm.com * Copyright (c) 2001-2005 The Regents of The University of Michigan 413481Sgiacomo.travaglini@arm.com * All rights reserved. 513481Sgiacomo.travaglini@arm.com * 613481Sgiacomo.travaglini@arm.com * Redistribution and use in source and binary forms, with or without 713481Sgiacomo.travaglini@arm.com * modification, are permitted provided that the following conditions are 813481Sgiacomo.travaglini@arm.com * met: redistributions of source code must retain the above copyright 913481Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer; 1013481Sgiacomo.travaglini@arm.com * redistributions in binary form must reproduce the above copyright 1113481Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer in the 1213481Sgiacomo.travaglini@arm.com * documentation and/or other materials provided with the distribution; 1313481Sgiacomo.travaglini@arm.com * neither the name of the copyright holders nor the names of its 1413481Sgiacomo.travaglini@arm.com * contributors may be used to endorse or promote products derived from 1513481Sgiacomo.travaglini@arm.com * this software without specific prior written permission. 1613481Sgiacomo.travaglini@arm.com * 1713481Sgiacomo.travaglini@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1813481Sgiacomo.travaglini@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1913481Sgiacomo.travaglini@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2013481Sgiacomo.travaglini@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2113481Sgiacomo.travaglini@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2213481Sgiacomo.travaglini@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2313481Sgiacomo.travaglini@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2413481Sgiacomo.travaglini@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2513481Sgiacomo.travaglini@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2613481Sgiacomo.travaglini@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2713481Sgiacomo.travaglini@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2813481Sgiacomo.travaglini@arm.com * 2913481Sgiacomo.travaglini@arm.com * Authors: Nathan Binkert 3013481Sgiacomo.travaglini@arm.com * Steve Reinhardt 3113481Sgiacomo.travaglini@arm.com * Brandon Potter 3213481Sgiacomo.travaglini@arm.com */ 3313481Sgiacomo.travaglini@arm.com 3413481Sgiacomo.travaglini@arm.com#ifndef __PROCESS_HH__ 3513481Sgiacomo.travaglini@arm.com#define __PROCESS_HH__ 3613481Sgiacomo.travaglini@arm.com 3713481Sgiacomo.travaglini@arm.com#include <inttypes.h> 3813481Sgiacomo.travaglini@arm.com 3913481Sgiacomo.travaglini@arm.com#include <map> 4013481Sgiacomo.travaglini@arm.com#include <string> 4113481Sgiacomo.travaglini@arm.com#include <vector> 4213481Sgiacomo.travaglini@arm.com 4313481Sgiacomo.travaglini@arm.com#include "arch/registers.hh" 4413481Sgiacomo.travaglini@arm.com#include "base/statistics.hh" 4513481Sgiacomo.travaglini@arm.com#include "base/types.hh" 4613481Sgiacomo.travaglini@arm.com#include "config/the_isa.hh" 4713481Sgiacomo.travaglini@arm.com#include "mem/se_translating_port_proxy.hh" 4813481Sgiacomo.travaglini@arm.com#include "sim/fd_array.hh" 4913481Sgiacomo.travaglini@arm.com#include "sim/fd_entry.hh" 5013481Sgiacomo.travaglini@arm.com#include "sim/mem_state.hh" 5113481Sgiacomo.travaglini@arm.com#include "sim/sim_object.hh" 5213481Sgiacomo.travaglini@arm.com 5313481Sgiacomo.travaglini@arm.comstruct ProcessParams; 5413481Sgiacomo.travaglini@arm.com 5513481Sgiacomo.travaglini@arm.comclass EmulatedDriver; 5613481Sgiacomo.travaglini@arm.comclass ObjectFile; 5713481Sgiacomo.travaglini@arm.comclass PageTableBase; 5813481Sgiacomo.travaglini@arm.comclass SyscallDesc; 5913481Sgiacomo.travaglini@arm.comclass SyscallReturn; 6013481Sgiacomo.travaglini@arm.comclass System; 6113481Sgiacomo.travaglini@arm.comclass ThreadContext; 6213481Sgiacomo.travaglini@arm.com 6313481Sgiacomo.travaglini@arm.comclass Process : public SimObject 6413481Sgiacomo.travaglini@arm.com{ 6513481Sgiacomo.travaglini@arm.com public: 6613481Sgiacomo.travaglini@arm.com Process(ProcessParams *params, ObjectFile *obj_file); 6713481Sgiacomo.travaglini@arm.com 6813481Sgiacomo.travaglini@arm.com void serialize(CheckpointOut &cp) const override; 6913481Sgiacomo.travaglini@arm.com void unserialize(CheckpointIn &cp) override; 7013481Sgiacomo.travaglini@arm.com 7113481Sgiacomo.travaglini@arm.com void initState() override; 7213481Sgiacomo.travaglini@arm.com DrainState drain() override; 7313481Sgiacomo.travaglini@arm.com 7413481Sgiacomo.travaglini@arm.com void syscall(int64_t callnum, ThreadContext *tc, Fault *fault); 7513481Sgiacomo.travaglini@arm.com virtual TheISA::IntReg getSyscallArg(ThreadContext *tc, int &i) = 0; 7613481Sgiacomo.travaglini@arm.com virtual TheISA::IntReg getSyscallArg(ThreadContext *tc, int &i, int width); 7713481Sgiacomo.travaglini@arm.com virtual void setSyscallArg(ThreadContext *tc, int i, 7813481Sgiacomo.travaglini@arm.com TheISA::IntReg val) = 0; 7913481Sgiacomo.travaglini@arm.com virtual void setSyscallReturn(ThreadContext *tc, 8013481Sgiacomo.travaglini@arm.com SyscallReturn return_value) = 0; 8113481Sgiacomo.travaglini@arm.com virtual SyscallDesc *getDesc(int callnum) = 0; 8213481Sgiacomo.travaglini@arm.com 8313481Sgiacomo.travaglini@arm.com inline uint64_t uid() { return _uid; } 8413481Sgiacomo.travaglini@arm.com inline uint64_t euid() { return _euid; } 8513481Sgiacomo.travaglini@arm.com inline uint64_t gid() { return _gid; } 8613481Sgiacomo.travaglini@arm.com inline uint64_t egid() { return _egid; } 8713481Sgiacomo.travaglini@arm.com inline uint64_t pid() { return _pid; } 8813481Sgiacomo.travaglini@arm.com inline uint64_t ppid() { return _ppid; } 8913481Sgiacomo.travaglini@arm.com inline uint64_t pgid() { return _pgid; } 9013481Sgiacomo.travaglini@arm.com inline uint64_t tgid() { return _tgid; } 9113481Sgiacomo.travaglini@arm.com inline void setpgid(uint64_t pgid) { _pgid = pgid; } 9213481Sgiacomo.travaglini@arm.com 9313481Sgiacomo.travaglini@arm.com const char *progName() const { return executable.c_str(); } 9413481Sgiacomo.travaglini@arm.com std::string fullPath(const std::string &filename); 9513481Sgiacomo.travaglini@arm.com std::string getcwd() const { return cwd; } 9613481Sgiacomo.travaglini@arm.com 9713481Sgiacomo.travaglini@arm.com /** 9813481Sgiacomo.travaglini@arm.com * Find an emulated device driver. 9913481Sgiacomo.travaglini@arm.com * 10013481Sgiacomo.travaglini@arm.com * @param filename Name of the device (under /dev) 10113481Sgiacomo.travaglini@arm.com * @return Pointer to driver object if found, else NULL 10213481Sgiacomo.travaglini@arm.com */ 10313481Sgiacomo.travaglini@arm.com EmulatedDriver *findDriver(std::string filename); 10413481Sgiacomo.travaglini@arm.com 10513481Sgiacomo.travaglini@arm.com // This function acts as a callback to update the bias value in 10613481Sgiacomo.travaglini@arm.com // the object file because the parameters needed to calculate the 10713481Sgiacomo.travaglini@arm.com // bias are not available when the object file is created. 10813481Sgiacomo.travaglini@arm.com void updateBias(); 10913481Sgiacomo.travaglini@arm.com Addr getBias(); 11013481Sgiacomo.travaglini@arm.com Addr getStartPC(); 11113481Sgiacomo.travaglini@arm.com ObjectFile *getInterpreter(); 11213481Sgiacomo.travaglini@arm.com 11313481Sgiacomo.travaglini@arm.com // override of virtual SimObject method: register statistics 11413481Sgiacomo.travaglini@arm.com void regStats() override; 11513481Sgiacomo.travaglini@arm.com 11613481Sgiacomo.travaglini@arm.com void allocateMem(Addr vaddr, int64_t size, bool clobber = false); 11713481Sgiacomo.travaglini@arm.com 11813481Sgiacomo.travaglini@arm.com /// Attempt to fix up a fault at vaddr by allocating a page on the stack. 11913481Sgiacomo.travaglini@arm.com /// @return Whether the fault has been fixed. 12013481Sgiacomo.travaglini@arm.com bool fixupStackFault(Addr vaddr); 12113481Sgiacomo.travaglini@arm.com 12213481Sgiacomo.travaglini@arm.com // After getting registered with system object, tell process which 12313481Sgiacomo.travaglini@arm.com // system-wide context id it is assigned. 12413481Sgiacomo.travaglini@arm.com void 12513481Sgiacomo.travaglini@arm.com assignThreadContext(ContextID context_id) 12613481Sgiacomo.travaglini@arm.com { 12713481Sgiacomo.travaglini@arm.com contextIds.push_back(context_id); 12813481Sgiacomo.travaglini@arm.com } 12913481Sgiacomo.travaglini@arm.com 13013481Sgiacomo.travaglini@arm.com // Find a free context to use 13113481Sgiacomo.travaglini@arm.com ThreadContext *findFreeContext(); 13213481Sgiacomo.travaglini@arm.com 13313481Sgiacomo.travaglini@arm.com /** 13413481Sgiacomo.travaglini@arm.com * After delegating a thread context to a child process 13513481Sgiacomo.travaglini@arm.com * no longer should relate to the ThreadContext 13613481Sgiacomo.travaglini@arm.com */ 13713481Sgiacomo.travaglini@arm.com void revokeThreadContext(int context_id); 13813481Sgiacomo.travaglini@arm.com 13913481Sgiacomo.travaglini@arm.com /** 14013481Sgiacomo.travaglini@arm.com * Does mmap region grow upward or downward from mmapEnd? Most 14113481Sgiacomo.travaglini@arm.com * platforms grow downward, but a few (such as Alpha) grow upward 14213481Sgiacomo.travaglini@arm.com * instead, so they can override this method to return false. 14313481Sgiacomo.travaglini@arm.com */ 14413481Sgiacomo.travaglini@arm.com virtual bool mmapGrowsDown() const { return true; } 14513481Sgiacomo.travaglini@arm.com 14613481Sgiacomo.travaglini@arm.com /** 14713481Sgiacomo.travaglini@arm.com * Maps a contiguous range of virtual addresses in this process's 14813481Sgiacomo.travaglini@arm.com * address space to a contiguous range of physical addresses. 14913481Sgiacomo.travaglini@arm.com * This function exists primarily to expose the map operation to 15013481Sgiacomo.travaglini@arm.com * python, so that configuration scripts can set up mappings in SE mode. 15113481Sgiacomo.travaglini@arm.com * 15213481Sgiacomo.travaglini@arm.com * @param vaddr The starting virtual address of the range. 15313481Sgiacomo.travaglini@arm.com * @param paddr The starting physical address of the range. 15413481Sgiacomo.travaglini@arm.com * @param size The length of the range in bytes. 15513481Sgiacomo.travaglini@arm.com * @param cacheable Specifies whether accesses are cacheable. 15613481Sgiacomo.travaglini@arm.com * @return True if the map operation was successful. (At this 15713481Sgiacomo.travaglini@arm.com * point in time, the map operation always succeeds.) 15813481Sgiacomo.travaglini@arm.com */ 15913481Sgiacomo.travaglini@arm.com bool map(Addr vaddr, Addr paddr, int size, bool cacheable = true); 16013481Sgiacomo.travaglini@arm.com 16113481Sgiacomo.travaglini@arm.com void replicatePage(Addr vaddr, Addr new_paddr, ThreadContext *old_tc, 16213481Sgiacomo.travaglini@arm.com ThreadContext *new_tc, bool alloc_page); 16313481Sgiacomo.travaglini@arm.com 16413481Sgiacomo.travaglini@arm.com void clone(ThreadContext *old_tc, ThreadContext *new_tc, Process *new_p, 16513481Sgiacomo.travaglini@arm.com TheISA::IntReg flags); 16613481Sgiacomo.travaglini@arm.com 16713481Sgiacomo.travaglini@arm.com // thread contexts associated with this process 16813481Sgiacomo.travaglini@arm.com std::vector<ContextID> contextIds; 16913481Sgiacomo.travaglini@arm.com 17013481Sgiacomo.travaglini@arm.com // system object which owns this process 17113481Sgiacomo.travaglini@arm.com System *system; 17213481Sgiacomo.travaglini@arm.com 17313481Sgiacomo.travaglini@arm.com Stats::Scalar numSyscalls; // track how many system calls are executed 17413481Sgiacomo.travaglini@arm.com 17513481Sgiacomo.travaglini@arm.com bool useArchPT; // flag for using architecture specific page table 17613481Sgiacomo.travaglini@arm.com bool kvmInSE; // running KVM requires special initialization 17713481Sgiacomo.travaglini@arm.com 17813481Sgiacomo.travaglini@arm.com PageTableBase* pTable; 17913481Sgiacomo.travaglini@arm.com 18013481Sgiacomo.travaglini@arm.com SETranslatingPortProxy initVirtMem; // memory proxy for initial image load 18113481Sgiacomo.travaglini@arm.com 18213481Sgiacomo.travaglini@arm.com ObjectFile *objFile; 18313481Sgiacomo.travaglini@arm.com std::vector<std::string> argv; 18413481Sgiacomo.travaglini@arm.com std::vector<std::string> envp; 18513481Sgiacomo.travaglini@arm.com std::string cwd; 18613481Sgiacomo.travaglini@arm.com std::string executable; 18713481Sgiacomo.travaglini@arm.com 18813481Sgiacomo.travaglini@arm.com // Id of the owner of the process 18913481Sgiacomo.travaglini@arm.com uint64_t _uid; 19013481Sgiacomo.travaglini@arm.com uint64_t _euid; 19113481Sgiacomo.travaglini@arm.com uint64_t _gid; 19213481Sgiacomo.travaglini@arm.com uint64_t _egid; 19313481Sgiacomo.travaglini@arm.com 19413481Sgiacomo.travaglini@arm.com // pid of the process and it's parent 19513481Sgiacomo.travaglini@arm.com uint64_t _pid; 19613481Sgiacomo.travaglini@arm.com uint64_t _ppid; 19713481Sgiacomo.travaglini@arm.com uint64_t _pgid; 19813481Sgiacomo.travaglini@arm.com uint64_t _tgid; 19913481Sgiacomo.travaglini@arm.com 20013481Sgiacomo.travaglini@arm.com // Emulated drivers available to this process 20113481Sgiacomo.travaglini@arm.com std::vector<EmulatedDriver *> drivers; 20213481Sgiacomo.travaglini@arm.com 20313481Sgiacomo.travaglini@arm.com std::shared_ptr<FDArray> fds; 20413481Sgiacomo.travaglini@arm.com 20513481Sgiacomo.travaglini@arm.com bool *exitGroup; 20613481Sgiacomo.travaglini@arm.com std::shared_ptr<MemState> memState; 20713481Sgiacomo.travaglini@arm.com 20813481Sgiacomo.travaglini@arm.com /** 20913481Sgiacomo.travaglini@arm.com * Calls a futex wakeup at the address specified by this pointer when 21013481Sgiacomo.travaglini@arm.com * this process exits. 21113481Sgiacomo.travaglini@arm.com */ 21213481Sgiacomo.travaglini@arm.com uint64_t childClearTID; 21313481Sgiacomo.travaglini@arm.com 21413481Sgiacomo.travaglini@arm.com // Process was forked with SIGCHLD set. 21513481Sgiacomo.travaglini@arm.com bool *sigchld; 21613481Sgiacomo.travaglini@arm.com}; 21713481Sgiacomo.travaglini@arm.com 21813481Sgiacomo.travaglini@arm.com#endif // __PROCESS_HH__ 21913481Sgiacomo.travaglini@arm.com