system.hh revision 2424
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/statistics.hh" 362810Srdreslin@umich.edu#include "base/loader/symtab.hh" 372810Srdreslin@umich.edu#include "cpu/pc_event.hh" 382810Srdreslin@umich.edu#include "sim/sim_object.hh" 392810Srdreslin@umich.edu#if FULL_SYSTEM 402810Srdreslin@umich.edu#include "kern/system_events.hh" 412810Srdreslin@umich.edu#endif 4211051Sandreas.hansson@arm.com 4311051Sandreas.hansson@arm.comclass BaseCPU; 442810Srdreslin@umich.educlass ExecContext; 4511051Sandreas.hansson@arm.comclass MemoryController; 4611051Sandreas.hansson@arm.comclass ObjectFile; 4712349Snikos.nikoleris@arm.comclass Memory; 482810Srdreslin@umich.edu 492810Srdreslin@umich.edu#if FULL_SYSTEM 502810Srdreslin@umich.educlass Platform; 512810Srdreslin@umich.educlass GDBListener; 5211051Sandreas.hansson@arm.comclass RemoteGDB; 532810Srdreslin@umich.edunamespace Kernel { class Binning; } 542810Srdreslin@umich.edu#endif 5511051Sandreas.hansson@arm.com 562810Srdreslin@umich.educlass System : public SimObject 5712334Sgabeblack@google.com{ 5811051Sandreas.hansson@arm.com public: 5911051Sandreas.hansson@arm.com Memory *physmem; 6011051Sandreas.hansson@arm.com PCEventQueue pcEventQueue; 6111051Sandreas.hansson@arm.com 6211288Ssteve.reinhardt@amd.com std::vector<ExecContext *> execContexts; 6311051Sandreas.hansson@arm.com int numcpus; 6411051Sandreas.hansson@arm.com 6511051Sandreas.hansson@arm.com int getNumCPUs() 6611051Sandreas.hansson@arm.com { 6711051Sandreas.hansson@arm.com if (numcpus != execContexts.size()) 6811053Sandreas.hansson@arm.com panic("cpu array not fully populated!"); 6911053Sandreas.hansson@arm.com 7011051Sandreas.hansson@arm.com return numcpus; 7111051Sandreas.hansson@arm.com } 7211051Sandreas.hansson@arm.com 7311197Sandreas.hansson@arm.com#if FULL_SYSTEM 7411197Sandreas.hansson@arm.com MemoryController *memctrl; 7511199Sandreas.hansson@arm.com Platform *platform; 7611197Sandreas.hansson@arm.com uint64_t init_param; 7712084Sspwilson2@wisc.edu 7812084Sspwilson2@wisc.edu /** kernel symbol table */ 7911197Sandreas.hansson@arm.com SymbolTable *kernelSymtab; 8011051Sandreas.hansson@arm.com 8111051Sandreas.hansson@arm.com /** Object pointer for the kernel code */ 8211051Sandreas.hansson@arm.com ObjectFile *kernel; 8311051Sandreas.hansson@arm.com 8411051Sandreas.hansson@arm.com /** Begining of kernel code */ 8511051Sandreas.hansson@arm.com Addr kernelStart; 8611051Sandreas.hansson@arm.com 8711051Sandreas.hansson@arm.com /** End of kernel code */ 8811051Sandreas.hansson@arm.com Addr kernelEnd; 8911051Sandreas.hansson@arm.com 9011051Sandreas.hansson@arm.com /** Entry point in the kernel to start at */ 9111051Sandreas.hansson@arm.com Addr kernelEntry; 9211051Sandreas.hansson@arm.com 9311051Sandreas.hansson@arm.com Kernel::Binning *kernelBinning; 9411051Sandreas.hansson@arm.com 9511051Sandreas.hansson@arm.com#else 9611051Sandreas.hansson@arm.com 9711051Sandreas.hansson@arm.com int page_ptr; 9811051Sandreas.hansson@arm.com 9911051Sandreas.hansson@arm.com 10011051Sandreas.hansson@arm.com#endif // FULL_SYSTEM 10111051Sandreas.hansson@arm.com 10211051Sandreas.hansson@arm.com protected: 10311051Sandreas.hansson@arm.com 10411051Sandreas.hansson@arm.com#if FULL_SYSTEM 10511051Sandreas.hansson@arm.com /** 10611051Sandreas.hansson@arm.com * Fix up an address used to match PCs for hooking simulator 10711051Sandreas.hansson@arm.com * events on to target function executions. See comment in 10811051Sandreas.hansson@arm.com * system.cc for details. 10911051Sandreas.hansson@arm.com */ 11011051Sandreas.hansson@arm.com virtual Addr fixFuncEventAddr(Addr addr) = 0; 11111051Sandreas.hansson@arm.com 11211051Sandreas.hansson@arm.com /** 11311051Sandreas.hansson@arm.com * Add a function-based event to the given function, to be looked 11411051Sandreas.hansson@arm.com * up in the specified symbol table. 11511051Sandreas.hansson@arm.com */ 11611051Sandreas.hansson@arm.com template <class T> 11711051Sandreas.hansson@arm.com T *System::addFuncEvent(SymbolTable *symtab, const char *lbl) 11811051Sandreas.hansson@arm.com { 11911051Sandreas.hansson@arm.com Addr addr = 0; // initialize only to avoid compiler warning 12011051Sandreas.hansson@arm.com 12111051Sandreas.hansson@arm.com if (symtab->findAddress(lbl, addr)) { 12211051Sandreas.hansson@arm.com T *ev = new T(&pcEventQueue, lbl, fixFuncEventAddr(addr)); 12311051Sandreas.hansson@arm.com return ev; 12411051Sandreas.hansson@arm.com } 12511051Sandreas.hansson@arm.com 12611051Sandreas.hansson@arm.com return NULL; 12711051Sandreas.hansson@arm.com } 12811051Sandreas.hansson@arm.com 12911051Sandreas.hansson@arm.com /** Add a function-based event to kernel code. */ 13011051Sandreas.hansson@arm.com template <class T> 13111051Sandreas.hansson@arm.com T *System::addKernelFuncEvent(const char *lbl) 13211051Sandreas.hansson@arm.com { 13311051Sandreas.hansson@arm.com return addFuncEvent<T>(kernelSymtab, lbl); 13411051Sandreas.hansson@arm.com } 13511051Sandreas.hansson@arm.com 13611051Sandreas.hansson@arm.com#endif 13711051Sandreas.hansson@arm.com public: 13811051Sandreas.hansson@arm.com#if FULL_SYSTEM 13911051Sandreas.hansson@arm.com std::vector<RemoteGDB *> remoteGDB; 14011051Sandreas.hansson@arm.com std::vector<GDBListener *> gdbListen; 14111051Sandreas.hansson@arm.com virtual bool breakpoint() = 0; 14211051Sandreas.hansson@arm.com#endif // FULL_SYSTEM 14311051Sandreas.hansson@arm.com 14411051Sandreas.hansson@arm.com public: 14511051Sandreas.hansson@arm.com struct Params 14611051Sandreas.hansson@arm.com { 14711051Sandreas.hansson@arm.com std::string name; 14811051Sandreas.hansson@arm.com Memory *physmem; 14911051Sandreas.hansson@arm.com 15011051Sandreas.hansson@arm.com#if FULL_SYSTEM 15111601Sandreas.hansson@arm.com Tick boot_cpu_frequency; 15211601Sandreas.hansson@arm.com MemoryController *memctrl; 15311051Sandreas.hansson@arm.com uint64_t init_param; 15411051Sandreas.hansson@arm.com bool bin; 15511051Sandreas.hansson@arm.com std::vector<std::string> binned_fns; 15611051Sandreas.hansson@arm.com bool bin_int; 15711051Sandreas.hansson@arm.com 15811051Sandreas.hansson@arm.com std::string kernel_path; 15911051Sandreas.hansson@arm.com std::string readfile; 16011051Sandreas.hansson@arm.com#endif 16111051Sandreas.hansson@arm.com }; 16211051Sandreas.hansson@arm.com 16311284Sandreas.hansson@arm.com protected: 16411051Sandreas.hansson@arm.com Params *_params; 16511051Sandreas.hansson@arm.com 16611051Sandreas.hansson@arm.com public: 16711051Sandreas.hansson@arm.com System(Params *p); 16811051Sandreas.hansson@arm.com ~System(); 16911051Sandreas.hansson@arm.com 17011051Sandreas.hansson@arm.com void startup(); 17111284Sandreas.hansson@arm.com 17211284Sandreas.hansson@arm.com const Params *params() const { return (const Params *)_params; } 17311284Sandreas.hansson@arm.com 17411284Sandreas.hansson@arm.com public: 17511051Sandreas.hansson@arm.com 17611284Sandreas.hansson@arm.com#if FULL_SYSTEM 17711051Sandreas.hansson@arm.com /** 17811051Sandreas.hansson@arm.com * Returns the addess the kernel starts at. 17911051Sandreas.hansson@arm.com * @return address the kernel starts at 18011284Sandreas.hansson@arm.com */ 18111284Sandreas.hansson@arm.com Addr getKernelStart() const { return kernelStart; } 18211284Sandreas.hansson@arm.com 18311284Sandreas.hansson@arm.com /** 18411051Sandreas.hansson@arm.com * Returns the addess the kernel ends at. 18511744Snikos.nikoleris@arm.com * @return address the kernel ends at 18611051Sandreas.hansson@arm.com */ 18711051Sandreas.hansson@arm.com Addr getKernelEnd() const { return kernelEnd; } 18811051Sandreas.hansson@arm.com 18911051Sandreas.hansson@arm.com /** 19011286Sandreas.hansson@arm.com * Returns the addess the entry point to the kernel code. 19111286Sandreas.hansson@arm.com * @return entry point of the kernel code 19211286Sandreas.hansson@arm.com */ 19311051Sandreas.hansson@arm.com Addr getKernelEntry() const { return kernelEntry; } 19411286Sandreas.hansson@arm.com 19511600Sandreas.hansson@arm.com#else 19611600Sandreas.hansson@arm.com 19711051Sandreas.hansson@arm.com Addr new_page(); 19811051Sandreas.hansson@arm.com 19911051Sandreas.hansson@arm.com#endif // FULL_SYSTEM 20011284Sandreas.hansson@arm.com 20111051Sandreas.hansson@arm.com int registerExecContext(ExecContext *xc, int xcIndex); 20211051Sandreas.hansson@arm.com void replaceExecContext(ExecContext *xc, int xcIndex); 20311051Sandreas.hansson@arm.com 20411602Sandreas.hansson@arm.com void regStats(); 20511051Sandreas.hansson@arm.com void serialize(std::ostream &os); 20611051Sandreas.hansson@arm.com void unserialize(Checkpoint *cp, const std::string §ion); 20711284Sandreas.hansson@arm.com 20811051Sandreas.hansson@arm.com public: 20911284Sandreas.hansson@arm.com //////////////////////////////////////////// 21011602Sandreas.hansson@arm.com // 21111051Sandreas.hansson@arm.com // STATIC GLOBAL SYSTEM LIST 21211051Sandreas.hansson@arm.com // 21311284Sandreas.hansson@arm.com //////////////////////////////////////////// 21411051Sandreas.hansson@arm.com 21511284Sandreas.hansson@arm.com static std::vector<System *> systemList; 21611284Sandreas.hansson@arm.com static int numSystemsRunning; 21711284Sandreas.hansson@arm.com 21811051Sandreas.hansson@arm.com static void printSystems(); 21911051Sandreas.hansson@arm.com 22011051Sandreas.hansson@arm.com 22111284Sandreas.hansson@arm.com}; 22211284Sandreas.hansson@arm.com 22311284Sandreas.hansson@arm.com#endif // __SYSTEM_HH__ 22411284Sandreas.hansson@arm.com