summaryrefslogtreecommitdiff
path: root/src/sim/process.hh
diff options
context:
space:
mode:
authorBrandon Potter <brandon.potter@amd.com>2016-11-09 14:27:41 -0600
committerBrandon Potter <brandon.potter@amd.com>2016-11-09 14:27:41 -0600
commit49009f170a631eea259dc031b3ce4593f8783d19 (patch)
tree3a424b1a3aa32e067a7d008dd7f4c85524bd2b44 /src/sim/process.hh
parentea8461885ffffa0933cedeb9143a9b01be4c70f0 (diff)
downloadgem5-49009f170a631eea259dc031b3ce4593f8783d19.tar.xz
syscall_emul: [patch 8/22] refactor process class
Moves aux_vector into its own .hh and .cc files just to get it out of the already crowded Process files. Arguably, it could stay there, but it's probably better just to move it and give it files. The changeset looks ugly around the Process header file, but the goal here is to move methods and members around so that they're not defined randomly throughout the entire header file. I expect this is likely one of the reasons why I several unused variables related to this class. So, the methods are declared first followed by members. I've tried to aggregate them together so that similar entries reside near one another. There are other changes coming to this code so this is by no means the final product.
Diffstat (limited to 'src/sim/process.hh')
-rw-r--r--src/sim/process.hh259
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__