diff options
Diffstat (limited to 'src/sim/process.hh')
-rw-r--r-- | src/sim/process.hh | 259 |
1 files changed, 89 insertions, 170 deletions
diff --git a/src/sim/process.hh b/src/sim/process.hh index f3d0f1b62..dde131628 100644 --- a/src/sim/process.hh +++ b/src/sim/process.hh @@ -33,6 +33,8 @@ #ifndef __PROCESS_HH__ #define __PROCESS_HH__ +#include <inttypes.h> + #include <array> #include <map> #include <string> @@ -56,30 +58,9 @@ class SyscallReturn; class System; class ThreadContext; -template<class IntType> -struct AuxVector -{ - IntType a_type; - IntType a_val; - - AuxVector() - {} - - AuxVector(IntType type, IntType val); -}; - class Process : public SimObject { public: - - /// Pointer to object representing the system this process is - /// running on. - System *system; - - // thread contexts associated with this process - std::vector<ContextID> contextIds; - - // record of blocked context struct WaitRec { Addr waitChan; @@ -87,82 +68,59 @@ class Process : public SimObject WaitRec(Addr chan, ThreadContext *ctx) : waitChan(chan), waitingContext(ctx) - { } + { } }; - // list of all blocked contexts - std::list<WaitRec> waitList; - - Addr brk_point; // top of the data segment - - Addr stack_base; // stack segment base (highest address) - unsigned stack_size; // initial stack size - Addr stack_min; // lowest address accessed on the stack - - // The maximum size allowed for the stack. - Addr max_stack_size; - - // addr to use for next stack region (for multithreaded apps) - Addr next_thread_stack_base; - - // Base of region for mmaps (when user doesn't specify an address). - Addr mmap_end; - - // Does mmap region grow upward or downward from mmap_end? Most - // platforms grow downward, but a few (such as Alpha) grow upward - // instead, so they can override thie method to return false. - virtual bool mmapGrowsDown() const { return true; } - - Stats::Scalar num_syscalls; // number of syscalls executed + Process(ProcessParams *params, ObjectFile *obj_file); - protected: - // constructor - Process(ProcessParams *params); + void serialize(CheckpointOut &cp) const override; + void unserialize(CheckpointIn &cp) override; void initState() override; - DrainState drain() override; - public: - - // flag for using architecture specific page table - bool useArchPT; - // running KvmCPU in SE mode requires special initialization - bool kvmInSE; - - PageTableBase* pTable; + void syscall(int64_t callnum, ThreadContext *tc); + virtual TheISA::IntReg getSyscallArg(ThreadContext *tc, int &i) = 0; + virtual TheISA::IntReg getSyscallArg(ThreadContext *tc, int &i, int width); + virtual void setSyscallArg(ThreadContext *tc, int i, + TheISA::IntReg val) = 0; + virtual void setSyscallReturn(ThreadContext *tc, + SyscallReturn return_value) = 0; + virtual SyscallDesc *getDesc(int callnum) = 0; - protected: - /// Memory proxy for initialization (image loading) - SETranslatingPortProxy initVirtMem; + inline uint64_t uid() { return _uid; } + inline uint64_t euid() { return _euid; } + inline uint64_t gid() { return _gid; } + inline uint64_t egid() { return _egid; } + inline uint64_t pid() { return _pid; } + inline uint64_t ppid() { return _ppid; } - private: - static const int NUM_FDS = 1024; + const char *progName() const { return executable.c_str(); } + std::string fullPath(const std::string &filename); + std::string getcwd() const { return cwd; } - // File descriptor remapping support. - std::shared_ptr<std::array<FDEntry, NUM_FDS>> fd_array; + /** + * Find an emulated device driver. + * + * @param filename Name of the device (under /dev) + * @return Pointer to driver object if found, else NULL + */ + EmulatedDriver *findDriver(std::string filename); - // Standard file descriptor options for initialization and checkpoints. - std::map<std::string, int> imap; - std::map<std::string, int> oemap; + // This function acts as a callback to update the bias value in + // the object file because the parameters needed to calculate the + // bias are not available when the object file is created. + void updateBias(); + Addr getBias(); + Addr getStartPC(); + ObjectFile *getInterpreter(); - public: // inherit file descriptor map from another process (necessary for clone) void inheritFDArray(Process *p); // override of virtual SimObject method: register statistics void regStats() override; - // After getting registered with system object, tell process which - // system-wide context id it is assigned. - void assignThreadContext(ContextID context_id) - { - contextIds.push_back(context_id); - } - - // Find a free context to use - ThreadContext *findFreeContext(); - // generate new target fd for sim_fd int allocFD(int sim_fd, const std::string& filename, int flags, int mode, bool pipe); @@ -199,6 +157,24 @@ class Process : public SimObject /// @return Whether the fault has been fixed. bool fixupStackFault(Addr vaddr); + // After getting registered with system object, tell process which + // system-wide context id it is assigned. + void + assignThreadContext(ContextID context_id) + { + contextIds.push_back(context_id); + } + + // Find a free context to use + ThreadContext *findFreeContext(); + + /** + * Does mmap region grow upward or downward from mmap_end? Most + * platforms grow downward, but a few (such as Alpha) grow upward + * instead, so they can override this method to return false. + */ + virtual bool mmapGrowsDown() const { return true; } + /** * Maps a contiguous range of virtual addresses in this process's * address space to a contiguous range of physical addresses. @@ -214,19 +190,47 @@ class Process : public SimObject */ bool map(Addr vaddr, Addr paddr, int size, bool cacheable = true); - void serialize(CheckpointOut &cp) const override; - void unserialize(CheckpointIn &cp) override; + // list of all blocked contexts + std::list<WaitRec> waitList; + + // thread contexts associated with this process + std::vector<ContextID> contextIds; + + // system object which owns this process + System *system; + + Addr brk_point; // top of the data segment + Addr stack_base; // stack segment base + unsigned stack_size; // initial stack size + Addr stack_min; // furthest address accessed from stack base + Addr max_stack_size; // the maximum size allowed for the stack + Addr next_thread_stack_base; // addr for next region w/ multithreaded apps + Addr mmap_end; // base of automatic mmap region allocs + + Stats::Scalar num_syscalls; // track how many system calls are executed + + bool useArchPT; // flag for using architecture specific page table + bool kvmInSE; // running KVM requires special initialization + + PageTableBase* pTable; + + SETranslatingPortProxy initVirtMem; // memory proxy for initial image load + + static const int NUM_FDS = 1024; + + // File descriptor remapping support. + std::shared_ptr<std::array<FDEntry, NUM_FDS>> fd_array; + + // Standard file descriptor options for initialization and checkpoints. + std::map<std::string, int> imap; + std::map<std::string, int> oemap; - protected: ObjectFile *objFile; std::vector<std::string> argv; std::vector<std::string> envp; std::string cwd; std::string executable; - Process(ProcessParams *params, ObjectFile *obj_file); - - public: // Id of the owner of the process uint64_t _uid; uint64_t _euid; @@ -239,91 +243,6 @@ class Process : public SimObject // Emulated drivers available to this process std::vector<EmulatedDriver *> drivers; - - enum AuxiliaryVectorType { - M5_AT_NULL = 0, - M5_AT_IGNORE = 1, - M5_AT_EXECFD = 2, - M5_AT_PHDR = 3, - M5_AT_PHENT = 4, - M5_AT_PHNUM = 5, - M5_AT_PAGESZ = 6, - M5_AT_BASE = 7, - M5_AT_FLAGS = 8, - M5_AT_ENTRY = 9, - M5_AT_NOTELF = 10, - M5_AT_UID = 11, - M5_AT_EUID = 12, - M5_AT_GID = 13, - M5_AT_EGID = 14, - // The following may be specific to Linux - M5_AT_PLATFORM = 15, - M5_AT_HWCAP = 16, - M5_AT_CLKTCK = 17, - - M5_AT_SECURE = 23, - M5_BASE_PLATFORM = 24, - M5_AT_RANDOM = 25, - - M5_AT_EXECFN = 31, - - M5_AT_VECTOR_SIZE = 44 - }; - - inline uint64_t uid() { return _uid; } - inline uint64_t euid() { return _euid; } - inline uint64_t gid() { return _gid; } - inline uint64_t egid() { return _egid; } - inline uint64_t pid() { return _pid; } - inline uint64_t ppid() { return _ppid; } - - // provide program name for debug messages - const char *progName() const { return executable.c_str(); } - - std::string - fullPath(const std::string &filename) - { - if (filename[0] == '/' || cwd.empty()) - return filename; - - std::string full = cwd; - - if (cwd[cwd.size() - 1] != '/') - full += '/'; - - return full + filename; - } - - std::string getcwd() const { return cwd; } - - void syscall(int64_t callnum, ThreadContext *tc); - - virtual TheISA::IntReg getSyscallArg(ThreadContext *tc, int &i) = 0; - virtual TheISA::IntReg getSyscallArg(ThreadContext *tc, int &i, int width); - virtual void setSyscallArg(ThreadContext *tc, - int i, TheISA::IntReg val) = 0; - virtual void setSyscallReturn(ThreadContext *tc, - SyscallReturn return_value) = 0; - - virtual SyscallDesc *getDesc(int callnum) = 0; - - /** - * Find an emulated device driver. - * - * @param filename Name of the device (under /dev) - * @return Pointer to driver object if found, else NULL - */ - EmulatedDriver *findDriver(std::string filename); - - // This function acts as a callback to update the bias value in - // the object file because the parameters needed to calculate the - // bias are not available when the object file is created. - void updateBias(); - - ObjectFile *getInterpreter(); - - Addr getBias(); - Addr getStartPC(); }; #endif // __PROCESS_HH__ |