system.hh revision 2158
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 * 57087Snate@binkert.org * Redistribution and use in source and binary forms, with or without 67087Snate@binkert.org * modification, are permitted provided that the following conditions are 77087Snate@binkert.org * met: redistributions of source code must retain the above copyright 87087Snate@binkert.org * notice, this list of conditions and the following disclaimer; 97087Snate@binkert.org * redistributions in binary form must reproduce the above copyright 107087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 117087Snate@binkert.org * documentation and/or other materials provided with the distribution; 127087Snate@binkert.org * 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 147087Snate@binkert.org * this software without specific prior written permission. 157087Snate@binkert.org * 167087Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177087Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187087Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197087Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207087Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 217087Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225086Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237087Snate@binkert.org * 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 295086Sgblack@eecs.umich.edu#ifndef __SYSTEM_HH__ 305086Sgblack@eecs.umich.edu#define __SYSTEM_HH__ 315086Sgblack@eecs.umich.edu 325086Sgblack@eecs.umich.edu#include <string> 335086Sgblack@eecs.umich.edu#include <vector> 345086Sgblack@eecs.umich.edu 355086Sgblack@eecs.umich.edu#include "base/statistics.hh" 365086Sgblack@eecs.umich.edu#include "base/loader/symtab.hh" 375086Sgblack@eecs.umich.edu#include "cpu/pc_event.hh" 385086Sgblack@eecs.umich.edu#include "kern/system_events.hh" 395086Sgblack@eecs.umich.edu#include "sim/sim_object.hh" 405647Sgblack@eecs.umich.edu 415647Sgblack@eecs.umich.educlass BaseCPU; 425647Sgblack@eecs.umich.educlass ExecContext; 435647Sgblack@eecs.umich.educlass GDBListener; 445647Sgblack@eecs.umich.educlass MemoryController; 457629Sgblack@eecs.umich.educlass ObjectFile; 467629Sgblack@eecs.umich.educlass PhysicalMemory; 477629Sgblack@eecs.umich.educlass Platform; 485086Sgblack@eecs.umich.educlass RemoteGDB; 495135Sgblack@eecs.umich.edunamespace Kernel { class Binning; } 505647Sgblack@eecs.umich.edu 515234Sgblack@eecs.umich.educlass System : public SimObject 525086Sgblack@eecs.umich.edu{ 535086Sgblack@eecs.umich.edu public: 545086Sgblack@eecs.umich.edu MemoryController *memctrl; 557707Sgblack@eecs.umich.edu PhysicalMemory *physmem; 567707Sgblack@eecs.umich.edu Platform *platform; 577707Sgblack@eecs.umich.edu PCEventQueue pcEventQueue; 585086Sgblack@eecs.umich.edu uint64_t init_param; 595086Sgblack@eecs.umich.edu 605086Sgblack@eecs.umich.edu std::vector<ExecContext *> execContexts; 615086Sgblack@eecs.umich.edu int numcpus; 625086Sgblack@eecs.umich.edu 635086Sgblack@eecs.umich.edu int getNumCPUs() 645086Sgblack@eecs.umich.edu { 655135Sgblack@eecs.umich.edu if (numcpus != execContexts.size()) 665135Sgblack@eecs.umich.edu panic("cpu array not fully populated!"); 675135Sgblack@eecs.umich.edu 685135Sgblack@eecs.umich.edu return numcpus; 696048Sgblack@eecs.umich.edu } 706048Sgblack@eecs.umich.edu 716048Sgblack@eecs.umich.edu /** kernel symbol table */ 726048Sgblack@eecs.umich.edu SymbolTable *kernelSymtab; 736048Sgblack@eecs.umich.edu 746048Sgblack@eecs.umich.edu /** Object pointer for the kernel code */ 757720Sgblack@eecs.umich.edu ObjectFile *kernel; 767720Sgblack@eecs.umich.edu 777720Sgblack@eecs.umich.edu /** Begining of kernel code */ 787720Sgblack@eecs.umich.edu Addr kernelStart; 795135Sgblack@eecs.umich.edu 805135Sgblack@eecs.umich.edu /** End of kernel code */ 815135Sgblack@eecs.umich.edu Addr kernelEnd; 825135Sgblack@eecs.umich.edu 835135Sgblack@eecs.umich.edu /** Entry point in the kernel to start at */ 845135Sgblack@eecs.umich.edu Addr kernelEntry; 855135Sgblack@eecs.umich.edu 865135Sgblack@eecs.umich.edu Kernel::Binning *kernelBinning; 875135Sgblack@eecs.umich.edu 885135Sgblack@eecs.umich.edu protected: 895135Sgblack@eecs.umich.edu 905135Sgblack@eecs.umich.edu /** 915135Sgblack@eecs.umich.edu * Fix up an address used to match PCs for hooking simulator 925135Sgblack@eecs.umich.edu * events on to target function executions. See comment in 935135Sgblack@eecs.umich.edu * system.cc for details. 945135Sgblack@eecs.umich.edu */ 955135Sgblack@eecs.umich.edu virtual Addr fixFuncEventAddr(Addr addr) = 0; 965264Sgblack@eecs.umich.edu 975135Sgblack@eecs.umich.edu /** 985135Sgblack@eecs.umich.edu * Add a function-based event to the given function, to be looked 995135Sgblack@eecs.umich.edu * up in the specified symbol table. 1005135Sgblack@eecs.umich.edu */ 1015141Sgblack@eecs.umich.edu template <class T> 1025141Sgblack@eecs.umich.edu T *System::addFuncEvent(SymbolTable *symtab, const char *lbl) 1035141Sgblack@eecs.umich.edu { 1045141Sgblack@eecs.umich.edu Addr addr = 0; // initialize only to avoid compiler warning 1055141Sgblack@eecs.umich.edu 1065141Sgblack@eecs.umich.edu if (symtab->findAddress(lbl, addr)) { 1075141Sgblack@eecs.umich.edu T *ev = new T(&pcEventQueue, lbl, fixFuncEventAddr(addr)); 1085141Sgblack@eecs.umich.edu return ev; 1095141Sgblack@eecs.umich.edu } 1105182Sgblack@eecs.umich.edu 1115141Sgblack@eecs.umich.edu return NULL; 1125141Sgblack@eecs.umich.edu } 1135141Sgblack@eecs.umich.edu 1145141Sgblack@eecs.umich.edu /** Add a function-based event to kernel code. */ 1155141Sgblack@eecs.umich.edu template <class T> 1165141Sgblack@eecs.umich.edu T *System::addKernelFuncEvent(const char *lbl) 1175135Sgblack@eecs.umich.edu { 1185141Sgblack@eecs.umich.edu return addFuncEvent<T>(kernelSymtab, lbl); 1195141Sgblack@eecs.umich.edu } 1205141Sgblack@eecs.umich.edu 1215141Sgblack@eecs.umich.edu public: 1225141Sgblack@eecs.umich.edu std::vector<RemoteGDB *> remoteGDB; 1235141Sgblack@eecs.umich.edu std::vector<GDBListener *> gdbListen; 1245141Sgblack@eecs.umich.edu virtual bool breakpoint() = 0; 1255141Sgblack@eecs.umich.edu 1265141Sgblack@eecs.umich.edu public: 1275141Sgblack@eecs.umich.edu struct Params 1285141Sgblack@eecs.umich.edu { 1295141Sgblack@eecs.umich.edu std::string name; 1305135Sgblack@eecs.umich.edu Tick boot_cpu_frequency; 1315141Sgblack@eecs.umich.edu MemoryController *memctrl; 1325141Sgblack@eecs.umich.edu PhysicalMemory *physmem; 1335135Sgblack@eecs.umich.edu uint64_t init_param; 1345141Sgblack@eecs.umich.edu bool bin; 1355141Sgblack@eecs.umich.edu std::vector<std::string> binned_fns; 1365141Sgblack@eecs.umich.edu bool bin_int; 1375141Sgblack@eecs.umich.edu 1385135Sgblack@eecs.umich.edu std::string kernel_path; 1395141Sgblack@eecs.umich.edu std::string readfile; 1405141Sgblack@eecs.umich.edu }; 1415141Sgblack@eecs.umich.edu 1425141Sgblack@eecs.umich.edu protected: 1435141Sgblack@eecs.umich.edu Params *_params; 1445141Sgblack@eecs.umich.edu 1455141Sgblack@eecs.umich.edu public: 1465141Sgblack@eecs.umich.edu System(Params *p); 1475141Sgblack@eecs.umich.edu ~System(); 1485141Sgblack@eecs.umich.edu 1495141Sgblack@eecs.umich.edu void startup(); 1505141Sgblack@eecs.umich.edu 1515264Sgblack@eecs.umich.edu const Params *params() const { return (const Params *)_params; } 1525141Sgblack@eecs.umich.edu 1535141Sgblack@eecs.umich.edu public: 1545141Sgblack@eecs.umich.edu /** 1555141Sgblack@eecs.umich.edu * Returns the addess the kernel starts at. 1565141Sgblack@eecs.umich.edu * @return address the kernel starts at 1575141Sgblack@eecs.umich.edu */ 1585141Sgblack@eecs.umich.edu Addr getKernelStart() const { return kernelStart; } 1595141Sgblack@eecs.umich.edu 1605141Sgblack@eecs.umich.edu /** 1615141Sgblack@eecs.umich.edu * Returns the addess the kernel ends at. 1625141Sgblack@eecs.umich.edu * @return address the kernel ends at 1635141Sgblack@eecs.umich.edu */ 1645141Sgblack@eecs.umich.edu Addr getKernelEnd() const { return kernelEnd; } 1655141Sgblack@eecs.umich.edu 1665141Sgblack@eecs.umich.edu /** 1675141Sgblack@eecs.umich.edu * Returns the addess the entry point to the kernel code. 1685141Sgblack@eecs.umich.edu * @return entry point of the kernel code 1695135Sgblack@eecs.umich.edu */ 1705135Sgblack@eecs.umich.edu Addr getKernelEntry() const { return kernelEntry; } 1715135Sgblack@eecs.umich.edu 1725360Sgblack@eecs.umich.edu int registerExecContext(ExecContext *xc, int xcIndex); 1735360Sgblack@eecs.umich.edu void replaceExecContext(ExecContext *xc, int xcIndex); 1745360Sgblack@eecs.umich.edu 1755360Sgblack@eecs.umich.edu void regStats(); 1765360Sgblack@eecs.umich.edu void serialize(std::ostream &os); 1775360Sgblack@eecs.umich.edu void unserialize(Checkpoint *cp, const std::string §ion); 1785647Sgblack@eecs.umich.edu 1795647Sgblack@eecs.umich.edu public: 1805647Sgblack@eecs.umich.edu //////////////////////////////////////////// 1815360Sgblack@eecs.umich.edu // 1825647Sgblack@eecs.umich.edu // STATIC GLOBAL SYSTEM LIST 1835647Sgblack@eecs.umich.edu // 1845647Sgblack@eecs.umich.edu //////////////////////////////////////////// 1855648Sgblack@eecs.umich.edu 1865648Sgblack@eecs.umich.edu static std::vector<System *> systemList; 1875360Sgblack@eecs.umich.edu static int numSystemsRunning; 1885141Sgblack@eecs.umich.edu 1895141Sgblack@eecs.umich.edu static void printSystems(); 1905141Sgblack@eecs.umich.edu 1915141Sgblack@eecs.umich.edu 1925141Sgblack@eecs.umich.edu}; 1935141Sgblack@eecs.umich.edu 1945135Sgblack@eecs.umich.edu#endif // __SYSTEM_HH__ 1955135Sgblack@eecs.umich.edu