process.hh revision 3311:7eb47a60dbd4
113481Sgiacomo.travaglini@arm.com/*
213481Sgiacomo.travaglini@arm.com * Copyright (c) 2001-2005 The Regents of The University of Michigan
313481Sgiacomo.travaglini@arm.com * All rights reserved.
413481Sgiacomo.travaglini@arm.com *
513481Sgiacomo.travaglini@arm.com * Redistribution and use in source and binary forms, with or without
613481Sgiacomo.travaglini@arm.com * modification, are permitted provided that the following conditions are
713481Sgiacomo.travaglini@arm.com * met: redistributions of source code must retain the above copyright
813481Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer;
913481Sgiacomo.travaglini@arm.com * redistributions in binary form must reproduce the above copyright
1013481Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer in the
1113481Sgiacomo.travaglini@arm.com * documentation and/or other materials provided with the distribution;
1213481Sgiacomo.travaglini@arm.com * neither the name of the copyright holders nor the names of its
1313481Sgiacomo.travaglini@arm.com * contributors may be used to endorse or promote products derived from
1413481Sgiacomo.travaglini@arm.com * this software without specific prior written permission.
1513481Sgiacomo.travaglini@arm.com *
1613481Sgiacomo.travaglini@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1713481Sgiacomo.travaglini@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1813481Sgiacomo.travaglini@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1913481Sgiacomo.travaglini@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2013481Sgiacomo.travaglini@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2113481Sgiacomo.travaglini@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2213481Sgiacomo.travaglini@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2313481Sgiacomo.travaglini@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2413481Sgiacomo.travaglini@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2513481Sgiacomo.travaglini@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2613481Sgiacomo.travaglini@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2713481Sgiacomo.travaglini@arm.com *
2813481Sgiacomo.travaglini@arm.com * Authors: Nathan Binkert
2913481Sgiacomo.travaglini@arm.com *          Steve Reinhardt
3013481Sgiacomo.travaglini@arm.com */
3113481Sgiacomo.travaglini@arm.com
3213481Sgiacomo.travaglini@arm.com#ifndef __PROCESS_HH__
3313481Sgiacomo.travaglini@arm.com#define __PROCESS_HH__
3413481Sgiacomo.travaglini@arm.com
3513481Sgiacomo.travaglini@arm.com//
3613481Sgiacomo.travaglini@arm.com// The purpose of this code is to fake the loader & syscall mechanism
3713481Sgiacomo.travaglini@arm.com// when there's no OS: thus there's no reason to use it in FULL_SYSTEM
3813481Sgiacomo.travaglini@arm.com// mode when we do have an OS.
3913481Sgiacomo.travaglini@arm.com//
4013481Sgiacomo.travaglini@arm.com#include "config/full_system.hh"
4113481Sgiacomo.travaglini@arm.com
4213481Sgiacomo.travaglini@arm.com#if !FULL_SYSTEM
4313481Sgiacomo.travaglini@arm.com
4413481Sgiacomo.travaglini@arm.com#include <vector>
4513481Sgiacomo.travaglini@arm.com
4613481Sgiacomo.travaglini@arm.com#include "base/statistics.hh"
4713481Sgiacomo.travaglini@arm.com#include "sim/sim_object.hh"
4813481Sgiacomo.travaglini@arm.com
4913481Sgiacomo.travaglini@arm.comclass ThreadContext;
5013481Sgiacomo.travaglini@arm.comclass SyscallDesc;
5113481Sgiacomo.travaglini@arm.comclass PageTable;
5213481Sgiacomo.travaglini@arm.comclass TranslatingPort;
5313481Sgiacomo.travaglini@arm.comclass System;
5413481Sgiacomo.travaglini@arm.com
5513481Sgiacomo.travaglini@arm.comvoid
5613481Sgiacomo.travaglini@arm.comcopyStringArray(std::vector<std::string> &strings, Addr array_ptr,
5713481Sgiacomo.travaglini@arm.com        Addr data_ptr, TranslatingPort* memPort);
5813481Sgiacomo.travaglini@arm.com
5913481Sgiacomo.travaglini@arm.comclass Process : public SimObject
6013481Sgiacomo.travaglini@arm.com{
6113481Sgiacomo.travaglini@arm.com  public:
6213481Sgiacomo.travaglini@arm.com
6313481Sgiacomo.travaglini@arm.com    /// Pointer to object representing the system this process is
6413481Sgiacomo.travaglini@arm.com    /// running on.
6513481Sgiacomo.travaglini@arm.com    System *system;
6613481Sgiacomo.travaglini@arm.com
6713481Sgiacomo.travaglini@arm.com    // have we initialized a thread context from this process?  If
6813481Sgiacomo.travaglini@arm.com    // yes, subsequent contexts are assumed to be for dynamically
6913481Sgiacomo.travaglini@arm.com    // created threads and are not initialized.
7013481Sgiacomo.travaglini@arm.com    bool initialContextLoaded;
7113481Sgiacomo.travaglini@arm.com
7213481Sgiacomo.travaglini@arm.com    // thread contexts associated with this process
7313481Sgiacomo.travaglini@arm.com    std::vector<ThreadContext *> threadContexts;
7413481Sgiacomo.travaglini@arm.com
7513481Sgiacomo.travaglini@arm.com    // number of CPUs (esxec contexts, really) assigned to this process.
7613481Sgiacomo.travaglini@arm.com    unsigned int numCpus() { return threadContexts.size(); }
7713481Sgiacomo.travaglini@arm.com
7813481Sgiacomo.travaglini@arm.com    // record of blocked context
7913481Sgiacomo.travaglini@arm.com    struct WaitRec
8013481Sgiacomo.travaglini@arm.com    {
8113481Sgiacomo.travaglini@arm.com        Addr waitChan;
8213481Sgiacomo.travaglini@arm.com        ThreadContext *waitingContext;
8313481Sgiacomo.travaglini@arm.com
8413481Sgiacomo.travaglini@arm.com        WaitRec(Addr chan, ThreadContext *ctx)
8513481Sgiacomo.travaglini@arm.com            : waitChan(chan), waitingContext(ctx)
8613481Sgiacomo.travaglini@arm.com        {	}
8713481Sgiacomo.travaglini@arm.com    };
8813481Sgiacomo.travaglini@arm.com
8913481Sgiacomo.travaglini@arm.com    // list of all blocked contexts
9013481Sgiacomo.travaglini@arm.com    std::list<WaitRec> waitList;
9113481Sgiacomo.travaglini@arm.com
9213481Sgiacomo.travaglini@arm.com    Addr brk_point;		// top of the data segment
9313481Sgiacomo.travaglini@arm.com
9413481Sgiacomo.travaglini@arm.com    Addr stack_base;		// stack segment base (highest address)
9513481Sgiacomo.travaglini@arm.com    unsigned stack_size;	// initial stack size
9613481Sgiacomo.travaglini@arm.com    Addr stack_min;		// lowest address accessed on the stack
9713481Sgiacomo.travaglini@arm.com
9813481Sgiacomo.travaglini@arm.com    // addr to use for next stack region (for multithreaded apps)
9913481Sgiacomo.travaglini@arm.com    Addr next_thread_stack_base;
10013481Sgiacomo.travaglini@arm.com
10113481Sgiacomo.travaglini@arm.com    // Base of region for mmaps (when user doesn't specify an address).
10213481Sgiacomo.travaglini@arm.com    Addr mmap_start;
10313481Sgiacomo.travaglini@arm.com    Addr mmap_end;
10413481Sgiacomo.travaglini@arm.com
10513481Sgiacomo.travaglini@arm.com    // Base of region for nxm data
10613481Sgiacomo.travaglini@arm.com    Addr nxm_start;
10713481Sgiacomo.travaglini@arm.com    Addr nxm_end;
10813481Sgiacomo.travaglini@arm.com
10913481Sgiacomo.travaglini@arm.com    std::string prog_fname;	// file name
11013481Sgiacomo.travaglini@arm.com
11113481Sgiacomo.travaglini@arm.com    Stats::Scalar<> num_syscalls;	// number of syscalls executed
11213481Sgiacomo.travaglini@arm.com
11313481Sgiacomo.travaglini@arm.com
11413481Sgiacomo.travaglini@arm.com  protected:
11513481Sgiacomo.travaglini@arm.com    // constructor
11613481Sgiacomo.travaglini@arm.com    Process(const std::string &nm,
11713481Sgiacomo.travaglini@arm.com            System *_system,
11813481Sgiacomo.travaglini@arm.com            int stdin_fd, 	// initial I/O descriptors
11913481Sgiacomo.travaglini@arm.com            int stdout_fd,
12013481Sgiacomo.travaglini@arm.com            int stderr_fd);
12113481Sgiacomo.travaglini@arm.com
12213481Sgiacomo.travaglini@arm.com    // post initialization startup
12313481Sgiacomo.travaglini@arm.com    virtual void startup();
12413481Sgiacomo.travaglini@arm.com
12513481Sgiacomo.travaglini@arm.com  protected:
12613481Sgiacomo.travaglini@arm.com    /// Memory object for initialization (image loading)
12713481Sgiacomo.travaglini@arm.com    TranslatingPort *initVirtMem;
12813481Sgiacomo.travaglini@arm.com
12913481Sgiacomo.travaglini@arm.com  public:
13013481Sgiacomo.travaglini@arm.com    PageTable *pTable;
13113481Sgiacomo.travaglini@arm.com
13213481Sgiacomo.travaglini@arm.com  private:
13313481Sgiacomo.travaglini@arm.com    // file descriptor remapping support
13413481Sgiacomo.travaglini@arm.com    static const int MAX_FD = 256;	// max legal fd value
13513481Sgiacomo.travaglini@arm.com    int fd_map[MAX_FD+1];
13613481Sgiacomo.travaglini@arm.com
13713481Sgiacomo.travaglini@arm.com  public:
13813481Sgiacomo.travaglini@arm.com    // static helper functions to generate file descriptors for constructor
13913481Sgiacomo.travaglini@arm.com    static int openInputFile(const std::string &filename);
14013481Sgiacomo.travaglini@arm.com    static int openOutputFile(const std::string &filename);
14113481Sgiacomo.travaglini@arm.com
14213481Sgiacomo.travaglini@arm.com    // override of virtual SimObject method: register statistics
14313481Sgiacomo.travaglini@arm.com    virtual void regStats();
14413481Sgiacomo.travaglini@arm.com
14513481Sgiacomo.travaglini@arm.com    // register a thread context for this process.
14613481Sgiacomo.travaglini@arm.com    // returns tc's cpu number (index into threadContexts[])
14713481Sgiacomo.travaglini@arm.com    int registerThreadContext(ThreadContext *tc);
14813481Sgiacomo.travaglini@arm.com
14913481Sgiacomo.travaglini@arm.com
15013481Sgiacomo.travaglini@arm.com    void replaceThreadContext(ThreadContext *tc, int tcIndex);
15113481Sgiacomo.travaglini@arm.com
15213481Sgiacomo.travaglini@arm.com    // map simulator fd sim_fd to target fd tgt_fd
15313481Sgiacomo.travaglini@arm.com    void dup_fd(int sim_fd, int tgt_fd);
15413481Sgiacomo.travaglini@arm.com
15513481Sgiacomo.travaglini@arm.com    // generate new target fd for sim_fd
15613481Sgiacomo.travaglini@arm.com    int alloc_fd(int sim_fd);
15713481Sgiacomo.travaglini@arm.com
15813481Sgiacomo.travaglini@arm.com    // free target fd (e.g., after close)
15913481Sgiacomo.travaglini@arm.com    void free_fd(int tgt_fd);
16013481Sgiacomo.travaglini@arm.com
16113481Sgiacomo.travaglini@arm.com    // look up simulator fd for given target fd
16213481Sgiacomo.travaglini@arm.com    int sim_fd(int tgt_fd);
16313481Sgiacomo.travaglini@arm.com
16413481Sgiacomo.travaglini@arm.com    virtual void syscall(int64_t callnum, ThreadContext *tc) = 0;
16513481Sgiacomo.travaglini@arm.com
16613481Sgiacomo.travaglini@arm.com    void serialize(std::ostream &os);
16713481Sgiacomo.travaglini@arm.com    void unserialize(Checkpoint *cp, const std::string &section);
16813481Sgiacomo.travaglini@arm.com};
16913481Sgiacomo.travaglini@arm.com
17013481Sgiacomo.travaglini@arm.com//
17113481Sgiacomo.travaglini@arm.com// "Live" process with system calls redirected to host system
17213481Sgiacomo.travaglini@arm.com//
17313481Sgiacomo.travaglini@arm.comclass ObjectFile;
17413481Sgiacomo.travaglini@arm.comclass LiveProcess : public Process
17513481Sgiacomo.travaglini@arm.com{
17613481Sgiacomo.travaglini@arm.com  protected:
17713481Sgiacomo.travaglini@arm.com    ObjectFile *objFile;
17813481Sgiacomo.travaglini@arm.com    std::vector<std::string> argv;
17913481Sgiacomo.travaglini@arm.com    std::vector<std::string> envp;
18013481Sgiacomo.travaglini@arm.com
18113481Sgiacomo.travaglini@arm.com    LiveProcess(const std::string &nm, ObjectFile *objFile,
18213481Sgiacomo.travaglini@arm.com                System *_system, int stdin_fd, int stdout_fd, int stderr_fd,
18313481Sgiacomo.travaglini@arm.com                std::vector<std::string> &argv,
18413481Sgiacomo.travaglini@arm.com                std::vector<std::string> &envp,
18513481Sgiacomo.travaglini@arm.com                uint64_t _uid, uint64_t _euid,
18613481Sgiacomo.travaglini@arm.com                uint64_t _gid, uint64_t _egid,
18713481Sgiacomo.travaglini@arm.com                uint64_t _pid, uint64_t _ppid);
18813481Sgiacomo.travaglini@arm.com
18913481Sgiacomo.travaglini@arm.com    virtual void argsInit(int intSize, int pageSize);
19013481Sgiacomo.travaglini@arm.com
19113481Sgiacomo.travaglini@arm.com    // Id of the owner of the process
19213481Sgiacomo.travaglini@arm.com    uint64_t __uid;
19313481Sgiacomo.travaglini@arm.com    uint64_t __euid;
19413481Sgiacomo.travaglini@arm.com    uint64_t __gid;
19513481Sgiacomo.travaglini@arm.com    uint64_t __egid;
19613481Sgiacomo.travaglini@arm.com
19713481Sgiacomo.travaglini@arm.com    // pid of the process and it's parent
19813481Sgiacomo.travaglini@arm.com    uint64_t __pid;
19913481Sgiacomo.travaglini@arm.com    uint64_t __ppid;
20013481Sgiacomo.travaglini@arm.com
20113481Sgiacomo.travaglini@arm.com  public:
20213481Sgiacomo.travaglini@arm.com
20313481Sgiacomo.travaglini@arm.com    inline uint64_t uid() {return __uid;}
20413481Sgiacomo.travaglini@arm.com    inline uint64_t euid() {return __euid;}
20513481Sgiacomo.travaglini@arm.com    inline uint64_t gid() {return __gid;}
20613481Sgiacomo.travaglini@arm.com    inline uint64_t egid() {return __egid;}
20713481Sgiacomo.travaglini@arm.com    inline uint64_t pid() {return __pid;}
20813481Sgiacomo.travaglini@arm.com    inline uint64_t ppid() {return __ppid;}
20913481Sgiacomo.travaglini@arm.com
21013481Sgiacomo.travaglini@arm.com    virtual void syscall(int64_t callnum, ThreadContext *tc);
21113481Sgiacomo.travaglini@arm.com
21213481Sgiacomo.travaglini@arm.com    virtual SyscallDesc* getDesc(int callnum) = 0;
21313481Sgiacomo.travaglini@arm.com
21413481Sgiacomo.travaglini@arm.com    // this function is used to create the LiveProcess object, since
21513481Sgiacomo.travaglini@arm.com    // we can't tell which subclass of LiveProcess to use until we
21613481Sgiacomo.travaglini@arm.com    // open and look at the object file.
21713481Sgiacomo.travaglini@arm.com    static LiveProcess *create(const std::string &nm,
21813481Sgiacomo.travaglini@arm.com                               System *_system,
21913481Sgiacomo.travaglini@arm.com                               int stdin_fd, int stdout_fd, int stderr_fd,
22013481Sgiacomo.travaglini@arm.com                               std::string executable,
22113481Sgiacomo.travaglini@arm.com                               std::vector<std::string> &argv,
22213481Sgiacomo.travaglini@arm.com                               std::vector<std::string> &envp,
22313481Sgiacomo.travaglini@arm.com                               uint64_t _uid, uint64_t _euid,
22413481Sgiacomo.travaglini@arm.com                               uint64_t _gid, uint64_t _egid,
22513481Sgiacomo.travaglini@arm.com                               uint64_t _pid, uint64_t _ppid);
22613481Sgiacomo.travaglini@arm.com};
22713481Sgiacomo.travaglini@arm.com
22813481Sgiacomo.travaglini@arm.com
22913481Sgiacomo.travaglini@arm.com#endif // !FULL_SYSTEM
23013481Sgiacomo.travaglini@arm.com
23113481Sgiacomo.travaglini@arm.com#endif // __PROCESS_HH__
23213481Sgiacomo.travaglini@arm.com