system.hh revision 6221
17138Sgblack@eecs.umich.edu/* 27138Sgblack@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan 37138Sgblack@eecs.umich.edu * All rights reserved. 47138Sgblack@eecs.umich.edu * 57138Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 67138Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 77138Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 87138Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 97138Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 107138Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 117138Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 127138Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 137138Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 147138Sgblack@eecs.umich.edu * this software without specific prior written permission. 157138Sgblack@eecs.umich.edu * 167138Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177138Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187138Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197138Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207138Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 217138Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 227138Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237138Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 247138Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 257138Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 267138Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 277138Sgblack@eecs.umich.edu * 287138Sgblack@eecs.umich.edu * Authors: Steve Reinhardt 297138Sgblack@eecs.umich.edu * Lisa Hsu 307138Sgblack@eecs.umich.edu * Nathan Binkert 317138Sgblack@eecs.umich.edu */ 327138Sgblack@eecs.umich.edu 337138Sgblack@eecs.umich.edu#ifndef __SYSTEM_HH__ 347138Sgblack@eecs.umich.edu#define __SYSTEM_HH__ 357138Sgblack@eecs.umich.edu 367138Sgblack@eecs.umich.edu#include <string> 377138Sgblack@eecs.umich.edu#include <vector> 387138Sgblack@eecs.umich.edu 397138Sgblack@eecs.umich.edu#include "base/loader/symtab.hh" 407138Sgblack@eecs.umich.edu#include "base/misc.hh" 417138Sgblack@eecs.umich.edu#include "base/statistics.hh" 427138Sgblack@eecs.umich.edu#include "config/full_system.hh" 437138Sgblack@eecs.umich.edu#include "cpu/pc_event.hh" 447138Sgblack@eecs.umich.edu#include "enums/MemoryMode.hh" 457138Sgblack@eecs.umich.edu#include "mem/port.hh" 467214Sgblack@eecs.umich.edu#include "params/System.hh" 477214Sgblack@eecs.umich.edu#include "sim/sim_object.hh" 487214Sgblack@eecs.umich.edu#if FULL_SYSTEM 497214Sgblack@eecs.umich.edu#include "kern/system_events.hh" 507138Sgblack@eecs.umich.edu#include "mem/vport.hh" 517193Sgblack@eecs.umich.edu#endif 527138Sgblack@eecs.umich.edu 537138Sgblack@eecs.umich.educlass BaseCPU; 547138Sgblack@eecs.umich.educlass ThreadContext; 557138Sgblack@eecs.umich.educlass ObjectFile; 567138Sgblack@eecs.umich.educlass PhysicalMemory; 577138Sgblack@eecs.umich.edu 587138Sgblack@eecs.umich.edu#if FULL_SYSTEM 597138Sgblack@eecs.umich.educlass Platform; 607138Sgblack@eecs.umich.edu#endif 617138Sgblack@eecs.umich.educlass GDBListener; 627138Sgblack@eecs.umich.edunamespace TheISA 637138Sgblack@eecs.umich.edu{ 647138Sgblack@eecs.umich.edu class RemoteGDB; 657138Sgblack@eecs.umich.edu} 667138Sgblack@eecs.umich.edu 677138Sgblack@eecs.umich.educlass System : public SimObject 687138Sgblack@eecs.umich.edu{ 697138Sgblack@eecs.umich.edu public: 707138Sgblack@eecs.umich.edu 717138Sgblack@eecs.umich.edu static const char *MemoryModeStrings[3]; 727138Sgblack@eecs.umich.edu 737138Sgblack@eecs.umich.edu Enums::MemoryMode 747193Sgblack@eecs.umich.edu getMemoryMode() 757138Sgblack@eecs.umich.edu { 767215Sgblack@eecs.umich.edu assert(memoryMode); 777138Sgblack@eecs.umich.edu return memoryMode; 787138Sgblack@eecs.umich.edu } 797138Sgblack@eecs.umich.edu 807138Sgblack@eecs.umich.edu /** Change the memory mode of the system. This should only be called by the 817138Sgblack@eecs.umich.edu * python!! 827138Sgblack@eecs.umich.edu * @param mode Mode to change to (atomic/timing) 837138Sgblack@eecs.umich.edu */ 847138Sgblack@eecs.umich.edu void setMemoryMode(Enums::MemoryMode mode); 857138Sgblack@eecs.umich.edu 867138Sgblack@eecs.umich.edu PhysicalMemory *physmem; 877138Sgblack@eecs.umich.edu PCEventQueue pcEventQueue; 887138Sgblack@eecs.umich.edu 897138Sgblack@eecs.umich.edu std::vector<ThreadContext *> threadContexts; 907138Sgblack@eecs.umich.edu int _numContexts; 917138Sgblack@eecs.umich.edu 927138Sgblack@eecs.umich.edu ThreadContext *getThreadContext(ThreadID tid) 937138Sgblack@eecs.umich.edu { 947193Sgblack@eecs.umich.edu return threadContexts[tid]; 957138Sgblack@eecs.umich.edu } 967215Sgblack@eecs.umich.edu 977138Sgblack@eecs.umich.edu int numContexts() 987138Sgblack@eecs.umich.edu { 997138Sgblack@eecs.umich.edu assert(_numContexts == threadContexts.size()); 1007138Sgblack@eecs.umich.edu return _numContexts; 1017138Sgblack@eecs.umich.edu } 1027138Sgblack@eecs.umich.edu 1037138Sgblack@eecs.umich.edu /** Return number of running (non-halted) thread contexts in 1047138Sgblack@eecs.umich.edu * system. These threads could be Active or Suspended. */ 1057138Sgblack@eecs.umich.edu int numRunningContexts(); 1067181Sgblack@eecs.umich.edu 1077138Sgblack@eecs.umich.edu#if FULL_SYSTEM 1087193Sgblack@eecs.umich.edu Platform *platform; 1097648SAli.Saidi@ARM.com uint64_t init_param; 1107138Sgblack@eecs.umich.edu 1117138Sgblack@eecs.umich.edu /** Port to physical memory used for writing object files into ram at 1127138Sgblack@eecs.umich.edu * boot.*/ 1137138Sgblack@eecs.umich.edu FunctionalPort functionalPort; 1147138Sgblack@eecs.umich.edu VirtualPort virtPort; 1157193Sgblack@eecs.umich.edu 1167184Sgblack@eecs.umich.edu /** kernel symbol table */ 1177214Sgblack@eecs.umich.edu SymbolTable *kernelSymtab; 1187214Sgblack@eecs.umich.edu 1197138Sgblack@eecs.umich.edu /** Object pointer for the kernel code */ 1207138Sgblack@eecs.umich.edu ObjectFile *kernel; 1217138Sgblack@eecs.umich.edu 1227138Sgblack@eecs.umich.edu /** Begining of kernel code */ 1237138Sgblack@eecs.umich.edu Addr kernelStart; 1247138Sgblack@eecs.umich.edu 1257184Sgblack@eecs.umich.edu /** End of kernel code */ 1267188Sgblack@eecs.umich.edu Addr kernelEnd; 1277184Sgblack@eecs.umich.edu 1287648SAli.Saidi@ARM.com /** Entry point in the kernel to start at */ 1297188Sgblack@eecs.umich.edu Addr kernelEntry; 1307184Sgblack@eecs.umich.edu 1317184Sgblack@eecs.umich.edu#else 1327648SAli.Saidi@ARM.com 1337184Sgblack@eecs.umich.edu int page_ptr; 1347188Sgblack@eecs.umich.edu 1357188Sgblack@eecs.umich.edu protected: 1367188Sgblack@eecs.umich.edu uint64_t next_PID; 1377188Sgblack@eecs.umich.edu 1387188Sgblack@eecs.umich.edu public: 1397188Sgblack@eecs.umich.edu uint64_t allocatePID() 1407193Sgblack@eecs.umich.edu { 1417193Sgblack@eecs.umich.edu return next_PID++; 1427188Sgblack@eecs.umich.edu } 1437188Sgblack@eecs.umich.edu 1447188Sgblack@eecs.umich.edu /** Amount of physical memory that is still free */ 1457193Sgblack@eecs.umich.edu Addr freeMemSize(); 1468203SAli.Saidi@ARM.com 1478203SAli.Saidi@ARM.com /** Amount of physical memory that exists */ 1487184Sgblack@eecs.umich.edu Addr memSize(); 1497184Sgblack@eecs.umich.edu 1507184Sgblack@eecs.umich.edu 1517184Sgblack@eecs.umich.edu#endif // FULL_SYSTEM 1527184Sgblack@eecs.umich.edu 1537193Sgblack@eecs.umich.edu protected: 1547184Sgblack@eecs.umich.edu Enums::MemoryMode memoryMode; 1557214Sgblack@eecs.umich.edu 1567215Sgblack@eecs.umich.edu#if FULL_SYSTEM 1577184Sgblack@eecs.umich.edu /** 1587138Sgblack@eecs.umich.edu * Fix up an address used to match PCs for hooking simulator 1597138Sgblack@eecs.umich.edu * events on to target function executions. See comment in 1607138Sgblack@eecs.umich.edu * system.cc for details. 1617138Sgblack@eecs.umich.edu */ 1627138Sgblack@eecs.umich.edu virtual Addr fixFuncEventAddr(Addr addr) = 0; 1637184Sgblack@eecs.umich.edu 1647188Sgblack@eecs.umich.edu /** 1658203SAli.Saidi@ARM.com * Add a function-based event to the given function, to be looked 1668203SAli.Saidi@ARM.com * up in the specified symbol table. 1677648SAli.Saidi@ARM.com */ 1687188Sgblack@eecs.umich.edu template <class T> 1697184Sgblack@eecs.umich.edu T *addFuncEvent(SymbolTable *symtab, const char *lbl) 1707184Sgblack@eecs.umich.edu { 1718203SAli.Saidi@ARM.com Addr addr = 0; // initialize only to avoid compiler warning 1728203SAli.Saidi@ARM.com 1738203SAli.Saidi@ARM.com if (symtab->findAddress(lbl, addr)) { 1747184Sgblack@eecs.umich.edu T *ev = new T(&pcEventQueue, lbl, fixFuncEventAddr(addr)); 1757188Sgblack@eecs.umich.edu return ev; 1767188Sgblack@eecs.umich.edu } 1777188Sgblack@eecs.umich.edu 1787188Sgblack@eecs.umich.edu return NULL; 1797188Sgblack@eecs.umich.edu } 1807188Sgblack@eecs.umich.edu 1817193Sgblack@eecs.umich.edu /** Add a function-based event to kernel code. */ 1827193Sgblack@eecs.umich.edu template <class T> 1837188Sgblack@eecs.umich.edu T *addKernelFuncEvent(const char *lbl) 1847188Sgblack@eecs.umich.edu { 1857188Sgblack@eecs.umich.edu return addFuncEvent<T>(kernelSymtab, lbl); 1867188Sgblack@eecs.umich.edu } 1877193Sgblack@eecs.umich.edu 1887193Sgblack@eecs.umich.edu#endif 1897184Sgblack@eecs.umich.edu public: 1907184Sgblack@eecs.umich.edu std::vector<TheISA::RemoteGDB *> remoteGDB; 1917184Sgblack@eecs.umich.edu std::vector<GDBListener *> gdbListen; 1927184Sgblack@eecs.umich.edu bool breakpoint(); 1937184Sgblack@eecs.umich.edu 1947193Sgblack@eecs.umich.edu public: 1957184Sgblack@eecs.umich.edu typedef SystemParams Params; 1967214Sgblack@eecs.umich.edu 1977215Sgblack@eecs.umich.edu protected: 1987184Sgblack@eecs.umich.edu Params *_params; 1997138Sgblack@eecs.umich.edu 2007138Sgblack@eecs.umich.edu public: 2017138Sgblack@eecs.umich.edu System(Params *p); 2027138Sgblack@eecs.umich.edu ~System(); 2037138Sgblack@eecs.umich.edu 2047138Sgblack@eecs.umich.edu void startup(); 2057188Sgblack@eecs.umich.edu 2067138Sgblack@eecs.umich.edu const Params *params() const { return (const Params *)_params; } 2077138Sgblack@eecs.umich.edu 2087138Sgblack@eecs.umich.edu public: 2097138Sgblack@eecs.umich.edu 2107188Sgblack@eecs.umich.edu#if FULL_SYSTEM 2117138Sgblack@eecs.umich.edu /** 2127138Sgblack@eecs.umich.edu * Returns the addess the kernel starts at. 2137422Sgblack@eecs.umich.edu * @return address the kernel starts at 2147138Sgblack@eecs.umich.edu */ 2157188Sgblack@eecs.umich.edu Addr getKernelStart() const { return kernelStart; } 2167188Sgblack@eecs.umich.edu 2177188Sgblack@eecs.umich.edu /** 2187188Sgblack@eecs.umich.edu * Returns the addess the kernel ends at. 2197188Sgblack@eecs.umich.edu * @return address the kernel ends at 2207184Sgblack@eecs.umich.edu */ 2217193Sgblack@eecs.umich.edu Addr getKernelEnd() const { return kernelEnd; } 2227193Sgblack@eecs.umich.edu 2237188Sgblack@eecs.umich.edu /** 2247188Sgblack@eecs.umich.edu * Returns the addess the entry point to the kernel code. 2257188Sgblack@eecs.umich.edu * @return entry point of the kernel code 2267188Sgblack@eecs.umich.edu */ 2277188Sgblack@eecs.umich.edu Addr getKernelEntry() const { return kernelEntry; } 2288203SAli.Saidi@ARM.com 2297188Sgblack@eecs.umich.edu#else 2307188Sgblack@eecs.umich.edu 2317188Sgblack@eecs.umich.edu Addr new_page(); 2327188Sgblack@eecs.umich.edu 2337188Sgblack@eecs.umich.edu#endif // FULL_SYSTEM 2347188Sgblack@eecs.umich.edu 2357188Sgblack@eecs.umich.edu int registerThreadContext(ThreadContext *tc, int assigned=-1); 2368203SAli.Saidi@ARM.com void replaceThreadContext(ThreadContext *tc, int context_id); 2378203SAli.Saidi@ARM.com 2387188Sgblack@eecs.umich.edu void serialize(std::ostream &os); 2397188Sgblack@eecs.umich.edu void unserialize(Checkpoint *cp, const std::string §ion); 2407188Sgblack@eecs.umich.edu 2417400SAli.Saidi@ARM.com public: 2427188Sgblack@eecs.umich.edu //////////////////////////////////////////// 2437400SAli.Saidi@ARM.com // 2447188Sgblack@eecs.umich.edu // STATIC GLOBAL SYSTEM LIST 2457188Sgblack@eecs.umich.edu // 2467797Sgblack@eecs.umich.edu //////////////////////////////////////////// 2477797Sgblack@eecs.umich.edu 2488205SAli.Saidi@ARM.com static std::vector<System *> systemList; 2497858SMatt.Horsnell@arm.com static int numSystemsRunning; 2507188Sgblack@eecs.umich.edu 2517188Sgblack@eecs.umich.edu static void printSystems(); 2527648SAli.Saidi@ARM.com 2537648SAli.Saidi@ARM.com 2547188Sgblack@eecs.umich.edu}; 2557648SAli.Saidi@ARM.com 2567648SAli.Saidi@ARM.com#endif // __SYSTEM_HH__ 2577188Sgblack@eecs.umich.edu