process.hh revision 11905:4a771f8756ad
113481Sgiacomo.travaglini@arm.com/*
213481Sgiacomo.travaglini@arm.com * Copyright (c) 2014-2016 Advanced Micro Devices, Inc.
313481Sgiacomo.travaglini@arm.com * Copyright (c) 2001-2005 The Regents of The University of Michigan
413481Sgiacomo.travaglini@arm.com * All rights reserved.
513481Sgiacomo.travaglini@arm.com *
613481Sgiacomo.travaglini@arm.com * Redistribution and use in source and binary forms, with or without
713481Sgiacomo.travaglini@arm.com * modification, are permitted provided that the following conditions are
813481Sgiacomo.travaglini@arm.com * met: redistributions of source code must retain the above copyright
913481Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer;
1013481Sgiacomo.travaglini@arm.com * redistributions in binary form must reproduce the above copyright
1113481Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer in the
1213481Sgiacomo.travaglini@arm.com * documentation and/or other materials provided with the distribution;
1313481Sgiacomo.travaglini@arm.com * neither the name of the copyright holders nor the names of its
1413481Sgiacomo.travaglini@arm.com * contributors may be used to endorse or promote products derived from
1513481Sgiacomo.travaglini@arm.com * this software without specific prior written permission.
1613481Sgiacomo.travaglini@arm.com *
1713481Sgiacomo.travaglini@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1813481Sgiacomo.travaglini@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1913481Sgiacomo.travaglini@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2013481Sgiacomo.travaglini@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2113481Sgiacomo.travaglini@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2213481Sgiacomo.travaglini@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2313481Sgiacomo.travaglini@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2413481Sgiacomo.travaglini@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2513481Sgiacomo.travaglini@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2613481Sgiacomo.travaglini@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2713481Sgiacomo.travaglini@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2813481Sgiacomo.travaglini@arm.com *
2913481Sgiacomo.travaglini@arm.com * Authors: Nathan Binkert
3013481Sgiacomo.travaglini@arm.com *          Steve Reinhardt
3113481Sgiacomo.travaglini@arm.com *          Brandon Potter
3213481Sgiacomo.travaglini@arm.com */
3313481Sgiacomo.travaglini@arm.com
3413481Sgiacomo.travaglini@arm.com#ifndef __PROCESS_HH__
3513481Sgiacomo.travaglini@arm.com#define __PROCESS_HH__
3613481Sgiacomo.travaglini@arm.com
3713481Sgiacomo.travaglini@arm.com#include <inttypes.h>
3813481Sgiacomo.travaglini@arm.com
3913481Sgiacomo.travaglini@arm.com#include <map>
4013481Sgiacomo.travaglini@arm.com#include <string>
4113481Sgiacomo.travaglini@arm.com#include <vector>
4213481Sgiacomo.travaglini@arm.com
4313481Sgiacomo.travaglini@arm.com#include "arch/registers.hh"
4413481Sgiacomo.travaglini@arm.com#include "base/statistics.hh"
4513481Sgiacomo.travaglini@arm.com#include "base/types.hh"
4613481Sgiacomo.travaglini@arm.com#include "config/the_isa.hh"
4713481Sgiacomo.travaglini@arm.com#include "mem/se_translating_port_proxy.hh"
4813481Sgiacomo.travaglini@arm.com#include "sim/fd_array.hh"
4913481Sgiacomo.travaglini@arm.com#include "sim/fd_entry.hh"
5013481Sgiacomo.travaglini@arm.com#include "sim/mem_state.hh"
5113481Sgiacomo.travaglini@arm.com#include "sim/sim_object.hh"
5213481Sgiacomo.travaglini@arm.com
5313481Sgiacomo.travaglini@arm.comstruct ProcessParams;
5413481Sgiacomo.travaglini@arm.com
5513481Sgiacomo.travaglini@arm.comclass EmulatedDriver;
5613481Sgiacomo.travaglini@arm.comclass ObjectFile;
5713481Sgiacomo.travaglini@arm.comclass PageTableBase;
5813481Sgiacomo.travaglini@arm.comclass SyscallDesc;
5913481Sgiacomo.travaglini@arm.comclass SyscallReturn;
6013481Sgiacomo.travaglini@arm.comclass System;
6113481Sgiacomo.travaglini@arm.comclass ThreadContext;
6213481Sgiacomo.travaglini@arm.com
6313481Sgiacomo.travaglini@arm.comclass Process : public SimObject
6413481Sgiacomo.travaglini@arm.com{
6513481Sgiacomo.travaglini@arm.com  public:
6613481Sgiacomo.travaglini@arm.com    Process(ProcessParams *params, ObjectFile *obj_file);
6713481Sgiacomo.travaglini@arm.com
6813481Sgiacomo.travaglini@arm.com    void serialize(CheckpointOut &cp) const override;
6913481Sgiacomo.travaglini@arm.com    void unserialize(CheckpointIn &cp) override;
7013481Sgiacomo.travaglini@arm.com
7113481Sgiacomo.travaglini@arm.com    void initState() override;
7213481Sgiacomo.travaglini@arm.com    DrainState drain() override;
7313481Sgiacomo.travaglini@arm.com
7413481Sgiacomo.travaglini@arm.com    void syscall(int64_t callnum, ThreadContext *tc, Fault *fault);
7513481Sgiacomo.travaglini@arm.com    virtual TheISA::IntReg getSyscallArg(ThreadContext *tc, int &i) = 0;
7613481Sgiacomo.travaglini@arm.com    virtual TheISA::IntReg getSyscallArg(ThreadContext *tc, int &i, int width);
7713481Sgiacomo.travaglini@arm.com    virtual void setSyscallArg(ThreadContext *tc, int i,
7813481Sgiacomo.travaglini@arm.com                               TheISA::IntReg val) = 0;
7913481Sgiacomo.travaglini@arm.com    virtual void setSyscallReturn(ThreadContext *tc,
8013481Sgiacomo.travaglini@arm.com                                  SyscallReturn return_value) = 0;
8113481Sgiacomo.travaglini@arm.com    virtual SyscallDesc *getDesc(int callnum) = 0;
8213481Sgiacomo.travaglini@arm.com
8313481Sgiacomo.travaglini@arm.com    inline uint64_t uid() { return _uid; }
8413481Sgiacomo.travaglini@arm.com    inline uint64_t euid() { return _euid; }
8513481Sgiacomo.travaglini@arm.com    inline uint64_t gid() { return _gid; }
8613481Sgiacomo.travaglini@arm.com    inline uint64_t egid() { return _egid; }
8713481Sgiacomo.travaglini@arm.com    inline uint64_t pid() { return _pid; }
8813481Sgiacomo.travaglini@arm.com    inline uint64_t ppid() { return _ppid; }
8913481Sgiacomo.travaglini@arm.com    inline uint64_t pgid() { return _pgid; }
9013481Sgiacomo.travaglini@arm.com    inline uint64_t tgid() { return _tgid; }
9113481Sgiacomo.travaglini@arm.com    inline void setpgid(uint64_t pgid) { _pgid = pgid; }
9213481Sgiacomo.travaglini@arm.com
9313481Sgiacomo.travaglini@arm.com    const char *progName() const { return executable.c_str(); }
9413481Sgiacomo.travaglini@arm.com    std::string fullPath(const std::string &filename);
9513481Sgiacomo.travaglini@arm.com    std::string getcwd() const { return cwd; }
9613481Sgiacomo.travaglini@arm.com
9713481Sgiacomo.travaglini@arm.com    /**
9813481Sgiacomo.travaglini@arm.com     * Find an emulated device driver.
9913481Sgiacomo.travaglini@arm.com     *
10013481Sgiacomo.travaglini@arm.com     * @param filename Name of the device (under /dev)
10113481Sgiacomo.travaglini@arm.com     * @return Pointer to driver object if found, else NULL
10213481Sgiacomo.travaglini@arm.com     */
10313481Sgiacomo.travaglini@arm.com    EmulatedDriver *findDriver(std::string filename);
10413481Sgiacomo.travaglini@arm.com
10513481Sgiacomo.travaglini@arm.com    // This function acts as a callback to update the bias value in
10613481Sgiacomo.travaglini@arm.com    // the object file because the parameters needed to calculate the
10713481Sgiacomo.travaglini@arm.com    // bias are not available when the object file is created.
10813481Sgiacomo.travaglini@arm.com    void updateBias();
10913481Sgiacomo.travaglini@arm.com    Addr getBias();
11013481Sgiacomo.travaglini@arm.com    Addr getStartPC();
11113481Sgiacomo.travaglini@arm.com    ObjectFile *getInterpreter();
11213481Sgiacomo.travaglini@arm.com
11313481Sgiacomo.travaglini@arm.com    // override of virtual SimObject method: register statistics
11413481Sgiacomo.travaglini@arm.com    void regStats() override;
11513481Sgiacomo.travaglini@arm.com
11613481Sgiacomo.travaglini@arm.com    void allocateMem(Addr vaddr, int64_t size, bool clobber = false);
11713481Sgiacomo.travaglini@arm.com
11813481Sgiacomo.travaglini@arm.com    /// Attempt to fix up a fault at vaddr by allocating a page on the stack.
11913481Sgiacomo.travaglini@arm.com    /// @return Whether the fault has been fixed.
12013481Sgiacomo.travaglini@arm.com    bool fixupStackFault(Addr vaddr);
12113481Sgiacomo.travaglini@arm.com
12213481Sgiacomo.travaglini@arm.com    // After getting registered with system object, tell process which
12313481Sgiacomo.travaglini@arm.com    // system-wide context id it is assigned.
12413481Sgiacomo.travaglini@arm.com    void
12513481Sgiacomo.travaglini@arm.com    assignThreadContext(ContextID context_id)
12613481Sgiacomo.travaglini@arm.com    {
12713481Sgiacomo.travaglini@arm.com        contextIds.push_back(context_id);
12813481Sgiacomo.travaglini@arm.com    }
12913481Sgiacomo.travaglini@arm.com
13013481Sgiacomo.travaglini@arm.com    // Find a free context to use
13113481Sgiacomo.travaglini@arm.com    ThreadContext *findFreeContext();
13213481Sgiacomo.travaglini@arm.com
13313481Sgiacomo.travaglini@arm.com    /**
13413481Sgiacomo.travaglini@arm.com     * After delegating a thread context to a child process
13513481Sgiacomo.travaglini@arm.com     * no longer should relate to the ThreadContext
13613481Sgiacomo.travaglini@arm.com     */
13713481Sgiacomo.travaglini@arm.com    void revokeThreadContext(int context_id);
13813481Sgiacomo.travaglini@arm.com
13913481Sgiacomo.travaglini@arm.com    /**
14013481Sgiacomo.travaglini@arm.com     * Does mmap region grow upward or downward from mmapEnd?  Most
14113481Sgiacomo.travaglini@arm.com     * platforms grow downward, but a few (such as Alpha) grow upward
14213481Sgiacomo.travaglini@arm.com     * instead, so they can override this method to return false.
14313481Sgiacomo.travaglini@arm.com     */
14413481Sgiacomo.travaglini@arm.com    virtual bool mmapGrowsDown() const { return true; }
14513481Sgiacomo.travaglini@arm.com
14613481Sgiacomo.travaglini@arm.com    /**
14713481Sgiacomo.travaglini@arm.com     * Maps a contiguous range of virtual addresses in this process's
14813481Sgiacomo.travaglini@arm.com     * address space to a contiguous range of physical addresses.
14913481Sgiacomo.travaglini@arm.com     * This function exists primarily to expose the map operation to
15013481Sgiacomo.travaglini@arm.com     * python, so that configuration scripts can set up mappings in SE mode.
15113481Sgiacomo.travaglini@arm.com     *
15213481Sgiacomo.travaglini@arm.com     * @param vaddr The starting virtual address of the range.
15313481Sgiacomo.travaglini@arm.com     * @param paddr The starting physical address of the range.
15413481Sgiacomo.travaglini@arm.com     * @param size The length of the range in bytes.
15513481Sgiacomo.travaglini@arm.com     * @param cacheable Specifies whether accesses are cacheable.
15613481Sgiacomo.travaglini@arm.com     * @return True if the map operation was successful.  (At this
15713481Sgiacomo.travaglini@arm.com     *           point in time, the map operation always succeeds.)
15813481Sgiacomo.travaglini@arm.com     */
15913481Sgiacomo.travaglini@arm.com    bool map(Addr vaddr, Addr paddr, int size, bool cacheable = true);
16013481Sgiacomo.travaglini@arm.com
16113481Sgiacomo.travaglini@arm.com    void replicatePage(Addr vaddr, Addr new_paddr, ThreadContext *old_tc,
16213481Sgiacomo.travaglini@arm.com                       ThreadContext *new_tc, bool alloc_page);
16313481Sgiacomo.travaglini@arm.com
16413481Sgiacomo.travaglini@arm.com    void clone(ThreadContext *old_tc, ThreadContext *new_tc, Process *new_p,
16513481Sgiacomo.travaglini@arm.com               TheISA::IntReg flags);
16613481Sgiacomo.travaglini@arm.com
16713481Sgiacomo.travaglini@arm.com    // thread contexts associated with this process
16813481Sgiacomo.travaglini@arm.com    std::vector<ContextID> contextIds;
16913481Sgiacomo.travaglini@arm.com
17013481Sgiacomo.travaglini@arm.com    // system object which owns this process
17113481Sgiacomo.travaglini@arm.com    System *system;
17213481Sgiacomo.travaglini@arm.com
17313481Sgiacomo.travaglini@arm.com    Stats::Scalar numSyscalls;  // track how many system calls are executed
17413481Sgiacomo.travaglini@arm.com
17513481Sgiacomo.travaglini@arm.com    bool useArchPT; // flag for using architecture specific page table
17613481Sgiacomo.travaglini@arm.com    bool kvmInSE;   // running KVM requires special initialization
17713481Sgiacomo.travaglini@arm.com
17813481Sgiacomo.travaglini@arm.com    PageTableBase* pTable;
17913481Sgiacomo.travaglini@arm.com
18013481Sgiacomo.travaglini@arm.com    SETranslatingPortProxy initVirtMem; // memory proxy for initial image load
18113481Sgiacomo.travaglini@arm.com
18213481Sgiacomo.travaglini@arm.com    ObjectFile *objFile;
18313481Sgiacomo.travaglini@arm.com    std::vector<std::string> argv;
18413481Sgiacomo.travaglini@arm.com    std::vector<std::string> envp;
18513481Sgiacomo.travaglini@arm.com    std::string cwd;
18613481Sgiacomo.travaglini@arm.com    std::string executable;
18713481Sgiacomo.travaglini@arm.com
18813481Sgiacomo.travaglini@arm.com    // Id of the owner of the process
18913481Sgiacomo.travaglini@arm.com    uint64_t _uid;
19013481Sgiacomo.travaglini@arm.com    uint64_t _euid;
19113481Sgiacomo.travaglini@arm.com    uint64_t _gid;
19213481Sgiacomo.travaglini@arm.com    uint64_t _egid;
19313481Sgiacomo.travaglini@arm.com
19413481Sgiacomo.travaglini@arm.com    // pid of the process and it's parent
19513481Sgiacomo.travaglini@arm.com    uint64_t _pid;
19613481Sgiacomo.travaglini@arm.com    uint64_t _ppid;
19713481Sgiacomo.travaglini@arm.com    uint64_t _pgid;
19813481Sgiacomo.travaglini@arm.com    uint64_t _tgid;
19913481Sgiacomo.travaglini@arm.com
20013481Sgiacomo.travaglini@arm.com    // Emulated drivers available to this process
20113481Sgiacomo.travaglini@arm.com    std::vector<EmulatedDriver *> drivers;
20213481Sgiacomo.travaglini@arm.com
20313481Sgiacomo.travaglini@arm.com    std::shared_ptr<FDArray> fds;
20413481Sgiacomo.travaglini@arm.com
20513481Sgiacomo.travaglini@arm.com    bool *exitGroup;
20613481Sgiacomo.travaglini@arm.com    std::shared_ptr<MemState> memState;
20713481Sgiacomo.travaglini@arm.com
20813481Sgiacomo.travaglini@arm.com    /**
20913481Sgiacomo.travaglini@arm.com     * Calls a futex wakeup at the address specified by this pointer when
21013481Sgiacomo.travaglini@arm.com     * this process exits.
21113481Sgiacomo.travaglini@arm.com     */
21213481Sgiacomo.travaglini@arm.com    uint64_t childClearTID;
21313481Sgiacomo.travaglini@arm.com
21413481Sgiacomo.travaglini@arm.com    // Process was forked with SIGCHLD set.
21513481Sgiacomo.travaglini@arm.com    bool *sigchld;
21613481Sgiacomo.travaglini@arm.com};
21713481Sgiacomo.travaglini@arm.com
21813481Sgiacomo.travaglini@arm.com#endif // __PROCESS_HH__
21913481Sgiacomo.travaglini@arm.com