system.hh revision 2520
12810Srdreslin@umich.edu/* 212500Snikos.nikoleris@arm.com * Copyright (c) 2002-2005 The Regents of The University of Michigan 311051Sandreas.hansson@arm.com * All rights reserved. 411051Sandreas.hansson@arm.com * 511051Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 611051Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 711051Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 811051Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 911051Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 1011051Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 1111051Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 1211051Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 1311051Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 1411051Sandreas.hansson@arm.com * this software without specific prior written permission. 1511051Sandreas.hansson@arm.com * 162810Srdreslin@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172810Srdreslin@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182810Srdreslin@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192810Srdreslin@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202810Srdreslin@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212810Srdreslin@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222810Srdreslin@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232810Srdreslin@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242810Srdreslin@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252810Srdreslin@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262810Srdreslin@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272810Srdreslin@umich.edu */ 282810Srdreslin@umich.edu 292810Srdreslin@umich.edu#ifndef __SYSTEM_HH__ 302810Srdreslin@umich.edu#define __SYSTEM_HH__ 312810Srdreslin@umich.edu 322810Srdreslin@umich.edu#include <string> 332810Srdreslin@umich.edu#include <vector> 342810Srdreslin@umich.edu 352810Srdreslin@umich.edu#include "base/loader/symtab.hh" 362810Srdreslin@umich.edu#include "base/misc.hh" 372810Srdreslin@umich.edu#include "base/statistics.hh" 382810Srdreslin@umich.edu#include "cpu/pc_event.hh" 392810Srdreslin@umich.edu#include "mem/port.hh" 402810Srdreslin@umich.edu#include "sim/sim_object.hh" 412810Srdreslin@umich.edu#if FULL_SYSTEM 4211051Sandreas.hansson@arm.com#include "kern/system_events.hh" 4311051Sandreas.hansson@arm.com#endif 442810Srdreslin@umich.edu 4511051Sandreas.hansson@arm.comclass BaseCPU; 4611051Sandreas.hansson@arm.comclass ExecContext; 4712349Snikos.nikoleris@arm.comclass MemoryController; 482810Srdreslin@umich.educlass ObjectFile; 492810Srdreslin@umich.educlass MemObject; 502810Srdreslin@umich.edu 512810Srdreslin@umich.edu#if FULL_SYSTEM 5211051Sandreas.hansson@arm.comclass Platform; 532810Srdreslin@umich.educlass GDBListener; 542810Srdreslin@umich.educlass RemoteGDB; 5511051Sandreas.hansson@arm.comnamespace Kernel { class Binning; } 562810Srdreslin@umich.edu#endif 5712724Snikos.nikoleris@arm.com 5812724Snikos.nikoleris@arm.comclass System : public SimObject 5912724Snikos.nikoleris@arm.com{ 6012334Sgabeblack@google.com public: 6112724Snikos.nikoleris@arm.com MemObject *physmem; 6211051Sandreas.hansson@arm.com PCEventQueue pcEventQueue; 6311051Sandreas.hansson@arm.com 6411051Sandreas.hansson@arm.com std::vector<ExecContext *> execContexts; 6511288Ssteve.reinhardt@amd.com int numcpus; 6612724Snikos.nikoleris@arm.com 6711051Sandreas.hansson@arm.com int getNumCPUs() 6811051Sandreas.hansson@arm.com { 6912724Snikos.nikoleris@arm.com if (numcpus != execContexts.size()) 7012724Snikos.nikoleris@arm.com panic("cpu array not fully populated!"); 7112724Snikos.nikoleris@arm.com 7212724Snikos.nikoleris@arm.com return numcpus; 7311051Sandreas.hansson@arm.com } 7411053Sandreas.hansson@arm.com 7511053Sandreas.hansson@arm.com#if FULL_SYSTEM 7612724Snikos.nikoleris@arm.com MemoryController *memctrl; 7711051Sandreas.hansson@arm.com Platform *platform; 7811051Sandreas.hansson@arm.com uint64_t init_param; 7911051Sandreas.hansson@arm.com 8011051Sandreas.hansson@arm.com /** Port to physical memory used for writing object files into ram at 8111601Sandreas.hansson@arm.com * boot.*/ 8211601Sandreas.hansson@arm.com FunctionalPort functionalPort; 8311051Sandreas.hansson@arm.com 8412724Snikos.nikoleris@arm.com /** kernel symbol table */ 8511051Sandreas.hansson@arm.com SymbolTable *kernelSymtab; 8612724Snikos.nikoleris@arm.com 8711600Sandreas.hansson@arm.com /** Object pointer for the kernel code */ 8811600Sandreas.hansson@arm.com ObjectFile *kernel; 8911051Sandreas.hansson@arm.com 9011051Sandreas.hansson@arm.com /** Begining of kernel code */ 9111051Sandreas.hansson@arm.com Addr kernelStart; 9211284Sandreas.hansson@arm.com 9311051Sandreas.hansson@arm.com /** End of kernel code */ 9411051Sandreas.hansson@arm.com Addr kernelEnd; 9511051Sandreas.hansson@arm.com 9611602Sandreas.hansson@arm.com /** Entry point in the kernel to start at */ 9711051Sandreas.hansson@arm.com Addr kernelEntry; 9811051Sandreas.hansson@arm.com 9911284Sandreas.hansson@arm.com Kernel::Binning *kernelBinning; 10011051Sandreas.hansson@arm.com 10111284Sandreas.hansson@arm.com#else 10211602Sandreas.hansson@arm.com 10311051Sandreas.hansson@arm.com int page_ptr; 10411051Sandreas.hansson@arm.com 10511284Sandreas.hansson@arm.com 10611051Sandreas.hansson@arm.com#endif // FULL_SYSTEM 10711284Sandreas.hansson@arm.com 10811284Sandreas.hansson@arm.com protected: 10911284Sandreas.hansson@arm.com 11011051Sandreas.hansson@arm.com#if FULL_SYSTEM 11111051Sandreas.hansson@arm.com /** 11211051Sandreas.hansson@arm.com * Fix up an address used to match PCs for hooking simulator 11311284Sandreas.hansson@arm.com * events on to target function executions. See comment in 11411284Sandreas.hansson@arm.com * system.cc for details. 11511284Sandreas.hansson@arm.com */ 11611284Sandreas.hansson@arm.com virtual Addr fixFuncEventAddr(Addr addr) = 0; 11711051Sandreas.hansson@arm.com 11811051Sandreas.hansson@arm.com /** 11911051Sandreas.hansson@arm.com * Add a function-based event to the given function, to be looked 12011284Sandreas.hansson@arm.com * up in the specified symbol table. 12111284Sandreas.hansson@arm.com */ 12211284Sandreas.hansson@arm.com template <class T> 12311197Sandreas.hansson@arm.com T *System::addFuncEvent(SymbolTable *symtab, const char *lbl) 12411601Sandreas.hansson@arm.com { 12511601Sandreas.hansson@arm.com Addr addr = 0; // initialize only to avoid compiler warning 12611601Sandreas.hansson@arm.com 12711601Sandreas.hansson@arm.com if (symtab->findAddress(lbl, addr)) { 12811601Sandreas.hansson@arm.com T *ev = new T(&pcEventQueue, lbl, fixFuncEventAddr(addr)); 12911601Sandreas.hansson@arm.com return ev; 13011601Sandreas.hansson@arm.com } 13111601Sandreas.hansson@arm.com 13211197Sandreas.hansson@arm.com return NULL; 13311601Sandreas.hansson@arm.com } 13411601Sandreas.hansson@arm.com 13511601Sandreas.hansson@arm.com /** Add a function-based event to kernel code. */ 13611601Sandreas.hansson@arm.com template <class T> 13711601Sandreas.hansson@arm.com T *System::addKernelFuncEvent(const char *lbl) 13811601Sandreas.hansson@arm.com { 13911601Sandreas.hansson@arm.com return addFuncEvent<T>(kernelSymtab, lbl); 14011051Sandreas.hansson@arm.com } 14111051Sandreas.hansson@arm.com 14211051Sandreas.hansson@arm.com#endif 14311051Sandreas.hansson@arm.com public: 14411051Sandreas.hansson@arm.com#if FULL_SYSTEM 14511284Sandreas.hansson@arm.com std::vector<RemoteGDB *> remoteGDB; 14611284Sandreas.hansson@arm.com std::vector<GDBListener *> gdbListen; 14711051Sandreas.hansson@arm.com virtual bool breakpoint() = 0; 14811051Sandreas.hansson@arm.com#endif // FULL_SYSTEM 14911051Sandreas.hansson@arm.com 15011051Sandreas.hansson@arm.com public: 15111284Sandreas.hansson@arm.com struct Params 15211051Sandreas.hansson@arm.com { 15311051Sandreas.hansson@arm.com std::string name; 15411051Sandreas.hansson@arm.com MemObject *physmem; 15511051Sandreas.hansson@arm.com 15611051Sandreas.hansson@arm.com#if FULL_SYSTEM 15711051Sandreas.hansson@arm.com Tick boot_cpu_frequency; 15811051Sandreas.hansson@arm.com MemoryController *memctrl; 15911051Sandreas.hansson@arm.com uint64_t init_param; 16011051Sandreas.hansson@arm.com bool bin; 16111051Sandreas.hansson@arm.com std::vector<std::string> binned_fns; 16211051Sandreas.hansson@arm.com bool bin_int; 16311051Sandreas.hansson@arm.com 16411051Sandreas.hansson@arm.com std::string kernel_path; 16511051Sandreas.hansson@arm.com std::string readfile; 16611051Sandreas.hansson@arm.com#endif 16711051Sandreas.hansson@arm.com }; 16811051Sandreas.hansson@arm.com 16912724Snikos.nikoleris@arm.com protected: 17012724Snikos.nikoleris@arm.com Params *_params; 17112724Snikos.nikoleris@arm.com 17212724Snikos.nikoleris@arm.com public: 17312724Snikos.nikoleris@arm.com System(Params *p); 17412724Snikos.nikoleris@arm.com ~System(); 17512724Snikos.nikoleris@arm.com 17611051Sandreas.hansson@arm.com void startup(); 17711051Sandreas.hansson@arm.com 17811051Sandreas.hansson@arm.com const Params *params() const { return (const Params *)_params; } 17911051Sandreas.hansson@arm.com 18012723Snikos.nikoleris@arm.com public: 18111051Sandreas.hansson@arm.com 18211051Sandreas.hansson@arm.com#if FULL_SYSTEM 18311484Snikos.nikoleris@arm.com /** 18411051Sandreas.hansson@arm.com * Returns the addess the kernel starts at. 18511051Sandreas.hansson@arm.com * @return address the kernel starts at 18611051Sandreas.hansson@arm.com */ 18711051Sandreas.hansson@arm.com Addr getKernelStart() const { return kernelStart; } 18811051Sandreas.hansson@arm.com 18912724Snikos.nikoleris@arm.com /** 19011601Sandreas.hansson@arm.com * Returns the addess the kernel ends at. 19111601Sandreas.hansson@arm.com * @return address the kernel ends at 19211601Sandreas.hansson@arm.com */ 19311051Sandreas.hansson@arm.com Addr getKernelEnd() const { return kernelEnd; } 19411051Sandreas.hansson@arm.com 19511051Sandreas.hansson@arm.com /** 19611051Sandreas.hansson@arm.com * Returns the addess the entry point to the kernel code. 19711051Sandreas.hansson@arm.com * @return entry point of the kernel code 19812345Snikos.nikoleris@arm.com */ 19912345Snikos.nikoleris@arm.com Addr getKernelEntry() const { return kernelEntry; } 20012345Snikos.nikoleris@arm.com 20112345Snikos.nikoleris@arm.com#else 20211051Sandreas.hansson@arm.com 20311051Sandreas.hansson@arm.com Addr new_page(); 20411051Sandreas.hansson@arm.com 20511051Sandreas.hansson@arm.com#endif // FULL_SYSTEM 20611051Sandreas.hansson@arm.com 20711051Sandreas.hansson@arm.com int registerExecContext(ExecContext *xc, int xcIndex); 20811051Sandreas.hansson@arm.com void replaceExecContext(ExecContext *xc, int xcIndex); 20911199Sandreas.hansson@arm.com 21011199Sandreas.hansson@arm.com void regStats(); 21111199Sandreas.hansson@arm.com void serialize(std::ostream &os); 21211199Sandreas.hansson@arm.com void unserialize(Checkpoint *cp, const std::string §ion); 21311199Sandreas.hansson@arm.com 21411051Sandreas.hansson@arm.com public: 21512345Snikos.nikoleris@arm.com //////////////////////////////////////////// 21612345Snikos.nikoleris@arm.com // 21711051Sandreas.hansson@arm.com // STATIC GLOBAL SYSTEM LIST 21811051Sandreas.hansson@arm.com // 21911051Sandreas.hansson@arm.com //////////////////////////////////////////// 22011051Sandreas.hansson@arm.com 22111051Sandreas.hansson@arm.com static std::vector<System *> systemList; 22211051Sandreas.hansson@arm.com static int numSystemsRunning; 22311051Sandreas.hansson@arm.com 22411051Sandreas.hansson@arm.com static void printSystems(); 22511051Sandreas.hansson@arm.com 22611051Sandreas.hansson@arm.com 22711051Sandreas.hansson@arm.com}; 22811051Sandreas.hansson@arm.com 22911051Sandreas.hansson@arm.com#endif // __SYSTEM_HH__ 23011051Sandreas.hansson@arm.com