base: refactor process class (specifically FdMap and friends)
[gem5.git] / src / sim / process.hh
index 3896492b761917770574f0069515ffa45f4b2077..2de83565ca709fb33c33995625f333c9bcc26489 100644 (file)
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2014 Advanced Micro Devices, Inc.
  * Copyright (c) 2001-2005 The Regents of The University of Michigan
  * All rights reserved.
  *
@@ -32,6 +33,7 @@
 #ifndef __PROCESS_HH__
 #define __PROCESS_HH__
 
+#include <array>
 #include <string>
 #include <vector>
 
 #include "base/statistics.hh"
 #include "base/types.hh"
 #include "config/the_isa.hh"
+#include "mem/se_translating_port_proxy.hh"
+#include "sim/fd_entry.hh"
 #include "sim/sim_object.hh"
 #include "sim/syscallreturn.hh"
 
 class PageTable;
-class ProcessParams;
-class LiveProcessParams;
+struct ProcessParams;
+struct LiveProcessParams;
 class SyscallDesc;
 class System;
 class ThreadContext;
-class SETranslatingPortProxy;
+class EmulatedDriver;
 
 template<class IntType>
 struct AuxVector
@@ -110,58 +114,46 @@ class Process : public SimObject
     Addr nxm_start;
     Addr nxm_end;
 
-    std::string prog_fname;     // file name
-
     Stats::Scalar num_syscalls;       // number of syscalls executed
 
-
   protected:
     // constructor
     Process(ProcessParams *params);
 
     virtual void initState();
 
-  protected:
-    /// Memory object for initialization (image loading)
-    SETranslatingPortProxy *initVirtMem;
+    DrainState drain() M5_ATTR_OVERRIDE;
 
   public:
-    PageTable *pTable;
 
     //This id is assigned by m5 and is used to keep process' tlb entries
     //separated.
     uint64_t M5_pid;
 
-    class FdMap
-    {
-      public:
-        int fd;
-        std::string filename;
-        int mode;
-        int flags;
-        bool isPipe;
-        int readPipeSource;
-        uint64_t fileOffset;
-
-        FdMap()
-            : fd(-1), filename("NULL"), mode(0), flags(0),
-              isPipe(false), readPipeSource(0), fileOffset(0)
-        { }
-
-        void serialize(std::ostream &os);
-        void unserialize(Checkpoint *cp, const std::string &section);
-    };
+    // flag for using architecture specific page table
+    bool useArchPT;
+    // running KvmCPU in SE mode requires special initialization
+    bool kvmInSE;
+
+    PageTableBase* pTable;
+
+  protected:
+    /// Memory proxy for initialization (image loading)
+    SETranslatingPortProxy initVirtMem;
 
   private:
-    // file descriptor remapping support
-    static const int MAX_FD = 256;    // max legal fd value
-    FdMap fd_map[MAX_FD+1];
+    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;
 
   public:
-    // static helper functions to generate file descriptors for constructor
-    static int openInputFile(const std::string &filename);
-    static int openOutputFile(const std::string &filename);
+    // inherit file descriptor map from another process (necessary for clone)
+    void inheritFdArray(Process *p);
 
     // override of virtual SimObject method: register statistics
     virtual void regStats();
@@ -176,21 +168,28 @@ class Process : public SimObject
     // Find a free context to use
     ThreadContext *findFreeContext();
 
-    // map simulator fd sim_fd to target fd tgt_fd
-    void dup_fd(int sim_fd, int tgt_fd);
+    // provide program name for debug messages
+    virtual const char *progName() const { return "<unknown>"; }
 
     // generate new target fd for sim_fd
-    int alloc_fd(int sim_fd, std::string filename, int flags, int mode,
+    int alloc_fd(int sim_fd, const std::string& filename, int flags, int mode,
                  bool pipe);
 
-    // free target fd (e.g., after close)
-    void free_fd(int tgt_fd);
+    // disassociate target fd with simulator fd and cleanup subsidiary fields
+    void reset_fd_entry(int tgt_fd);
 
     // look up simulator fd for given target fd
     int sim_fd(int tgt_fd);
 
-    // look up simulator fd_map object for a given target fd
-    FdMap *sim_fd_obj(int tgt_fd);
+    // look up fd entry for a given target fd
+    FDEntry *get_fd_entry(int tgt_fd);
+
+    // look up target fd for given host fd
+    // Assumes a 1:1 mapping between target file descriptor and host file
+    // descriptor. Given the current API, this must be true given that it's
+    // not possible to map multiple target file descriptors to the same host
+    // file descriptor
+    int tgt_fd(int sim_fd);
 
     // fix all offsets for currently open files and save them
     void fix_file_offsets();
@@ -209,8 +208,23 @@ class Process : public SimObject
     /// @return Whether the fault has been fixed.
     bool fixupStackFault(Addr vaddr);
 
-    void serialize(std::ostream &os);
-    void unserialize(Checkpoint *cp, const std::string &section);
+    /**
+     * Maps a contiguous range of virtual addresses in this process's
+     * address space to a contiguous range of physical addresses.
+     * This function exists primarily to expose the map operation to
+     * python, so that configuration scripts can set up mappings in SE mode.
+     *
+     * @param vaddr The starting virtual address of the range.
+     * @param paddr The starting physical address of the range.
+     * @param size The length of the range in bytes.
+     * @param cacheable Specifies whether accesses are cacheable.
+     * @return True if the map operation was successful.  (At this
+     *           point in time, the map operation always succeeds.)
+     */
+    bool map(Addr vaddr, Addr paddr, int size, bool cacheable = true);
+
+    void serialize(CheckpointOut &cp) const M5_ATTR_OVERRIDE;
+    void unserialize(CheckpointIn &cp) M5_ATTR_OVERRIDE;
 };
 
 //
@@ -237,6 +251,9 @@ class LiveProcess : public Process
     uint64_t __pid;
     uint64_t __ppid;
 
+    // Emulated drivers available to this process
+    std::vector<EmulatedDriver *> drivers;
+
   public:
 
     enum AuxiliaryVectorType {
@@ -276,6 +293,9 @@ class LiveProcess : public Process
     inline uint64_t pid() {return __pid;}
     inline uint64_t ppid() {return __ppid;}
 
+    // provide program name for debug messages
+    virtual const char *progName() const { return argv[0].c_str(); }
+
     std::string
     fullPath(const std::string &filename)
     {
@@ -303,6 +323,14 @@ class LiveProcess : public Process
 
     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 is used to create the LiveProcess object, since
     // we can't tell which subclass of LiveProcess to use until we
     // open and look at the object file.