/*
+ * Copyright (c) 2014 Advanced Micro Devices, Inc.
* Copyright (c) 2001-2005 The Regents of The University of Michigan
* All rights reserved.
*
#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
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 §ion);
- };
+ // 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();
// 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();
/// @return Whether the fault has been fixed.
bool fixupStackFault(Addr vaddr);
- void serialize(std::ostream &os);
- void unserialize(Checkpoint *cp, const std::string §ion);
+ /**
+ * 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;
};
//
uint64_t __pid;
uint64_t __ppid;
+ // Emulated drivers available to this process
+ std::vector<EmulatedDriver *> drivers;
+
public:
enum AuxiliaryVectorType {
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)
{
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.