system.hh revision 2680
17584SAli.Saidi@arm.com/* 27584SAli.Saidi@arm.com * Copyright (c) 2002-2005 The Regents of The University of Michigan 37584SAli.Saidi@arm.com * All rights reserved. 47584SAli.Saidi@arm.com * 57584SAli.Saidi@arm.com * Redistribution and use in source and binary forms, with or without 67584SAli.Saidi@arm.com * modification, are permitted provided that the following conditions are 77584SAli.Saidi@arm.com * met: redistributions of source code must retain the above copyright 87584SAli.Saidi@arm.com * notice, this list of conditions and the following disclaimer; 97584SAli.Saidi@arm.com * redistributions in binary form must reproduce the above copyright 107584SAli.Saidi@arm.com * notice, this list of conditions and the following disclaimer in the 117584SAli.Saidi@arm.com * documentation and/or other materials provided with the distribution; 127584SAli.Saidi@arm.com * neither the name of the copyright holders nor the names of its 137584SAli.Saidi@arm.com * contributors may be used to endorse or promote products derived from 147584SAli.Saidi@arm.com * this software without specific prior written permission. 157584SAli.Saidi@arm.com * 167584SAli.Saidi@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177584SAli.Saidi@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187584SAli.Saidi@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197584SAli.Saidi@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207584SAli.Saidi@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 217584SAli.Saidi@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 227584SAli.Saidi@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237584SAli.Saidi@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 247584SAli.Saidi@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 257584SAli.Saidi@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 267584SAli.Saidi@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 277584SAli.Saidi@arm.com * 287584SAli.Saidi@arm.com * Authors: Steve Reinhardt 297584SAli.Saidi@arm.com * Lisa Hsu 307584SAli.Saidi@arm.com * Nathan Binkert 317584SAli.Saidi@arm.com */ 327584SAli.Saidi@arm.com 337584SAli.Saidi@arm.com#ifndef __SYSTEM_HH__ 347584SAli.Saidi@arm.com#define __SYSTEM_HH__ 357584SAli.Saidi@arm.com 367584SAli.Saidi@arm.com#include <string> 377584SAli.Saidi@arm.com#include <vector> 387584SAli.Saidi@arm.com 397584SAli.Saidi@arm.com#include "base/loader/symtab.hh" 407584SAli.Saidi@arm.com#include "base/misc.hh" 417584SAli.Saidi@arm.com#include "base/statistics.hh" 428245Snate@binkert.org#include "cpu/pc_event.hh" 438245Snate@binkert.org#include "mem/port.hh" 447584SAli.Saidi@arm.com#include "sim/sim_object.hh" 457584SAli.Saidi@arm.com#if FULL_SYSTEM 467584SAli.Saidi@arm.com#include "kern/system_events.hh" 477584SAli.Saidi@arm.com#include "mem/vport.hh" 487584SAli.Saidi@arm.com#endif 497587SAli.Saidi@arm.com 507587SAli.Saidi@arm.comclass BaseCPU; 517584SAli.Saidi@arm.comclass ThreadContext; 527584SAli.Saidi@arm.comclass ObjectFile; 537584SAli.Saidi@arm.comclass PhysicalMemory; 547584SAli.Saidi@arm.com 557584SAli.Saidi@arm.com#if FULL_SYSTEM 567584SAli.Saidi@arm.comclass Platform; 577584SAli.Saidi@arm.comclass GDBListener; 587584SAli.Saidi@arm.comclass RemoteGDB; 597584SAli.Saidi@arm.comnamespace Kernel { class Binning; } 607584SAli.Saidi@arm.com#endif 617584SAli.Saidi@arm.com 627584SAli.Saidi@arm.comclass System : public SimObject 637584SAli.Saidi@arm.com{ 647584SAli.Saidi@arm.com public: 657584SAli.Saidi@arm.com PhysicalMemory *physmem; 667584SAli.Saidi@arm.com PCEventQueue pcEventQueue; 677584SAli.Saidi@arm.com 687584SAli.Saidi@arm.com std::vector<ThreadContext *> threadContexts; 697584SAli.Saidi@arm.com int numcpus; 707584SAli.Saidi@arm.com 717584SAli.Saidi@arm.com int getNumCPUs() 727584SAli.Saidi@arm.com { 737584SAli.Saidi@arm.com if (numcpus != threadContexts.size()) 747584SAli.Saidi@arm.com panic("cpu array not fully populated!"); 757584SAli.Saidi@arm.com 767584SAli.Saidi@arm.com return numcpus; 777584SAli.Saidi@arm.com } 787587SAli.Saidi@arm.com 797584SAli.Saidi@arm.com#if FULL_SYSTEM 807584SAli.Saidi@arm.com Platform *platform; 817584SAli.Saidi@arm.com uint64_t init_param; 827584SAli.Saidi@arm.com 837584SAli.Saidi@arm.com /** Port to physical memory used for writing object files into ram at 847584SAli.Saidi@arm.com * boot.*/ 857584SAli.Saidi@arm.com FunctionalPort functionalPort; 867584SAli.Saidi@arm.com VirtualPort virtPort; 877584SAli.Saidi@arm.com 887584SAli.Saidi@arm.com /** kernel symbol table */ 897584SAli.Saidi@arm.com SymbolTable *kernelSymtab; 907584SAli.Saidi@arm.com 917584SAli.Saidi@arm.com /** Object pointer for the kernel code */ 927584SAli.Saidi@arm.com ObjectFile *kernel; 937584SAli.Saidi@arm.com 947584SAli.Saidi@arm.com /** Begining of kernel code */ 957584SAli.Saidi@arm.com Addr kernelStart; 967823Ssteve.reinhardt@amd.com 977584SAli.Saidi@arm.com /** End of kernel code */ 987584SAli.Saidi@arm.com Addr kernelEnd; 997584SAli.Saidi@arm.com 1007584SAli.Saidi@arm.com /** Entry point in the kernel to start at */ 1017584SAli.Saidi@arm.com Addr kernelEntry; 1027584SAli.Saidi@arm.com 1037584SAli.Saidi@arm.com Kernel::Binning *kernelBinning; 1047584SAli.Saidi@arm.com 1057584SAli.Saidi@arm.com#else 1067584SAli.Saidi@arm.com 1077584SAli.Saidi@arm.com int page_ptr; 1087584SAli.Saidi@arm.com 1097584SAli.Saidi@arm.com 1107584SAli.Saidi@arm.com#endif // FULL_SYSTEM 1117584SAli.Saidi@arm.com 1127584SAli.Saidi@arm.com protected: 1137584SAli.Saidi@arm.com 1147584SAli.Saidi@arm.com#if FULL_SYSTEM 1157584SAli.Saidi@arm.com /** 1167584SAli.Saidi@arm.com * Fix up an address used to match PCs for hooking simulator 1178524SAli.Saidi@ARM.com * events on to target function executions. See comment in 1187584SAli.Saidi@arm.com * system.cc for details. 1197584SAli.Saidi@arm.com */ 1207584SAli.Saidi@arm.com virtual Addr fixFuncEventAddr(Addr addr) = 0; 1217584SAli.Saidi@arm.com 1227584SAli.Saidi@arm.com /** 1237584SAli.Saidi@arm.com * Add a function-based event to the given function, to be looked 1247584SAli.Saidi@arm.com * up in the specified symbol table. 1257584SAli.Saidi@arm.com */ 1267584SAli.Saidi@arm.com template <class T> 1277584SAli.Saidi@arm.com T *System::addFuncEvent(SymbolTable *symtab, const char *lbl) 1287584SAli.Saidi@arm.com { 1297584SAli.Saidi@arm.com Addr addr = 0; // initialize only to avoid compiler warning 1307584SAli.Saidi@arm.com 1317584SAli.Saidi@arm.com if (symtab->findAddress(lbl, addr)) { 1327584SAli.Saidi@arm.com T *ev = new T(&pcEventQueue, lbl, fixFuncEventAddr(addr)); 1337587SAli.Saidi@arm.com return ev; 1347584SAli.Saidi@arm.com } 1357584SAli.Saidi@arm.com 1367584SAli.Saidi@arm.com return NULL; 1377584SAli.Saidi@arm.com } 1387584SAli.Saidi@arm.com 1397584SAli.Saidi@arm.com /** Add a function-based event to kernel code. */ 1407584SAli.Saidi@arm.com template <class T> 1417584SAli.Saidi@arm.com T *System::addKernelFuncEvent(const char *lbl) 1428524SAli.Saidi@ARM.com { 1437584SAli.Saidi@arm.com return addFuncEvent<T>(kernelSymtab, lbl); 1447584SAli.Saidi@arm.com } 1457584SAli.Saidi@arm.com 1467584SAli.Saidi@arm.com#endif 1477584SAli.Saidi@arm.com public: 1487584SAli.Saidi@arm.com#if FULL_SYSTEM 1497584SAli.Saidi@arm.com std::vector<RemoteGDB *> remoteGDB; 1507584SAli.Saidi@arm.com std::vector<GDBListener *> gdbListen; 1517584SAli.Saidi@arm.com virtual bool breakpoint() = 0; 1527584SAli.Saidi@arm.com#endif // FULL_SYSTEM 1537584SAli.Saidi@arm.com 1547584SAli.Saidi@arm.com public: 1557584SAli.Saidi@arm.com struct Params 1567584SAli.Saidi@arm.com { 1577584SAli.Saidi@arm.com std::string name; 1587584SAli.Saidi@arm.com PhysicalMemory *physmem; 1597584SAli.Saidi@arm.com 1607584SAli.Saidi@arm.com#if FULL_SYSTEM 1617584SAli.Saidi@arm.com Tick boot_cpu_frequency; 1627584SAli.Saidi@arm.com std::string boot_osflags; 1637584SAli.Saidi@arm.com uint64_t init_param; 1647584SAli.Saidi@arm.com bool bin; 1657584SAli.Saidi@arm.com std::vector<std::string> binned_fns; 1667584SAli.Saidi@arm.com bool bin_int; 1677584SAli.Saidi@arm.com 1687584SAli.Saidi@arm.com std::string kernel_path; 1697584SAli.Saidi@arm.com std::string readfile; 1707584SAli.Saidi@arm.com#endif 1717584SAli.Saidi@arm.com }; 1727584SAli.Saidi@arm.com 1737584SAli.Saidi@arm.com protected: 1747584SAli.Saidi@arm.com Params *_params; 1757584SAli.Saidi@arm.com 1767584SAli.Saidi@arm.com public: 1777584SAli.Saidi@arm.com System(Params *p); 1787584SAli.Saidi@arm.com ~System(); 1797584SAli.Saidi@arm.com 1807584SAli.Saidi@arm.com void startup(); 1817584SAli.Saidi@arm.com 1827943SAli.Saidi@ARM.com const Params *params() const { return (const Params *)_params; } 1837584SAli.Saidi@arm.com 1847943SAli.Saidi@ARM.com public: 1857943SAli.Saidi@ARM.com 1867584SAli.Saidi@arm.com#if FULL_SYSTEM 1877584SAli.Saidi@arm.com /** 1887584SAli.Saidi@arm.com * Returns the addess the kernel starts at. 1897584SAli.Saidi@arm.com * @return address the kernel starts at 1907584SAli.Saidi@arm.com */ 1917584SAli.Saidi@arm.com Addr getKernelStart() const { return kernelStart; } 1927823Ssteve.reinhardt@amd.com 1937823Ssteve.reinhardt@amd.com /** 1947584SAli.Saidi@arm.com * Returns the addess the kernel ends at. 1957584SAli.Saidi@arm.com * @return address the kernel ends at 1967584SAli.Saidi@arm.com */ 1977584SAli.Saidi@arm.com Addr getKernelEnd() const { return kernelEnd; } 1987584SAli.Saidi@arm.com 1997584SAli.Saidi@arm.com /** 2007584SAli.Saidi@arm.com * Returns the addess the entry point to the kernel code. 2017584SAli.Saidi@arm.com * @return entry point of the kernel code 2027584SAli.Saidi@arm.com */ 2037584SAli.Saidi@arm.com Addr getKernelEntry() const { return kernelEntry; } 2047584SAli.Saidi@arm.com 2057584SAli.Saidi@arm.com#else 2067584SAli.Saidi@arm.com 2077584SAli.Saidi@arm.com Addr new_page(); 2087584SAli.Saidi@arm.com 2097584SAli.Saidi@arm.com#endif // FULL_SYSTEM 2107584SAli.Saidi@arm.com 2117584SAli.Saidi@arm.com int registerThreadContext(ThreadContext *tc, int tcIndex); 2127584SAli.Saidi@arm.com void replaceThreadContext(ThreadContext *tc, int tcIndex); 2137584SAli.Saidi@arm.com 2147584SAli.Saidi@arm.com void regStats(); 2157584SAli.Saidi@arm.com void serialize(std::ostream &os); 2167584SAli.Saidi@arm.com void unserialize(Checkpoint *cp, const std::string §ion); 2177584SAli.Saidi@arm.com 2187584SAli.Saidi@arm.com public: 2197584SAli.Saidi@arm.com //////////////////////////////////////////// 2207584SAli.Saidi@arm.com // 2217584SAli.Saidi@arm.com // STATIC GLOBAL SYSTEM LIST 2227584SAli.Saidi@arm.com // 2237733SAli.Saidi@ARM.com //////////////////////////////////////////// 2247733SAli.Saidi@ARM.com 2257733SAli.Saidi@ARM.com static std::vector<System *> systemList; 2267733SAli.Saidi@ARM.com static int numSystemsRunning; 2277733SAli.Saidi@ARM.com 2287733SAli.Saidi@ARM.com static void printSystems(); 2297733SAli.Saidi@ARM.com 2307733SAli.Saidi@ARM.com 2317733SAli.Saidi@ARM.com}; 2327733SAli.Saidi@ARM.com 2337733SAli.Saidi@ARM.com#endif // __SYSTEM_HH__ 2347733SAli.Saidi@ARM.com