process.hh revision 3971:e935846cccfa
12330SN/A/*
22330SN/A * Copyright (c) 2001-2005 The Regents of The University of Michigan
32330SN/A * All rights reserved.
42330SN/A *
52330SN/A * Redistribution and use in source and binary forms, with or without
62330SN/A * modification, are permitted provided that the following conditions are
72330SN/A * met: redistributions of source code must retain the above copyright
82330SN/A * notice, this list of conditions and the following disclaimer;
92330SN/A * redistributions in binary form must reproduce the above copyright
102330SN/A * notice, this list of conditions and the following disclaimer in the
112330SN/A * documentation and/or other materials provided with the distribution;
122330SN/A * neither the name of the copyright holders nor the names of its
132330SN/A * contributors may be used to endorse or promote products derived from
142330SN/A * this software without specific prior written permission.
152330SN/A *
162330SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172330SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182330SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192330SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202330SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212330SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222330SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232330SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242330SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252330SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262330SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272689Sktlim@umich.edu *
282689Sktlim@umich.edu * Authors: Nathan Binkert
292330SN/A *          Steve Reinhardt
302292SN/A */
312292SN/A
322292SN/A#ifndef __PROCESS_HH__
332292SN/A#define __PROCESS_HH__
342980Sgblack@eecs.umich.edu
352362SN/A//
362680Sktlim@umich.edu// The purpose of this code is to fake the loader & syscall mechanism
372292SN/A// when there's no OS: thus there's no reason to use it in FULL_SYSTEM
382678Sktlim@umich.edu// mode when we do have an OS.
392683Sktlim@umich.edu//
402683Sktlim@umich.edu#include "config/full_system.hh"
412678Sktlim@umich.edu
422678Sktlim@umich.edu#if !FULL_SYSTEM
432292SN/A
442292SN/A#include <vector>
452292SN/A
462292SN/A#include "base/statistics.hh"
473548Sgblack@eecs.umich.edu#include "sim/sim_object.hh"
483548Sgblack@eecs.umich.edu
493548Sgblack@eecs.umich.educlass ThreadContext;
503548Sgblack@eecs.umich.educlass SyscallDesc;
512330SN/Aclass PageTable;
522292SN/Aclass TranslatingPort;
532292SN/Aclass System;
543402Sktlim@umich.educlass GDBListener;
552862Sktlim@umich.edunamespace TheISA
563486Sktlim@umich.edu{
573402Sktlim@umich.edu    class RemoteGDB;
582862Sktlim@umich.edu}
592330SN/A
602330SN/Avoid
612330SN/AcopyStringArray(std::vector<std::string> &strings, Addr array_ptr,
622330SN/A        Addr data_ptr, TranslatingPort* memPort);
632330SN/A
642330SN/Aclass Process : public SimObject
652292SN/A{
662683Sktlim@umich.edu  public:
672683Sktlim@umich.edu
682292SN/A    /// Pointer to object representing the system this process is
693402Sktlim@umich.edu    /// running on.
702292SN/A    System *system;
713402Sktlim@umich.edu
723402Sktlim@umich.edu    // have we initialized a thread context from this process?  If
732292SN/A    // yes, subsequent contexts are assumed to be for dynamically
742683Sktlim@umich.edu    // created threads and are not initialized.
753486Sktlim@umich.edu    bool initialContextLoaded;
763486Sktlim@umich.edu
772862Sktlim@umich.edu    // thread contexts associated with this process
782862Sktlim@umich.edu    std::vector<ThreadContext *> threadContexts;
792862Sktlim@umich.edu
802862Sktlim@umich.edu    // remote gdb objects
812683Sktlim@umich.edu    std::vector<TheISA::RemoteGDB *> remoteGDB;
822683Sktlim@umich.edu    std::vector<GDBListener *> gdbListen;
832683Sktlim@umich.edu    bool breakpoint();
842683Sktlim@umich.edu
852683Sktlim@umich.edu    // number of CPUs (esxec contexts, really) assigned to this process.
862683Sktlim@umich.edu    unsigned int numCpus() { return threadContexts.size(); }
872683Sktlim@umich.edu
882683Sktlim@umich.edu    // record of blocked context
892683Sktlim@umich.edu    struct WaitRec
902683Sktlim@umich.edu    {
912683Sktlim@umich.edu        Addr waitChan;
922683Sktlim@umich.edu        ThreadContext *waitingContext;
932683Sktlim@umich.edu
942683Sktlim@umich.edu        WaitRec(Addr chan, ThreadContext *ctx)
952683Sktlim@umich.edu            : waitChan(chan), waitingContext(ctx)
962683Sktlim@umich.edu        {	}
972683Sktlim@umich.edu    };
982683Sktlim@umich.edu
992683Sktlim@umich.edu    // list of all blocked contexts
1002683Sktlim@umich.edu    std::list<WaitRec> waitList;
1012683Sktlim@umich.edu
1023548Sgblack@eecs.umich.edu    Addr brk_point;		// top of the data segment
1032683Sktlim@umich.edu
1042690Sktlim@umich.edu    Addr stack_base;		// stack segment base (highest address)
1052690Sktlim@umich.edu    unsigned stack_size;	// initial stack size
1062683Sktlim@umich.edu    Addr stack_min;		// lowest address accessed on the stack
1072683Sktlim@umich.edu
1082690Sktlim@umich.edu    // addr to use for next stack region (for multithreaded apps)
1092690Sktlim@umich.edu    Addr next_thread_stack_base;
1102683Sktlim@umich.edu
1112683Sktlim@umich.edu    // Base of region for mmaps (when user doesn't specify an address).
1122683Sktlim@umich.edu    Addr mmap_start;
1132683Sktlim@umich.edu    Addr mmap_end;
1143402Sktlim@umich.edu
1152683Sktlim@umich.edu    // Base of region for nxm data
1162683Sktlim@umich.edu    Addr nxm_start;
1172683Sktlim@umich.edu    Addr nxm_end;
1182683Sktlim@umich.edu
1192683Sktlim@umich.edu    std::string prog_fname;	// file name
1202678Sktlim@umich.edu
1212292SN/A    Stats::Scalar<> num_syscalls;	// number of syscalls executed
1222683Sktlim@umich.edu
1232683Sktlim@umich.edu
1242292SN/A  protected:
1252683Sktlim@umich.edu    // constructor
1262683Sktlim@umich.edu    Process(const std::string &nm,
1272683Sktlim@umich.edu            System *_system,
1282683Sktlim@umich.edu            int stdin_fd, 	// initial I/O descriptors
1292683Sktlim@umich.edu            int stdout_fd,
1302683Sktlim@umich.edu            int stderr_fd);
1312683Sktlim@umich.edu
1322683Sktlim@umich.edu    // post initialization startup
1332683Sktlim@umich.edu    virtual void startup();
1342683Sktlim@umich.edu
1352683Sktlim@umich.edu  protected:
1362683Sktlim@umich.edu    /// Memory object for initialization (image loading)
1372683Sktlim@umich.edu    TranslatingPort *initVirtMem;
1382683Sktlim@umich.edu
1392683Sktlim@umich.edu  public:
1402683Sktlim@umich.edu    PageTable *pTable;
1412683Sktlim@umich.edu
1422683Sktlim@umich.edu  private:
1432683Sktlim@umich.edu    // file descriptor remapping support
1443486Sktlim@umich.edu    static const int MAX_FD = 256;	// max legal fd value
1453486Sktlim@umich.edu    int fd_map[MAX_FD+1];
1463486Sktlim@umich.edu
1473486Sktlim@umich.edu  public:
1483486Sktlim@umich.edu    // static helper functions to generate file descriptors for constructor
1493486Sktlim@umich.edu    static int openInputFile(const std::string &filename);
1502683Sktlim@umich.edu    static int openOutputFile(const std::string &filename);
1512683Sktlim@umich.edu
1522683Sktlim@umich.edu    // override of virtual SimObject method: register statistics
1532683Sktlim@umich.edu    virtual void regStats();
1542683Sktlim@umich.edu
1552683Sktlim@umich.edu    // register a thread context for this process.
1562683Sktlim@umich.edu    // returns tc's cpu number (index into threadContexts[])
1572683Sktlim@umich.edu    int registerThreadContext(ThreadContext *tc);
1582683Sktlim@umich.edu
1592683Sktlim@umich.edu
1602683Sktlim@umich.edu    void replaceThreadContext(ThreadContext *tc, int tcIndex);
1612683Sktlim@umich.edu
1622683Sktlim@umich.edu    // map simulator fd sim_fd to target fd tgt_fd
1632683Sktlim@umich.edu    void dup_fd(int sim_fd, int tgt_fd);
1642683Sktlim@umich.edu
1652683Sktlim@umich.edu    // generate new target fd for sim_fd
1662683Sktlim@umich.edu    int alloc_fd(int sim_fd);
1672683Sktlim@umich.edu
1683402Sktlim@umich.edu    // free target fd (e.g., after close)
1693402Sktlim@umich.edu    void free_fd(int tgt_fd);
1703402Sktlim@umich.edu
1712683Sktlim@umich.edu    // look up simulator fd for given target fd
1722683Sktlim@umich.edu    int sim_fd(int tgt_fd);
1732292SN/A
1742292SN/A    virtual void syscall(int64_t callnum, ThreadContext *tc) = 0;
1752292SN/A
1762292SN/A    void serialize(std::ostream &os);
1772292SN/A    void unserialize(Checkpoint *cp, const std::string &section);
1782690Sktlim@umich.edu};
1792683Sktlim@umich.edu
1802683Sktlim@umich.edu//
1812292SN/A// "Live" process with system calls redirected to host system
1822683Sktlim@umich.edu//
1832683Sktlim@umich.educlass ObjectFile;
1842292SN/Aclass LiveProcess : public Process
1852292SN/A{
1862683Sktlim@umich.edu  protected:
1872292SN/A    ObjectFile *objFile;
1882292SN/A    std::vector<std::string> argv;
1892292SN/A    std::vector<std::string> envp;
1902292SN/A    std::string cwd;
1912292SN/A
1923548Sgblack@eecs.umich.edu    LiveProcess(const std::string &nm, ObjectFile *objFile,
1932683Sktlim@umich.edu                System *_system, int stdin_fd, int stdout_fd, int stderr_fd,
1942683Sktlim@umich.edu                std::vector<std::string> &argv,
1952683Sktlim@umich.edu                std::vector<std::string> &envp,
1962683Sktlim@umich.edu                const std::string &cwd,
1972683Sktlim@umich.edu                uint64_t _uid, uint64_t _euid,
1982683Sktlim@umich.edu                uint64_t _gid, uint64_t _egid,
1992683Sktlim@umich.edu                uint64_t _pid, uint64_t _ppid);
2002683Sktlim@umich.edu
2012292SN/A    virtual void argsInit(int intSize, int pageSize);
2022678Sktlim@umich.edu
2032678Sktlim@umich.edu    // Id of the owner of the process
2042292SN/A    uint64_t __uid;
2052292SN/A    uint64_t __euid;
2062292SN/A    uint64_t __gid;
2072292SN/A    uint64_t __egid;
2082292SN/A
2092292SN/A    // pid of the process and it's parent
2102330SN/A    uint64_t __pid;
2112330SN/A    uint64_t __ppid;
2122330SN/A
2132683Sktlim@umich.edu  public:
2142683Sktlim@umich.edu
2152683Sktlim@umich.edu    inline uint64_t uid() {return __uid;}
2162683Sktlim@umich.edu    inline uint64_t euid() {return __euid;}
2172292SN/A    inline uint64_t gid() {return __gid;}
2183276Sgblack@eecs.umich.edu    inline uint64_t egid() {return __egid;}
2193276Sgblack@eecs.umich.edu    inline uint64_t pid() {return __pid;}
2203276Sgblack@eecs.umich.edu    inline uint64_t ppid() {return __ppid;}
2213276Sgblack@eecs.umich.edu
2223276Sgblack@eecs.umich.edu    std::string
2233276Sgblack@eecs.umich.edu    fullPath(const std::string &filename)
2243276Sgblack@eecs.umich.edu    {
2253276Sgblack@eecs.umich.edu        if (filename[0] == '/' || cwd.empty())
2263276Sgblack@eecs.umich.edu            return filename;
2273276Sgblack@eecs.umich.edu
2282690Sktlim@umich.edu        std::string full = cwd;
2292292SN/A
2302292SN/A        if (cwd[cwd.size() - 1] != '/')
2312292SN/A            full += '/';
2322292SN/A
2332292SN/A        return full + filename;
2342292SN/A    }
2352292SN/A
2362292SN/A    virtual void syscall(int64_t callnum, ThreadContext *tc);
2372292SN/A
2382292SN/A    virtual SyscallDesc* getDesc(int callnum) = 0;
2392292SN/A
2402292SN/A    // this function is used to create the LiveProcess object, since
2412292SN/A    // we can't tell which subclass of LiveProcess to use until we
2422292SN/A    // open and look at the object file.
2432292SN/A    static LiveProcess *create(const std::string &nm,
2442292SN/A                               System *_system,
2452292SN/A                               int stdin_fd, int stdout_fd, int stderr_fd,
2462292SN/A                               std::string executable,
2472292SN/A                               std::vector<std::string> &argv,
2482292SN/A                               std::vector<std::string> &envp,
2492292SN/A                               const std::string &cwd,
2502292SN/A                               uint64_t _uid, uint64_t _euid,
2512292SN/A                               uint64_t _gid, uint64_t _egid,
2522292SN/A                               uint64_t _pid, uint64_t _ppid);
2532292SN/A};
254
255
256#endif // !FULL_SYSTEM
257
258#endif // __PROCESS_HH__
259