system.hh revision 3565
15086Sgblack@eecs.umich.edu/* 25086Sgblack@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan 35086Sgblack@eecs.umich.edu * All rights reserved. 45086Sgblack@eecs.umich.edu * 55086Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 65086Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 75086Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 85086Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 95086Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 105086Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 115086Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 125086Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 135086Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 145086Sgblack@eecs.umich.edu * this software without specific prior written permission. 155086Sgblack@eecs.umich.edu * 165086Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175086Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185086Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195086Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205086Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215086Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225086Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235086Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245086Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255086Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265086Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275086Sgblack@eecs.umich.edu * 285086Sgblack@eecs.umich.edu * Authors: Steve Reinhardt 295086Sgblack@eecs.umich.edu * Lisa Hsu 305086Sgblack@eecs.umich.edu * Nathan Binkert 315086Sgblack@eecs.umich.edu */ 325086Sgblack@eecs.umich.edu 335086Sgblack@eecs.umich.edu#ifndef __SYSTEM_HH__ 345086Sgblack@eecs.umich.edu#define __SYSTEM_HH__ 355086Sgblack@eecs.umich.edu 365086Sgblack@eecs.umich.edu#include <string> 375086Sgblack@eecs.umich.edu#include <vector> 385086Sgblack@eecs.umich.edu 395086Sgblack@eecs.umich.edu#include "base/loader/symtab.hh" 405086Sgblack@eecs.umich.edu#include "base/misc.hh" 415086Sgblack@eecs.umich.edu#include "base/statistics.hh" 425086Sgblack@eecs.umich.edu#include "config/full_system.hh" 435086Sgblack@eecs.umich.edu#include "cpu/pc_event.hh" 445086Sgblack@eecs.umich.edu#include "mem/port.hh" 455086Sgblack@eecs.umich.edu#include "sim/sim_object.hh" 465086Sgblack@eecs.umich.edu#if FULL_SYSTEM 475086Sgblack@eecs.umich.edu#include "kern/system_events.hh" 485086Sgblack@eecs.umich.edu#include "mem/vport.hh" 495086Sgblack@eecs.umich.edu#endif 505086Sgblack@eecs.umich.edu 515086Sgblack@eecs.umich.educlass BaseCPU; 525086Sgblack@eecs.umich.educlass ThreadContext; 535086Sgblack@eecs.umich.educlass ObjectFile; 545086Sgblack@eecs.umich.educlass PhysicalMemory; 555086Sgblack@eecs.umich.edu 565086Sgblack@eecs.umich.edu#if FULL_SYSTEM 575086Sgblack@eecs.umich.educlass Platform; 585135Sgblack@eecs.umich.educlass GDBListener; 595135Sgblack@eecs.umich.edunamespace TheISA 605135Sgblack@eecs.umich.edu{ 615086Sgblack@eecs.umich.edu class RemoteGDB; 625135Sgblack@eecs.umich.edu} 635086Sgblack@eecs.umich.edu#endif 645086Sgblack@eecs.umich.edu 655086Sgblack@eecs.umich.educlass System : public SimObject 665086Sgblack@eecs.umich.edu{ 675086Sgblack@eecs.umich.edu public: 685086Sgblack@eecs.umich.edu 695086Sgblack@eecs.umich.edu static const char *MemoryModeStrings[3]; 705086Sgblack@eecs.umich.edu 715086Sgblack@eecs.umich.edu SimObject::MemoryMode getMemoryMode() { assert(memoryMode); return memoryMode; } 725086Sgblack@eecs.umich.edu 735086Sgblack@eecs.umich.edu /** Change the memory mode of the system. This should only be called by the 745135Sgblack@eecs.umich.edu * python!! 755135Sgblack@eecs.umich.edu * @param mode Mode to change to (atomic/timing) 765135Sgblack@eecs.umich.edu */ 775135Sgblack@eecs.umich.edu void setMemoryMode(SimObject::MemoryMode mode); 785135Sgblack@eecs.umich.edu 795135Sgblack@eecs.umich.edu PhysicalMemory *physmem; 805135Sgblack@eecs.umich.edu PCEventQueue pcEventQueue; 815135Sgblack@eecs.umich.edu 825135Sgblack@eecs.umich.edu std::vector<ThreadContext *> threadContexts; 835135Sgblack@eecs.umich.edu int numcpus; 845135Sgblack@eecs.umich.edu 855135Sgblack@eecs.umich.edu int getNumCPUs() 865135Sgblack@eecs.umich.edu { 875135Sgblack@eecs.umich.edu if (numcpus != threadContexts.size()) 885135Sgblack@eecs.umich.edu panic("cpu array not fully populated!"); 895135Sgblack@eecs.umich.edu 905135Sgblack@eecs.umich.edu return numcpus; 915135Sgblack@eecs.umich.edu } 925135Sgblack@eecs.umich.edu 935135Sgblack@eecs.umich.edu#if FULL_SYSTEM 945135Sgblack@eecs.umich.edu Platform *platform; 955135Sgblack@eecs.umich.edu uint64_t init_param; 965135Sgblack@eecs.umich.edu 975135Sgblack@eecs.umich.edu /** Port to physical memory used for writing object files into ram at 985135Sgblack@eecs.umich.edu * boot.*/ 995135Sgblack@eecs.umich.edu FunctionalPort functionalPort; 1005135Sgblack@eecs.umich.edu VirtualPort virtPort; 1015135Sgblack@eecs.umich.edu 1025135Sgblack@eecs.umich.edu /** kernel symbol table */ 1035135Sgblack@eecs.umich.edu SymbolTable *kernelSymtab; 1045135Sgblack@eecs.umich.edu 1055135Sgblack@eecs.umich.edu /** Object pointer for the kernel code */ 1065135Sgblack@eecs.umich.edu ObjectFile *kernel; 1075135Sgblack@eecs.umich.edu 1085135Sgblack@eecs.umich.edu /** Begining of kernel code */ 1095135Sgblack@eecs.umich.edu Addr kernelStart; 1105141Sgblack@eecs.umich.edu 1115141Sgblack@eecs.umich.edu /** End of kernel code */ 1125141Sgblack@eecs.umich.edu Addr kernelEnd; 1135141Sgblack@eecs.umich.edu 1145141Sgblack@eecs.umich.edu /** Entry point in the kernel to start at */ 1155141Sgblack@eecs.umich.edu Addr kernelEntry; 1165141Sgblack@eecs.umich.edu 1175135Sgblack@eecs.umich.edu#else 1185135Sgblack@eecs.umich.edu 1195135Sgblack@eecs.umich.edu int page_ptr; 1205135Sgblack@eecs.umich.edu 1215141Sgblack@eecs.umich.edu 1225135Sgblack@eecs.umich.edu#endif // FULL_SYSTEM 1235135Sgblack@eecs.umich.edu 1245141Sgblack@eecs.umich.edu protected: 1255141Sgblack@eecs.umich.edu 1265141Sgblack@eecs.umich.edu SimObject::MemoryMode memoryMode; 1275141Sgblack@eecs.umich.edu 1285141Sgblack@eecs.umich.edu#if FULL_SYSTEM 1295141Sgblack@eecs.umich.edu /** 1305141Sgblack@eecs.umich.edu * Fix up an address used to match PCs for hooking simulator 1315135Sgblack@eecs.umich.edu * events on to target function executions. See comment in 1325135Sgblack@eecs.umich.edu * system.cc for details. 1335135Sgblack@eecs.umich.edu */ 1345135Sgblack@eecs.umich.edu virtual Addr fixFuncEventAddr(Addr addr) = 0; 1355141Sgblack@eecs.umich.edu 1365135Sgblack@eecs.umich.edu /** 1375135Sgblack@eecs.umich.edu * Add a function-based event to the given function, to be looked 1385135Sgblack@eecs.umich.edu * up in the specified symbol table. 1395135Sgblack@eecs.umich.edu */ 1405135Sgblack@eecs.umich.edu template <class T> 1415135Sgblack@eecs.umich.edu T *addFuncEvent(SymbolTable *symtab, const char *lbl) 1425135Sgblack@eecs.umich.edu { 1435135Sgblack@eecs.umich.edu Addr addr = 0; // initialize only to avoid compiler warning 1445135Sgblack@eecs.umich.edu 1455135Sgblack@eecs.umich.edu if (symtab->findAddress(lbl, addr)) { 1465135Sgblack@eecs.umich.edu T *ev = new T(&pcEventQueue, lbl, fixFuncEventAddr(addr)); 1475135Sgblack@eecs.umich.edu return ev; 1485135Sgblack@eecs.umich.edu } 1495135Sgblack@eecs.umich.edu 1505135Sgblack@eecs.umich.edu return NULL; 1515135Sgblack@eecs.umich.edu } 1525135Sgblack@eecs.umich.edu 1535135Sgblack@eecs.umich.edu /** Add a function-based event to kernel code. */ 1545135Sgblack@eecs.umich.edu template <class T> 1555135Sgblack@eecs.umich.edu T *addKernelFuncEvent(const char *lbl) 1565135Sgblack@eecs.umich.edu { 1575135Sgblack@eecs.umich.edu return addFuncEvent<T>(kernelSymtab, lbl); 1585135Sgblack@eecs.umich.edu } 1595135Sgblack@eecs.umich.edu 1605135Sgblack@eecs.umich.edu#endif 1615135Sgblack@eecs.umich.edu public: 1625135Sgblack@eecs.umich.edu#if FULL_SYSTEM 1635135Sgblack@eecs.umich.edu std::vector<TheISA::RemoteGDB *> remoteGDB; 1645141Sgblack@eecs.umich.edu std::vector<GDBListener *> gdbListen; 1655141Sgblack@eecs.umich.edu virtual bool breakpoint() = 0; 1665141Sgblack@eecs.umich.edu#endif // FULL_SYSTEM 1675141Sgblack@eecs.umich.edu 1685141Sgblack@eecs.umich.edu public: 1695141Sgblack@eecs.umich.edu struct Params 1705141Sgblack@eecs.umich.edu { 1715141Sgblack@eecs.umich.edu std::string name; 1725141Sgblack@eecs.umich.edu PhysicalMemory *physmem; 1735182Sgblack@eecs.umich.edu SimObject::MemoryMode mem_mode; 1745141Sgblack@eecs.umich.edu 1755141Sgblack@eecs.umich.edu#if FULL_SYSTEM 1765141Sgblack@eecs.umich.edu Tick boot_cpu_frequency; 1775141Sgblack@eecs.umich.edu std::string boot_osflags; 1785141Sgblack@eecs.umich.edu uint64_t init_param; 1795141Sgblack@eecs.umich.edu 1805135Sgblack@eecs.umich.edu std::string kernel_path; 1815141Sgblack@eecs.umich.edu std::string readfile; 1825141Sgblack@eecs.umich.edu std::string symbolfile; 1835141Sgblack@eecs.umich.edu#endif 1845141Sgblack@eecs.umich.edu }; 1855141Sgblack@eecs.umich.edu 1865141Sgblack@eecs.umich.edu protected: 1875141Sgblack@eecs.umich.edu Params *_params; 1885141Sgblack@eecs.umich.edu 1895141Sgblack@eecs.umich.edu public: 1905141Sgblack@eecs.umich.edu System(Params *p); 1915141Sgblack@eecs.umich.edu ~System(); 1925141Sgblack@eecs.umich.edu 1935135Sgblack@eecs.umich.edu void startup(); 1945135Sgblack@eecs.umich.edu 1955135Sgblack@eecs.umich.edu const Params *params() const { return (const Params *)_params; } 1965135Sgblack@eecs.umich.edu 1975135Sgblack@eecs.umich.edu public: 1985135Sgblack@eecs.umich.edu 1995135Sgblack@eecs.umich.edu#if FULL_SYSTEM 2005135Sgblack@eecs.umich.edu /** 2015135Sgblack@eecs.umich.edu * Returns the addess the kernel starts at. 2025141Sgblack@eecs.umich.edu * @return address the kernel starts at 2035141Sgblack@eecs.umich.edu */ 2045135Sgblack@eecs.umich.edu Addr getKernelStart() const { return kernelStart; } 2055141Sgblack@eecs.umich.edu 2065141Sgblack@eecs.umich.edu /** 2075141Sgblack@eecs.umich.edu * Returns the addess the kernel ends at. 2085141Sgblack@eecs.umich.edu * @return address the kernel ends at 2095135Sgblack@eecs.umich.edu */ 2105141Sgblack@eecs.umich.edu Addr getKernelEnd() const { return kernelEnd; } 2115141Sgblack@eecs.umich.edu 2125141Sgblack@eecs.umich.edu /** 2135141Sgblack@eecs.umich.edu * Returns the addess the entry point to the kernel code. 2145141Sgblack@eecs.umich.edu * @return entry point of the kernel code 2155141Sgblack@eecs.umich.edu */ 2165141Sgblack@eecs.umich.edu Addr getKernelEntry() const { return kernelEntry; } 2175141Sgblack@eecs.umich.edu 2185141Sgblack@eecs.umich.edu#else 2195141Sgblack@eecs.umich.edu 2205141Sgblack@eecs.umich.edu Addr new_page(); 2215141Sgblack@eecs.umich.edu 2225141Sgblack@eecs.umich.edu#endif // FULL_SYSTEM 2235141Sgblack@eecs.umich.edu 2245141Sgblack@eecs.umich.edu int registerThreadContext(ThreadContext *tc, int tcIndex); 2255141Sgblack@eecs.umich.edu void replaceThreadContext(ThreadContext *tc, int tcIndex); 2265141Sgblack@eecs.umich.edu 2275141Sgblack@eecs.umich.edu void serialize(std::ostream &os); 2285141Sgblack@eecs.umich.edu void unserialize(Checkpoint *cp, const std::string §ion); 2295141Sgblack@eecs.umich.edu 2305141Sgblack@eecs.umich.edu public: 2315141Sgblack@eecs.umich.edu //////////////////////////////////////////// 2325141Sgblack@eecs.umich.edu // 2335141Sgblack@eecs.umich.edu // STATIC GLOBAL SYSTEM LIST 2345141Sgblack@eecs.umich.edu // 2355141Sgblack@eecs.umich.edu //////////////////////////////////////////// 2365141Sgblack@eecs.umich.edu 2375141Sgblack@eecs.umich.edu static std::vector<System *> systemList; 2385141Sgblack@eecs.umich.edu static int numSystemsRunning; 2395141Sgblack@eecs.umich.edu 2405135Sgblack@eecs.umich.edu static void printSystems(); 2415135Sgblack@eecs.umich.edu 2425135Sgblack@eecs.umich.edu 2435135Sgblack@eecs.umich.edu}; 2445135Sgblack@eecs.umich.edu 2455135Sgblack@eecs.umich.edu#endif // __SYSTEM_HH__ 2465141Sgblack@eecs.umich.edu