process.hh revision 11919:54c2e390fc22
14403Srdreslin@umich.edu/*
21693Sstever@eecs.umich.edu * Copyright (c) 2014-2016 Advanced Micro Devices, Inc.
31693Sstever@eecs.umich.edu * Copyright (c) 2001-2005 The Regents of The University of Michigan
41693Sstever@eecs.umich.edu * All rights reserved.
51693Sstever@eecs.umich.edu *
61693Sstever@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
71693Sstever@eecs.umich.edu * modification, are permitted provided that the following conditions are
81693Sstever@eecs.umich.edu * met: redistributions of source code must retain the above copyright
91693Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
101693Sstever@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
111693Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
121693Sstever@eecs.umich.edu * documentation and/or other materials provided with the distribution;
131693Sstever@eecs.umich.edu * neither the name of the copyright holders nor the names of its
141693Sstever@eecs.umich.edu * contributors may be used to endorse or promote products derived from
151693Sstever@eecs.umich.edu * this software without specific prior written permission.
161693Sstever@eecs.umich.edu *
171693Sstever@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
181693Sstever@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
191693Sstever@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
201693Sstever@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
211693Sstever@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
221693Sstever@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
231693Sstever@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
241693Sstever@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
251693Sstever@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
261693Sstever@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
271693Sstever@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
281693Sstever@eecs.umich.edu *
293358Srdreslin@umich.edu * Authors: Nathan Binkert
303358Srdreslin@umich.edu *          Steve Reinhardt
311516SN/A *          Brandon Potter
326654Snate@binkert.org */
336654Snate@binkert.org
346654Snate@binkert.org#ifndef __PROCESS_HH__
356654Snate@binkert.org#define __PROCESS_HH__
363358Srdreslin@umich.edu
373358Srdreslin@umich.edu#include <inttypes.h>
386654Snate@binkert.org
396654Snate@binkert.org#include <map>
401516SN/A#include <string>
413358Srdreslin@umich.edu#include <vector>
423358Srdreslin@umich.edu
433358Srdreslin@umich.edu#include "arch/registers.hh"
443358Srdreslin@umich.edu#include "base/statistics.hh"
453358Srdreslin@umich.edu#include "base/types.hh"
463358Srdreslin@umich.edu#include "config/the_isa.hh"
473358Srdreslin@umich.edu#include "mem/se_translating_port_proxy.hh"
483358Srdreslin@umich.edu#include "sim/fd_array.hh"
493358Srdreslin@umich.edu#include "sim/fd_entry.hh"
503358Srdreslin@umich.edu#include "sim/mem_state.hh"
513358Srdreslin@umich.edu#include "sim/sim_object.hh"
523358Srdreslin@umich.edu
533360Srdreslin@umich.edustruct ProcessParams;
543358Srdreslin@umich.edu
553360Srdreslin@umich.educlass EmulatedDriver;
563360Srdreslin@umich.educlass ObjectFile;
573360Srdreslin@umich.educlass PageTableBase;
585255Ssaidi@eecs.umich.educlass SyscallDesc;
593360Srdreslin@umich.educlass SyscallReturn;
603360Srdreslin@umich.educlass System;
613360Srdreslin@umich.educlass ThreadContext;
625255Ssaidi@eecs.umich.edu
633358Srdreslin@umich.educlass Process : public SimObject
644403Srdreslin@umich.edu{
653360Srdreslin@umich.edu  public:
663358Srdreslin@umich.edu    Process(ProcessParams *params, ObjectFile *obj_file);
673358Srdreslin@umich.edu
683358Srdreslin@umich.edu    void serialize(CheckpointOut &cp) const override;
693358Srdreslin@umich.edu    void unserialize(CheckpointIn &cp) override;
703358Srdreslin@umich.edu
713358Srdreslin@umich.edu    void initState() override;
723358Srdreslin@umich.edu    DrainState drain() override;
733358Srdreslin@umich.edu
743358Srdreslin@umich.edu    void syscall(int64_t callnum, ThreadContext *tc, Fault *fault);
753360Srdreslin@umich.edu    virtual TheISA::IntReg getSyscallArg(ThreadContext *tc, int &i) = 0;
763360Srdreslin@umich.edu    virtual TheISA::IntReg getSyscallArg(ThreadContext *tc, int &i, int width);
773360Srdreslin@umich.edu    virtual void setSyscallArg(ThreadContext *tc, int i,
783360Srdreslin@umich.edu                               TheISA::IntReg val) = 0;
793358Srdreslin@umich.edu    virtual void setSyscallReturn(ThreadContext *tc,
803358Srdreslin@umich.edu                                  SyscallReturn return_value) = 0;
813358Srdreslin@umich.edu    virtual SyscallDesc *getDesc(int callnum) = 0;
823358Srdreslin@umich.edu
834403Srdreslin@umich.edu    inline uint64_t uid() { return _uid; }
844403Srdreslin@umich.edu    inline uint64_t euid() { return _euid; }
855256Ssaidi@eecs.umich.edu    inline uint64_t gid() { return _gid; }
865255Ssaidi@eecs.umich.edu    inline uint64_t egid() { return _egid; }
873358Srdreslin@umich.edu    inline uint64_t pid() { return _pid; }
883358Srdreslin@umich.edu    inline uint64_t ppid() { return _ppid; }
894403Srdreslin@umich.edu    inline uint64_t pgid() { return _pgid; }
904403Srdreslin@umich.edu    inline uint64_t tgid() { return _tgid; }
915255Ssaidi@eecs.umich.edu    inline void setpgid(uint64_t pgid) { _pgid = pgid; }
923358Srdreslin@umich.edu
933358Srdreslin@umich.edu    const char *progName() const { return executable.c_str(); }
944403Srdreslin@umich.edu    std::string fullPath(const std::string &filename);
955255Ssaidi@eecs.umich.edu    std::string getcwd() const { return cwd; }
964403Srdreslin@umich.edu
973358Srdreslin@umich.edu    /**
983358Srdreslin@umich.edu     * Find an emulated device driver.
994403Srdreslin@umich.edu     *
1005255Ssaidi@eecs.umich.edu     * @param filename Name of the device (under /dev)
1014403Srdreslin@umich.edu     * @return Pointer to driver object if found, else nullptr
1023358Srdreslin@umich.edu     */
1033358Srdreslin@umich.edu    EmulatedDriver *findDriver(std::string filename);
1044403Srdreslin@umich.edu
1055255Ssaidi@eecs.umich.edu    // This function acts as a callback to update the bias value in
1064403Srdreslin@umich.edu    // the object file because the parameters needed to calculate the
1073358Srdreslin@umich.edu    // bias are not available when the object file is created.
1083358Srdreslin@umich.edu    void updateBias();
1094403Srdreslin@umich.edu    Addr getBias();
1105255Ssaidi@eecs.umich.edu    Addr getStartPC();
1114403Srdreslin@umich.edu    ObjectFile *getInterpreter();
1124403Srdreslin@umich.edu
1133358Srdreslin@umich.edu    // override of virtual SimObject method: register statistics
1143358Srdreslin@umich.edu    void regStats() override;
1154403Srdreslin@umich.edu
1165255Ssaidi@eecs.umich.edu    void allocateMem(Addr vaddr, int64_t size, bool clobber = false);
1174403Srdreslin@umich.edu
1184403Srdreslin@umich.edu    /// Attempt to fix up a fault at vaddr by allocating a page on the stack.
1194403Srdreslin@umich.edu    /// @return Whether the fault has been fixed.
1203360Srdreslin@umich.edu    bool fixupStackFault(Addr vaddr);
1214403Srdreslin@umich.edu
1223358Srdreslin@umich.edu    // After getting registered with system object, tell process which
1233358Srdreslin@umich.edu    // system-wide context id it is assigned.
1244403Srdreslin@umich.edu    void
1255255Ssaidi@eecs.umich.edu    assignThreadContext(ContextID context_id)
1264403Srdreslin@umich.edu    {
1273358Srdreslin@umich.edu        contextIds.push_back(context_id);
1283358Srdreslin@umich.edu    }
1294403Srdreslin@umich.edu
1305255Ssaidi@eecs.umich.edu    // Find a free context to use
1314403Srdreslin@umich.edu    ThreadContext *findFreeContext();
1323358Srdreslin@umich.edu
1333358Srdreslin@umich.edu    /**
1344403Srdreslin@umich.edu     * After delegating a thread context to a child process
1355256Ssaidi@eecs.umich.edu     * no longer should relate to the ThreadContext
1365255Ssaidi@eecs.umich.edu     */
1374403Srdreslin@umich.edu    void revokeThreadContext(int context_id);
1383358Srdreslin@umich.edu
1393358Srdreslin@umich.edu    /**
1404403Srdreslin@umich.edu     * Does mmap region grow upward or downward from mmapEnd?  Most
1415255Ssaidi@eecs.umich.edu     * platforms grow downward, but a few (such as Alpha) grow upward
1424403Srdreslin@umich.edu     * instead, so they can override this method to return false.
1434403Srdreslin@umich.edu     */
1444403Srdreslin@umich.edu    virtual bool mmapGrowsDown() const { return true; }
1453360Srdreslin@umich.edu
1464403Srdreslin@umich.edu    /**
1473358Srdreslin@umich.edu     * Maps a contiguous range of virtual addresses in this process's
1483358Srdreslin@umich.edu     * address space to a contiguous range of physical addresses.
1494403Srdreslin@umich.edu     * This function exists primarily to expose the map operation to
1505255Ssaidi@eecs.umich.edu     * python, so that configuration scripts can set up mappings in SE mode.
1514403Srdreslin@umich.edu     *
1524403Srdreslin@umich.edu     * @param vaddr The starting virtual address of the range.
1534403Srdreslin@umich.edu     * @param paddr The starting physical address of the range.
1543360Srdreslin@umich.edu     * @param size The length of the range in bytes.
1554403Srdreslin@umich.edu     * @param cacheable Specifies whether accesses are cacheable.
1563358Srdreslin@umich.edu     * @return True if the map operation was successful.  (At this
1573358Srdreslin@umich.edu     *           point in time, the map operation always succeeds.)
1583358Srdreslin@umich.edu     */
1593358Srdreslin@umich.edu    bool map(Addr vaddr, Addr paddr, int size, bool cacheable = true);
1603358Srdreslin@umich.edu
1613358Srdreslin@umich.edu    void replicatePage(Addr vaddr, Addr new_paddr, ThreadContext *old_tc,
1623358Srdreslin@umich.edu                       ThreadContext *new_tc, bool alloc_page);
1633358Srdreslin@umich.edu
1643358Srdreslin@umich.edu    void clone(ThreadContext *old_tc, ThreadContext *new_tc, Process *new_p,
1653358Srdreslin@umich.edu               TheISA::IntReg flags);
1663358Srdreslin@umich.edu
1673358Srdreslin@umich.edu    // thread contexts associated with this process
1683358Srdreslin@umich.edu    std::vector<ContextID> contextIds;
1693358Srdreslin@umich.edu
1703358Srdreslin@umich.edu    // system object which owns this process
1713358Srdreslin@umich.edu    System *system;
1723358Srdreslin@umich.edu
1733358Srdreslin@umich.edu    Stats::Scalar numSyscalls;  // track how many system calls are executed
1743358Srdreslin@umich.edu
1753358Srdreslin@umich.edu    bool useArchPT; // flag for using architecture specific page table
1763358Srdreslin@umich.edu    bool kvmInSE;   // running KVM requires special initialization
1773358Srdreslin@umich.edu
1783358Srdreslin@umich.edu    PageTableBase* pTable;
1793358Srdreslin@umich.edu
1803358Srdreslin@umich.edu    SETranslatingPortProxy initVirtMem; // memory proxy for initial image load
1813358Srdreslin@umich.edu
1823358Srdreslin@umich.edu    ObjectFile *objFile;
1833358Srdreslin@umich.edu    std::vector<std::string> argv;
1843358Srdreslin@umich.edu    std::vector<std::string> envp;
1853358Srdreslin@umich.edu    std::string cwd;
1863358Srdreslin@umich.edu    std::string executable;
1873358Srdreslin@umich.edu
1883358Srdreslin@umich.edu    // Id of the owner of the process
1893358Srdreslin@umich.edu    uint64_t _uid;
1903358Srdreslin@umich.edu    uint64_t _euid;
1913358Srdreslin@umich.edu    uint64_t _gid;
1921516SN/A    uint64_t _egid;
1933358Srdreslin@umich.edu
1943358Srdreslin@umich.edu    // pid of the process and it's parent
1953358Srdreslin@umich.edu    uint64_t _pid;
1961516SN/A    uint64_t _ppid;
1973358Srdreslin@umich.edu    uint64_t _pgid;
1983358Srdreslin@umich.edu    uint64_t _tgid;
1993358Srdreslin@umich.edu
2008931Sandreas.hansson@arm.com    // Emulated drivers available to this process
2013358Srdreslin@umich.edu    std::vector<EmulatedDriver *> drivers;
2021516SN/A
2033358Srdreslin@umich.edu    std::shared_ptr<FDArray> fds;
2043358Srdreslin@umich.edu
2053358Srdreslin@umich.edu    bool *exitGroup;
2063358Srdreslin@umich.edu    std::shared_ptr<MemState> memState;
2073358Srdreslin@umich.edu
2083358Srdreslin@umich.edu    /**
2093358Srdreslin@umich.edu     * Calls a futex wakeup at the address specified by this pointer when
2108847Sandreas.hansson@arm.com     * this process exits.
2118847Sandreas.hansson@arm.com     */
2128847Sandreas.hansson@arm.com    uint64_t childClearTID;
2138847Sandreas.hansson@arm.com
2143358Srdreslin@umich.edu    // Process was forked with SIGCHLD set.
2153358Srdreslin@umich.edu    bool *sigchld;
2163358Srdreslin@umich.edu};
2173358Srdreslin@umich.edu
2183358Srdreslin@umich.edu#endif // __PROCESS_HH__
2193358Srdreslin@umich.edu