process.hh revision 11140
19651SAndreas.Sandberg@ARM.com/* 29651SAndreas.Sandberg@ARM.com * Copyright (c) 2014 Advanced Micro Devices, Inc. 39651SAndreas.Sandberg@ARM.com * Copyright (c) 2001-2005 The Regents of The University of Michigan 49651SAndreas.Sandberg@ARM.com * All rights reserved. 59651SAndreas.Sandberg@ARM.com * 69651SAndreas.Sandberg@ARM.com * Redistribution and use in source and binary forms, with or without 79651SAndreas.Sandberg@ARM.com * modification, are permitted provided that the following conditions are 89651SAndreas.Sandberg@ARM.com * met: redistributions of source code must retain the above copyright 99651SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer; 109651SAndreas.Sandberg@ARM.com * redistributions in binary form must reproduce the above copyright 119651SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer in the 129651SAndreas.Sandberg@ARM.com * documentation and/or other materials provided with the distribution; 139651SAndreas.Sandberg@ARM.com * neither the name of the copyright holders nor the names of its 149651SAndreas.Sandberg@ARM.com * contributors may be used to endorse or promote products derived from 159651SAndreas.Sandberg@ARM.com * this software without specific prior written permission. 169651SAndreas.Sandberg@ARM.com * 179651SAndreas.Sandberg@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 189651SAndreas.Sandberg@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 199651SAndreas.Sandberg@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 209651SAndreas.Sandberg@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 219651SAndreas.Sandberg@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 229651SAndreas.Sandberg@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 239651SAndreas.Sandberg@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 249651SAndreas.Sandberg@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 259651SAndreas.Sandberg@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 269651SAndreas.Sandberg@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 279651SAndreas.Sandberg@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 289651SAndreas.Sandberg@ARM.com * 299651SAndreas.Sandberg@ARM.com * Authors: Nathan Binkert 309651SAndreas.Sandberg@ARM.com * Steve Reinhardt 319651SAndreas.Sandberg@ARM.com */ 329651SAndreas.Sandberg@ARM.com 339651SAndreas.Sandberg@ARM.com#ifndef __PROCESS_HH__ 349651SAndreas.Sandberg@ARM.com#define __PROCESS_HH__ 359651SAndreas.Sandberg@ARM.com 369651SAndreas.Sandberg@ARM.com#include <array> 379651SAndreas.Sandberg@ARM.com#include <string> 389651SAndreas.Sandberg@ARM.com#include <vector> 399651SAndreas.Sandberg@ARM.com 409651SAndreas.Sandberg@ARM.com#include "arch/registers.hh" 419651SAndreas.Sandberg@ARM.com#include "base/statistics.hh" 429651SAndreas.Sandberg@ARM.com#include "base/types.hh" 439651SAndreas.Sandberg@ARM.com#include "config/the_isa.hh" 449651SAndreas.Sandberg@ARM.com#include "mem/se_translating_port_proxy.hh" 459651SAndreas.Sandberg@ARM.com#include "sim/fd_entry.hh" 469651SAndreas.Sandberg@ARM.com#include "sim/sim_object.hh" 479651SAndreas.Sandberg@ARM.com#include "sim/syscallreturn.hh" 489986Sandreas@sandberg.pp.se 499986Sandreas@sandberg.pp.seclass PageTable; 509651SAndreas.Sandberg@ARM.comstruct ProcessParams; 519651SAndreas.Sandberg@ARM.comstruct LiveProcessParams; 529651SAndreas.Sandberg@ARM.comclass SyscallDesc; 539651SAndreas.Sandberg@ARM.comclass System; 549651SAndreas.Sandberg@ARM.comclass ThreadContext; 559651SAndreas.Sandberg@ARM.comclass EmulatedDriver; 569651SAndreas.Sandberg@ARM.com 579651SAndreas.Sandberg@ARM.comtemplate<class IntType> 589651SAndreas.Sandberg@ARM.comstruct AuxVector 599651SAndreas.Sandberg@ARM.com{ 609651SAndreas.Sandberg@ARM.com IntType a_type; 619651SAndreas.Sandberg@ARM.com IntType a_val; 629651SAndreas.Sandberg@ARM.com 639651SAndreas.Sandberg@ARM.com AuxVector() 649651SAndreas.Sandberg@ARM.com {} 659651SAndreas.Sandberg@ARM.com 669651SAndreas.Sandberg@ARM.com AuxVector(IntType type, IntType val); 679651SAndreas.Sandberg@ARM.com}; 689651SAndreas.Sandberg@ARM.com 699651SAndreas.Sandberg@ARM.comclass Process : public SimObject 709651SAndreas.Sandberg@ARM.com{ 719651SAndreas.Sandberg@ARM.com public: 729651SAndreas.Sandberg@ARM.com 739651SAndreas.Sandberg@ARM.com /// Pointer to object representing the system this process is 749651SAndreas.Sandberg@ARM.com /// running on. 759651SAndreas.Sandberg@ARM.com System *system; 769651SAndreas.Sandberg@ARM.com 779651SAndreas.Sandberg@ARM.com // thread contexts associated with this process 789651SAndreas.Sandberg@ARM.com std::vector<ContextID> contextIds; 799651SAndreas.Sandberg@ARM.com 809651SAndreas.Sandberg@ARM.com // number of CPUs (esxec contexts, really) assigned to this process. 819651SAndreas.Sandberg@ARM.com unsigned int numCpus() { return contextIds.size(); } 829651SAndreas.Sandberg@ARM.com 839651SAndreas.Sandberg@ARM.com // record of blocked context 849651SAndreas.Sandberg@ARM.com struct WaitRec 859651SAndreas.Sandberg@ARM.com { 869651SAndreas.Sandberg@ARM.com Addr waitChan; 879651SAndreas.Sandberg@ARM.com ThreadContext *waitingContext; 889651SAndreas.Sandberg@ARM.com 899651SAndreas.Sandberg@ARM.com WaitRec(Addr chan, ThreadContext *ctx) 909651SAndreas.Sandberg@ARM.com : waitChan(chan), waitingContext(ctx) 919651SAndreas.Sandberg@ARM.com { } 929651SAndreas.Sandberg@ARM.com }; 939651SAndreas.Sandberg@ARM.com 949651SAndreas.Sandberg@ARM.com // list of all blocked contexts 959651SAndreas.Sandberg@ARM.com std::list<WaitRec> waitList; 969651SAndreas.Sandberg@ARM.com 979651SAndreas.Sandberg@ARM.com Addr brk_point; // top of the data segment 989651SAndreas.Sandberg@ARM.com 999651SAndreas.Sandberg@ARM.com Addr stack_base; // stack segment base (highest address) 1009651SAndreas.Sandberg@ARM.com unsigned stack_size; // initial stack size 1019651SAndreas.Sandberg@ARM.com Addr stack_min; // lowest address accessed on the stack 1029651SAndreas.Sandberg@ARM.com 1039651SAndreas.Sandberg@ARM.com // The maximum size allowed for the stack. 1049651SAndreas.Sandberg@ARM.com Addr max_stack_size; 1059651SAndreas.Sandberg@ARM.com 1069651SAndreas.Sandberg@ARM.com // addr to use for next stack region (for multithreaded apps) 1079651SAndreas.Sandberg@ARM.com Addr next_thread_stack_base; 1089651SAndreas.Sandberg@ARM.com 1099651SAndreas.Sandberg@ARM.com // Base of region for mmaps (when user doesn't specify an address). 1109651SAndreas.Sandberg@ARM.com Addr mmap_start; 1119651SAndreas.Sandberg@ARM.com Addr mmap_end; 1129651SAndreas.Sandberg@ARM.com 1139651SAndreas.Sandberg@ARM.com // Base of region for nxm data 1149651SAndreas.Sandberg@ARM.com Addr nxm_start; 1159651SAndreas.Sandberg@ARM.com Addr nxm_end; 1169651SAndreas.Sandberg@ARM.com 1179651SAndreas.Sandberg@ARM.com Stats::Scalar num_syscalls; // number of syscalls executed 1189651SAndreas.Sandberg@ARM.com 1199651SAndreas.Sandberg@ARM.com protected: 1209651SAndreas.Sandberg@ARM.com // constructor 1219651SAndreas.Sandberg@ARM.com Process(ProcessParams *params); 1229651SAndreas.Sandberg@ARM.com 1239651SAndreas.Sandberg@ARM.com virtual void initState(); 1249651SAndreas.Sandberg@ARM.com 1259651SAndreas.Sandberg@ARM.com DrainState drain() M5_ATTR_OVERRIDE; 1269651SAndreas.Sandberg@ARM.com 1279651SAndreas.Sandberg@ARM.com public: 1289651SAndreas.Sandberg@ARM.com 1299651SAndreas.Sandberg@ARM.com //This id is assigned by m5 and is used to keep process' tlb entries 1309986Sandreas@sandberg.pp.se //separated. 1319986Sandreas@sandberg.pp.se uint64_t M5_pid; 1329986Sandreas@sandberg.pp.se 1339986Sandreas@sandberg.pp.se // flag for using architecture specific page table 1349986Sandreas@sandberg.pp.se bool useArchPT; 1359986Sandreas@sandberg.pp.se // running KvmCPU in SE mode requires special initialization 1369986Sandreas@sandberg.pp.se bool kvmInSE; 1379986Sandreas@sandberg.pp.se 1389986Sandreas@sandberg.pp.se PageTableBase* pTable; 1399986Sandreas@sandberg.pp.se 1409986Sandreas@sandberg.pp.se protected: 1419986Sandreas@sandberg.pp.se /// Memory proxy for initialization (image loading) 1429986Sandreas@sandberg.pp.se SETranslatingPortProxy initVirtMem; 1439986Sandreas@sandberg.pp.se 1449986Sandreas@sandberg.pp.se private: 1459986Sandreas@sandberg.pp.se static const int NUM_FDS = 1024; 1469986Sandreas@sandberg.pp.se 1479986Sandreas@sandberg.pp.se // File descriptor remapping support. 1489986Sandreas@sandberg.pp.se std::shared_ptr<std::array<FDEntry, NUM_FDS>> fd_array; 1499986Sandreas@sandberg.pp.se 1509986Sandreas@sandberg.pp.se // Standard file descriptor options for initialization and checkpoints. 1519986Sandreas@sandberg.pp.se std::map<std::string, int> imap; 1529986Sandreas@sandberg.pp.se std::map<std::string, int> oemap; 1539986Sandreas@sandberg.pp.se 1549986Sandreas@sandberg.pp.se public: 1559986Sandreas@sandberg.pp.se // inherit file descriptor map from another process (necessary for clone) 1569986Sandreas@sandberg.pp.se void inheritFDArray(Process *p); 1579986Sandreas@sandberg.pp.se 1589986Sandreas@sandberg.pp.se // override of virtual SimObject method: register statistics 1599986Sandreas@sandberg.pp.se virtual void regStats(); 1609986Sandreas@sandberg.pp.se 1619986Sandreas@sandberg.pp.se // After getting registered with system object, tell process which 1629986Sandreas@sandberg.pp.se // system-wide context id it is assigned. 1639651SAndreas.Sandberg@ARM.com void assignThreadContext(ContextID context_id) 1649651SAndreas.Sandberg@ARM.com { 1659651SAndreas.Sandberg@ARM.com contextIds.push_back(context_id); 1669651SAndreas.Sandberg@ARM.com } 1679651SAndreas.Sandberg@ARM.com 1689651SAndreas.Sandberg@ARM.com // Find a free context to use 1699651SAndreas.Sandberg@ARM.com ThreadContext *findFreeContext(); 1709651SAndreas.Sandberg@ARM.com 1719651SAndreas.Sandberg@ARM.com // provide program name for debug messages 1729651SAndreas.Sandberg@ARM.com virtual const char *progName() const { return "<unknown>"; } 1739651SAndreas.Sandberg@ARM.com 1749651SAndreas.Sandberg@ARM.com // generate new target fd for sim_fd 1759651SAndreas.Sandberg@ARM.com int allocFD(int sim_fd, const std::string& filename, int flags, int mode, 1769651SAndreas.Sandberg@ARM.com bool pipe); 1779651SAndreas.Sandberg@ARM.com 1789651SAndreas.Sandberg@ARM.com // disassociate target fd with simulator fd and cleanup subsidiary fields 1799651SAndreas.Sandberg@ARM.com void resetFDEntry(int tgt_fd); 1809651SAndreas.Sandberg@ARM.com 1819651SAndreas.Sandberg@ARM.com // look up simulator fd for given target fd 1829651SAndreas.Sandberg@ARM.com int getSimFD(int tgt_fd); 1839651SAndreas.Sandberg@ARM.com 1849651SAndreas.Sandberg@ARM.com // look up fd entry for a given target fd 1859651SAndreas.Sandberg@ARM.com FDEntry *getFDEntry(int tgt_fd); 1869651SAndreas.Sandberg@ARM.com 1879651SAndreas.Sandberg@ARM.com // look up target fd for given host fd 1889651SAndreas.Sandberg@ARM.com // Assumes a 1:1 mapping between target file descriptor and host file 1899651SAndreas.Sandberg@ARM.com // descriptor. Given the current API, this must be true given that it's 1909651SAndreas.Sandberg@ARM.com // not possible to map multiple target file descriptors to the same host 1919651SAndreas.Sandberg@ARM.com // file descriptor 1929651SAndreas.Sandberg@ARM.com int getTgtFD(int sim_fd); 1939651SAndreas.Sandberg@ARM.com 1949651SAndreas.Sandberg@ARM.com // fix all offsets for currently open files and save them 1959651SAndreas.Sandberg@ARM.com void fixFileOffsets(); 1969651SAndreas.Sandberg@ARM.com 1979651SAndreas.Sandberg@ARM.com // find all offsets for currently open files and save them 1989651SAndreas.Sandberg@ARM.com void findFileOffsets(); 1999651SAndreas.Sandberg@ARM.com 2009651SAndreas.Sandberg@ARM.com // set the source of this read pipe for a checkpoint resume 2019651SAndreas.Sandberg@ARM.com void setReadPipeSource(int read_pipe_fd, int source_fd); 2029651SAndreas.Sandberg@ARM.com 2039651SAndreas.Sandberg@ARM.com virtual void syscall(int64_t callnum, ThreadContext *tc) = 0; 2049651SAndreas.Sandberg@ARM.com 2059651SAndreas.Sandberg@ARM.com void allocateMem(Addr vaddr, int64_t size, bool clobber = false); 2069651SAndreas.Sandberg@ARM.com 2079651SAndreas.Sandberg@ARM.com /// Attempt to fix up a fault at vaddr by allocating a page on the stack. 2089651SAndreas.Sandberg@ARM.com /// @return Whether the fault has been fixed. 2099651SAndreas.Sandberg@ARM.com bool fixupStackFault(Addr vaddr); 2109651SAndreas.Sandberg@ARM.com 2119651SAndreas.Sandberg@ARM.com /** 2129651SAndreas.Sandberg@ARM.com * Maps a contiguous range of virtual addresses in this process's 2139651SAndreas.Sandberg@ARM.com * address space to a contiguous range of physical addresses. 2149651SAndreas.Sandberg@ARM.com * This function exists primarily to expose the map operation to 2159651SAndreas.Sandberg@ARM.com * python, so that configuration scripts can set up mappings in SE mode. 2169651SAndreas.Sandberg@ARM.com * 2179651SAndreas.Sandberg@ARM.com * @param vaddr The starting virtual address of the range. 2189651SAndreas.Sandberg@ARM.com * @param paddr The starting physical address of the range. 2199651SAndreas.Sandberg@ARM.com * @param size The length of the range in bytes. 2209651SAndreas.Sandberg@ARM.com * @param cacheable Specifies whether accesses are cacheable. 2219651SAndreas.Sandberg@ARM.com * @return True if the map operation was successful. (At this 2229651SAndreas.Sandberg@ARM.com * point in time, the map operation always succeeds.) 2239651SAndreas.Sandberg@ARM.com */ 2249651SAndreas.Sandberg@ARM.com bool map(Addr vaddr, Addr paddr, int size, bool cacheable = true); 2259651SAndreas.Sandberg@ARM.com 2269651SAndreas.Sandberg@ARM.com void serialize(CheckpointOut &cp) const M5_ATTR_OVERRIDE; 2279651SAndreas.Sandberg@ARM.com void unserialize(CheckpointIn &cp) M5_ATTR_OVERRIDE; 2289651SAndreas.Sandberg@ARM.com}; 2299651SAndreas.Sandberg@ARM.com 2309651SAndreas.Sandberg@ARM.com// 2319651SAndreas.Sandberg@ARM.com// "Live" process with system calls redirected to host system 2329651SAndreas.Sandberg@ARM.com// 2339651SAndreas.Sandberg@ARM.comclass ObjectFile; 2349651SAndreas.Sandberg@ARM.comclass LiveProcess : public Process 2359651SAndreas.Sandberg@ARM.com{ 2369651SAndreas.Sandberg@ARM.com protected: 2379651SAndreas.Sandberg@ARM.com ObjectFile *objFile; 2389651SAndreas.Sandberg@ARM.com std::vector<std::string> argv; 2399651SAndreas.Sandberg@ARM.com std::vector<std::string> envp; 2409651SAndreas.Sandberg@ARM.com std::string cwd; 2419651SAndreas.Sandberg@ARM.com std::string executable; 2429651SAndreas.Sandberg@ARM.com 2439651SAndreas.Sandberg@ARM.com LiveProcess(LiveProcessParams *params, ObjectFile *objFile); 2449651SAndreas.Sandberg@ARM.com 2459651SAndreas.Sandberg@ARM.com // Id of the owner of the process 2469651SAndreas.Sandberg@ARM.com uint64_t __uid; 2479651SAndreas.Sandberg@ARM.com uint64_t __euid; 2489651SAndreas.Sandberg@ARM.com uint64_t __gid; 2499651SAndreas.Sandberg@ARM.com uint64_t __egid; 2509651SAndreas.Sandberg@ARM.com 2519651SAndreas.Sandberg@ARM.com // pid of the process and it's parent 2529651SAndreas.Sandberg@ARM.com uint64_t __pid; 2539651SAndreas.Sandberg@ARM.com uint64_t __ppid; 2549651SAndreas.Sandberg@ARM.com 2559655SAndreas.Sandberg@ARM.com // Emulated drivers available to this process 2569655SAndreas.Sandberg@ARM.com std::vector<EmulatedDriver *> drivers; 2579651SAndreas.Sandberg@ARM.com 2589651SAndreas.Sandberg@ARM.com public: 2599651SAndreas.Sandberg@ARM.com 2609651SAndreas.Sandberg@ARM.com enum AuxiliaryVectorType { 2619651SAndreas.Sandberg@ARM.com M5_AT_NULL = 0, 2629651SAndreas.Sandberg@ARM.com M5_AT_IGNORE = 1, 2639651SAndreas.Sandberg@ARM.com M5_AT_EXECFD = 2, 2649651SAndreas.Sandberg@ARM.com M5_AT_PHDR = 3, 2659651SAndreas.Sandberg@ARM.com M5_AT_PHENT = 4, 2669651SAndreas.Sandberg@ARM.com M5_AT_PHNUM = 5, 2679651SAndreas.Sandberg@ARM.com M5_AT_PAGESZ = 6, 2689651SAndreas.Sandberg@ARM.com M5_AT_BASE = 7, 2699651SAndreas.Sandberg@ARM.com M5_AT_FLAGS = 8, 2709651SAndreas.Sandberg@ARM.com M5_AT_ENTRY = 9, 2719651SAndreas.Sandberg@ARM.com M5_AT_NOTELF = 10, 2729651SAndreas.Sandberg@ARM.com M5_AT_UID = 11, 2739651SAndreas.Sandberg@ARM.com M5_AT_EUID = 12, 2749651SAndreas.Sandberg@ARM.com M5_AT_GID = 13, 2759651SAndreas.Sandberg@ARM.com M5_AT_EGID = 14, 2769651SAndreas.Sandberg@ARM.com // The following may be specific to Linux 2779651SAndreas.Sandberg@ARM.com M5_AT_PLATFORM = 15, 2789651SAndreas.Sandberg@ARM.com M5_AT_HWCAP = 16, 2799651SAndreas.Sandberg@ARM.com M5_AT_CLKTCK = 17, 2809651SAndreas.Sandberg@ARM.com 2819651SAndreas.Sandberg@ARM.com M5_AT_SECURE = 23, 2829651SAndreas.Sandberg@ARM.com M5_BASE_PLATFORM = 24, 2839651SAndreas.Sandberg@ARM.com M5_AT_RANDOM = 25, 2849651SAndreas.Sandberg@ARM.com 2859651SAndreas.Sandberg@ARM.com M5_AT_EXECFN = 31, 2869651SAndreas.Sandberg@ARM.com 2879651SAndreas.Sandberg@ARM.com M5_AT_VECTOR_SIZE = 44 2889651SAndreas.Sandberg@ARM.com }; 2899651SAndreas.Sandberg@ARM.com 2909651SAndreas.Sandberg@ARM.com inline uint64_t uid() {return __uid;} 2919651SAndreas.Sandberg@ARM.com inline uint64_t euid() {return __euid;} 2929651SAndreas.Sandberg@ARM.com inline uint64_t gid() {return __gid;} 2939651SAndreas.Sandberg@ARM.com inline uint64_t egid() {return __egid;} 2949651SAndreas.Sandberg@ARM.com inline uint64_t pid() {return __pid;} 2959651SAndreas.Sandberg@ARM.com inline uint64_t ppid() {return __ppid;} 2969651SAndreas.Sandberg@ARM.com 2979651SAndreas.Sandberg@ARM.com // provide program name for debug messages 2989651SAndreas.Sandberg@ARM.com virtual const char *progName() const { return executable.c_str(); } 2999651SAndreas.Sandberg@ARM.com 3009651SAndreas.Sandberg@ARM.com std::string 3019651SAndreas.Sandberg@ARM.com fullPath(const std::string &filename) 3029651SAndreas.Sandberg@ARM.com { 3039651SAndreas.Sandberg@ARM.com if (filename[0] == '/' || cwd.empty()) 3049651SAndreas.Sandberg@ARM.com return filename; 3059651SAndreas.Sandberg@ARM.com 3069651SAndreas.Sandberg@ARM.com std::string full = cwd; 3079651SAndreas.Sandberg@ARM.com 3089651SAndreas.Sandberg@ARM.com if (cwd[cwd.size() - 1] != '/') 3099651SAndreas.Sandberg@ARM.com full += '/'; 3109651SAndreas.Sandberg@ARM.com 3119651SAndreas.Sandberg@ARM.com return full + filename; 3129651SAndreas.Sandberg@ARM.com } 3139651SAndreas.Sandberg@ARM.com 3149651SAndreas.Sandberg@ARM.com std::string getcwd() const { return cwd; } 3159651SAndreas.Sandberg@ARM.com 3169651SAndreas.Sandberg@ARM.com virtual void syscall(int64_t callnum, ThreadContext *tc); 3179651SAndreas.Sandberg@ARM.com 3189651SAndreas.Sandberg@ARM.com virtual TheISA::IntReg getSyscallArg(ThreadContext *tc, int &i) = 0; 3199651SAndreas.Sandberg@ARM.com virtual TheISA::IntReg getSyscallArg(ThreadContext *tc, int &i, int width); 3209651SAndreas.Sandberg@ARM.com virtual void setSyscallArg(ThreadContext *tc, 3219651SAndreas.Sandberg@ARM.com int i, TheISA::IntReg val) = 0; 3229651SAndreas.Sandberg@ARM.com virtual void setSyscallReturn(ThreadContext *tc, 3239651SAndreas.Sandberg@ARM.com SyscallReturn return_value) = 0; 3249651SAndreas.Sandberg@ARM.com 3259651SAndreas.Sandberg@ARM.com virtual SyscallDesc *getDesc(int callnum) = 0; 3269651SAndreas.Sandberg@ARM.com 3279651SAndreas.Sandberg@ARM.com /** 3289651SAndreas.Sandberg@ARM.com * Find an emulated device driver. 3299651SAndreas.Sandberg@ARM.com * 3309651SAndreas.Sandberg@ARM.com * @param filename Name of the device (under /dev) 3319651SAndreas.Sandberg@ARM.com * @return Pointer to driver object if found, else NULL 3329651SAndreas.Sandberg@ARM.com */ 3339651SAndreas.Sandberg@ARM.com EmulatedDriver *findDriver(std::string filename); 3349651SAndreas.Sandberg@ARM.com 3359651SAndreas.Sandberg@ARM.com // this function is used to create the LiveProcess object, since 3369651SAndreas.Sandberg@ARM.com // we can't tell which subclass of LiveProcess to use until we 3379651SAndreas.Sandberg@ARM.com // open and look at the object file. 3389651SAndreas.Sandberg@ARM.com static LiveProcess *create(LiveProcessParams *params); 3399651SAndreas.Sandberg@ARM.com}; 3409651SAndreas.Sandberg@ARM.com 3419651SAndreas.Sandberg@ARM.com 3429651SAndreas.Sandberg@ARM.com#endif // __PROCESS_HH__ 3439651SAndreas.Sandberg@ARM.com