process.hh revision 2
16313Sgblack@eecs.umich.edu/* 26313Sgblack@eecs.umich.edu * Copyright (c) 2003 The Regents of The University of Michigan 36313Sgblack@eecs.umich.edu * All rights reserved. 46313Sgblack@eecs.umich.edu * 56313Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 66313Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 76313Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 86313Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 96313Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 106313Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 116313Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 126313Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 136313Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 146313Sgblack@eecs.umich.edu * this software without specific prior written permission. 156313Sgblack@eecs.umich.edu * 166313Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176313Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186313Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196313Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206313Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216313Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226313Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236313Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246313Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256313Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266313Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276313Sgblack@eecs.umich.edu */ 286313Sgblack@eecs.umich.edu 296313Sgblack@eecs.umich.edu#ifndef __PROG_HH__ 306313Sgblack@eecs.umich.edu#define __PROG_HH__ 3111793Sbrandon.potter@amd.com 3211793Sbrandon.potter@amd.com// 337678Sgblack@eecs.umich.edu// The purpose of this code is to fake the loader & syscall mechanism 347678Sgblack@eecs.umich.edu// when there's no OS: thus there's no reason to use it in FULL_SYSTEM 3512334Sgabeblack@google.com// mode when we do have an OS. 366313Sgblack@eecs.umich.edu// 379384SAndreas.Sandberg@arm.com#ifndef FULL_SYSTEM 387680Sgblack@eecs.umich.edu 396313Sgblack@eecs.umich.edu#include <list> 406313Sgblack@eecs.umich.edu 416313Sgblack@eecs.umich.edu#include "stats.hh" 426313Sgblack@eecs.umich.edu#include "sim_object.hh" 439384SAndreas.Sandberg@arm.com 4410033SAli.Saidi@ARM.com#include "statistics.hh" 459384SAndreas.Sandberg@arm.com#include "sim_stats.hh" 469384SAndreas.Sandberg@arm.com 479384SAndreas.Sandberg@arm.comclass ExecContext; 489384SAndreas.Sandberg@arm.comclass FunctionalMemory; 499384SAndreas.Sandberg@arm.comclass Process : public SimObject 509384SAndreas.Sandberg@arm.com{ 519384SAndreas.Sandberg@arm.com public: 529384SAndreas.Sandberg@arm.com 539384SAndreas.Sandberg@arm.com // have we initialized an execution context from this process? If 549384SAndreas.Sandberg@arm.com // yes, subsequent contexts are assumed to be for dynamically 559384SAndreas.Sandberg@arm.com // created threads and are not initialized. 566313Sgblack@eecs.umich.edu bool initialContextLoaded; 5710905Sandreas.sandberg@arm.com 586313Sgblack@eecs.umich.edu // execution contexts associated with this process 596330Sgblack@eecs.umich.edu std::list<ExecContext *> execContexts; 606330Sgblack@eecs.umich.edu // number of CPUs assigned to this process: should match number of 616330Sgblack@eecs.umich.edu // contexts in execContexts list 626330Sgblack@eecs.umich.edu unsigned numCpus; 636330Sgblack@eecs.umich.edu 646313Sgblack@eecs.umich.edu // record of blocked context 656313Sgblack@eecs.umich.edu struct WaitRec 666313Sgblack@eecs.umich.edu { 6710905Sandreas.sandberg@arm.com Addr waitChan; 686313Sgblack@eecs.umich.edu ExecContext *waitingContext; 696330Sgblack@eecs.umich.edu 706330Sgblack@eecs.umich.edu WaitRec(Addr chan, ExecContext *ctx) 716330Sgblack@eecs.umich.edu : waitChan(chan), waitingContext(ctx) 726330Sgblack@eecs.umich.edu { 736330Sgblack@eecs.umich.edu } 746330Sgblack@eecs.umich.edu }; 756330Sgblack@eecs.umich.edu 766330Sgblack@eecs.umich.edu // list of all blocked contexts 776330Sgblack@eecs.umich.edu std::list<WaitRec> waitList; 7810698Sandreas.hansson@arm.com 796330Sgblack@eecs.umich.edu RegFile *init_regs; // initial register contents 806330Sgblack@eecs.umich.edu 816330Sgblack@eecs.umich.edu Addr text_base; // text (code) segment base 826330Sgblack@eecs.umich.edu unsigned text_size; // text (code) size in bytes 836330Sgblack@eecs.umich.edu 846330Sgblack@eecs.umich.edu Addr data_base; // initialized data segment base 856330Sgblack@eecs.umich.edu unsigned data_size; // initialized data + bss size in bytes 866330Sgblack@eecs.umich.edu 876330Sgblack@eecs.umich.edu Addr brk_point; // top of the data segment 886330Sgblack@eecs.umich.edu 896330Sgblack@eecs.umich.edu Addr environ_base; // environment base address 906330Sgblack@eecs.umich.edu Addr stack_base; // stack segment base (highest address) 916330Sgblack@eecs.umich.edu unsigned stack_size; // initial stack size 926330Sgblack@eecs.umich.edu Addr stack_min; // lowest address accessed on the stack 936330Sgblack@eecs.umich.edu 946330Sgblack@eecs.umich.edu 956330Sgblack@eecs.umich.edu // addr to use for next stack region (for multithreaded apps) 966330Sgblack@eecs.umich.edu Addr next_thread_stack_base; 976330Sgblack@eecs.umich.edu 986330Sgblack@eecs.umich.edu std::string prog_fname; // file name 996330Sgblack@eecs.umich.edu Addr prog_entry; // entry point (initial PC) 1006330Sgblack@eecs.umich.edu 1016330Sgblack@eecs.umich.edu Statistics::Scalar<> num_syscalls; // number of syscalls executed 1026330Sgblack@eecs.umich.edu 1036330Sgblack@eecs.umich.edu 1046330Sgblack@eecs.umich.edu protected: 1056330Sgblack@eecs.umich.edu // constructor 1066330Sgblack@eecs.umich.edu Process(const std::string &name, 1076330Sgblack@eecs.umich.edu int stdin_fd, // initial I/O descriptors 1086330Sgblack@eecs.umich.edu int stdout_fd, 1096330Sgblack@eecs.umich.edu int stderr_fd); 1106330Sgblack@eecs.umich.edu 1116330Sgblack@eecs.umich.edu 1126330Sgblack@eecs.umich.edu protected: 1136330Sgblack@eecs.umich.edu FunctionalMemory *memory; 1146330Sgblack@eecs.umich.edu 1156330Sgblack@eecs.umich.edu private: 1166330Sgblack@eecs.umich.edu // file descriptor remapping support 1176330Sgblack@eecs.umich.edu static const int MAX_FD = 100; // max legal fd value 1186330Sgblack@eecs.umich.edu int fd_map[MAX_FD+1]; 1196330Sgblack@eecs.umich.edu 1206330Sgblack@eecs.umich.edu public: 1216330Sgblack@eecs.umich.edu // static helper functions to generate file descriptors for constructor 1226330Sgblack@eecs.umich.edu static int openInputFile(const std::string &filename); 1236330Sgblack@eecs.umich.edu static int openOutputFile(const std::string &filename); 1246330Sgblack@eecs.umich.edu 1256330Sgblack@eecs.umich.edu // override of virtual SimObject method: register statistics 1266330Sgblack@eecs.umich.edu virtual void regStats(); 1276330Sgblack@eecs.umich.edu 1286330Sgblack@eecs.umich.edu // register an execution context for this process 1296330Sgblack@eecs.umich.edu void registerExecContext(ExecContext *); 1306330Sgblack@eecs.umich.edu 1316330Sgblack@eecs.umich.edu // map simulator fd sim_fd to target fd tgt_fd 1326330Sgblack@eecs.umich.edu void dup_fd(int sim_fd, int tgt_fd); 1336330Sgblack@eecs.umich.edu 1346330Sgblack@eecs.umich.edu // generate new target fd for sim_fd 1356330Sgblack@eecs.umich.edu int open_fd(int sim_fd); 1366330Sgblack@eecs.umich.edu 1376330Sgblack@eecs.umich.edu // look up simulator fd for given target fd 1386330Sgblack@eecs.umich.edu int sim_fd(int tgt_fd); 1396330Sgblack@eecs.umich.edu 1406330Sgblack@eecs.umich.edu // is this a valid instruction fetch address? 1416330Sgblack@eecs.umich.edu bool validInstAddr(Addr addr) 1426330Sgblack@eecs.umich.edu { 1436330Sgblack@eecs.umich.edu return (text_base <= addr && 1446330Sgblack@eecs.umich.edu addr < text_base + text_size && 1456330Sgblack@eecs.umich.edu !(addr & (sizeof(MachInst)-1))); 1466330Sgblack@eecs.umich.edu } 1476330Sgblack@eecs.umich.edu 1486330Sgblack@eecs.umich.edu // is this a valid address? (used to filter data fetches) 1496330Sgblack@eecs.umich.edu // note that we just assume stack size <= 16MB 1506330Sgblack@eecs.umich.edu // this may be alpha-specific 1516330Sgblack@eecs.umich.edu bool validDataAddr(Addr addr) 1526330Sgblack@eecs.umich.edu { 1536330Sgblack@eecs.umich.edu return ((data_base <= addr && addr < brk_point) || 1546330Sgblack@eecs.umich.edu ((stack_base - 16*1024*1024) <= addr && addr < stack_base) || 1556330Sgblack@eecs.umich.edu (text_base <= addr && addr < (text_base + text_size))); 1566330Sgblack@eecs.umich.edu } 1576330Sgblack@eecs.umich.edu 1586330Sgblack@eecs.umich.edu virtual void syscall(ExecContext *xc) = 0; 1596330Sgblack@eecs.umich.edu 1606330Sgblack@eecs.umich.edu virtual FunctionalMemory *getMemory() { return memory; } 1616330Sgblack@eecs.umich.edu}; 1626330Sgblack@eecs.umich.edu 1636330Sgblack@eecs.umich.edu// 1646330Sgblack@eecs.umich.edu// "Live" process with system calls redirected to host system 1656330Sgblack@eecs.umich.edu// 1666313Sgblack@eecs.umich.educlass MainMemory; 1676313Sgblack@eecs.umich.educlass LiveProcess : public Process 1686313Sgblack@eecs.umich.edu{ 1699384SAndreas.Sandberg@arm.com public: 1709384SAndreas.Sandberg@arm.com LiveProcess(const std::string &name, 1719384SAndreas.Sandberg@arm.com int stdin_fd, int stdout_fd, int stderr_fd, 1729384SAndreas.Sandberg@arm.com std::vector<std::string> &argv, 1739384SAndreas.Sandberg@arm.com std::vector<std::string> &envp); 1749384SAndreas.Sandberg@arm.com 175 virtual void syscall(ExecContext *xc); 176}; 177 178#endif // !FULL_SYSTEM 179 180#endif // __PROG_HH__ 181