system.hh revision 6221
17138Sgblack@eecs.umich.edu/*
27138Sgblack@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan
37138Sgblack@eecs.umich.edu * All rights reserved.
47138Sgblack@eecs.umich.edu *
57138Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
67138Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
77138Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
87138Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
97138Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
107138Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
117138Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
127138Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
137138Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
147138Sgblack@eecs.umich.edu * this software without specific prior written permission.
157138Sgblack@eecs.umich.edu *
167138Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
177138Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
187138Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
197138Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
207138Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
217138Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
227138Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
237138Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
247138Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
257138Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
267138Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
277138Sgblack@eecs.umich.edu *
287138Sgblack@eecs.umich.edu * Authors: Steve Reinhardt
297138Sgblack@eecs.umich.edu *          Lisa Hsu
307138Sgblack@eecs.umich.edu *          Nathan Binkert
317138Sgblack@eecs.umich.edu */
327138Sgblack@eecs.umich.edu
337138Sgblack@eecs.umich.edu#ifndef __SYSTEM_HH__
347138Sgblack@eecs.umich.edu#define __SYSTEM_HH__
357138Sgblack@eecs.umich.edu
367138Sgblack@eecs.umich.edu#include <string>
377138Sgblack@eecs.umich.edu#include <vector>
387138Sgblack@eecs.umich.edu
397138Sgblack@eecs.umich.edu#include "base/loader/symtab.hh"
407138Sgblack@eecs.umich.edu#include "base/misc.hh"
417138Sgblack@eecs.umich.edu#include "base/statistics.hh"
427138Sgblack@eecs.umich.edu#include "config/full_system.hh"
437138Sgblack@eecs.umich.edu#include "cpu/pc_event.hh"
447138Sgblack@eecs.umich.edu#include "enums/MemoryMode.hh"
457138Sgblack@eecs.umich.edu#include "mem/port.hh"
467214Sgblack@eecs.umich.edu#include "params/System.hh"
477214Sgblack@eecs.umich.edu#include "sim/sim_object.hh"
487214Sgblack@eecs.umich.edu#if FULL_SYSTEM
497214Sgblack@eecs.umich.edu#include "kern/system_events.hh"
507138Sgblack@eecs.umich.edu#include "mem/vport.hh"
517193Sgblack@eecs.umich.edu#endif
527138Sgblack@eecs.umich.edu
537138Sgblack@eecs.umich.educlass BaseCPU;
547138Sgblack@eecs.umich.educlass ThreadContext;
557138Sgblack@eecs.umich.educlass ObjectFile;
567138Sgblack@eecs.umich.educlass PhysicalMemory;
577138Sgblack@eecs.umich.edu
587138Sgblack@eecs.umich.edu#if FULL_SYSTEM
597138Sgblack@eecs.umich.educlass Platform;
607138Sgblack@eecs.umich.edu#endif
617138Sgblack@eecs.umich.educlass GDBListener;
627138Sgblack@eecs.umich.edunamespace TheISA
637138Sgblack@eecs.umich.edu{
647138Sgblack@eecs.umich.edu    class RemoteGDB;
657138Sgblack@eecs.umich.edu}
667138Sgblack@eecs.umich.edu
677138Sgblack@eecs.umich.educlass System : public SimObject
687138Sgblack@eecs.umich.edu{
697138Sgblack@eecs.umich.edu  public:
707138Sgblack@eecs.umich.edu
717138Sgblack@eecs.umich.edu    static const char *MemoryModeStrings[3];
727138Sgblack@eecs.umich.edu
737138Sgblack@eecs.umich.edu    Enums::MemoryMode
747193Sgblack@eecs.umich.edu    getMemoryMode()
757138Sgblack@eecs.umich.edu    {
767215Sgblack@eecs.umich.edu        assert(memoryMode);
777138Sgblack@eecs.umich.edu        return memoryMode;
787138Sgblack@eecs.umich.edu    }
797138Sgblack@eecs.umich.edu
807138Sgblack@eecs.umich.edu    /** Change the memory mode of the system. This should only be called by the
817138Sgblack@eecs.umich.edu     * python!!
827138Sgblack@eecs.umich.edu     * @param mode Mode to change to (atomic/timing)
837138Sgblack@eecs.umich.edu     */
847138Sgblack@eecs.umich.edu    void setMemoryMode(Enums::MemoryMode mode);
857138Sgblack@eecs.umich.edu
867138Sgblack@eecs.umich.edu    PhysicalMemory *physmem;
877138Sgblack@eecs.umich.edu    PCEventQueue pcEventQueue;
887138Sgblack@eecs.umich.edu
897138Sgblack@eecs.umich.edu    std::vector<ThreadContext *> threadContexts;
907138Sgblack@eecs.umich.edu    int _numContexts;
917138Sgblack@eecs.umich.edu
927138Sgblack@eecs.umich.edu    ThreadContext *getThreadContext(ThreadID tid)
937138Sgblack@eecs.umich.edu    {
947193Sgblack@eecs.umich.edu        return threadContexts[tid];
957138Sgblack@eecs.umich.edu    }
967215Sgblack@eecs.umich.edu
977138Sgblack@eecs.umich.edu    int numContexts()
987138Sgblack@eecs.umich.edu    {
997138Sgblack@eecs.umich.edu        assert(_numContexts == threadContexts.size());
1007138Sgblack@eecs.umich.edu        return _numContexts;
1017138Sgblack@eecs.umich.edu    }
1027138Sgblack@eecs.umich.edu
1037138Sgblack@eecs.umich.edu    /** Return number of running (non-halted) thread contexts in
1047138Sgblack@eecs.umich.edu     * system.  These threads could be Active or Suspended. */
1057138Sgblack@eecs.umich.edu    int numRunningContexts();
1067181Sgblack@eecs.umich.edu
1077138Sgblack@eecs.umich.edu#if FULL_SYSTEM
1087193Sgblack@eecs.umich.edu    Platform *platform;
1097648SAli.Saidi@ARM.com    uint64_t init_param;
1107138Sgblack@eecs.umich.edu
1117138Sgblack@eecs.umich.edu    /** Port to physical memory used for writing object files into ram at
1127138Sgblack@eecs.umich.edu     * boot.*/
1137138Sgblack@eecs.umich.edu    FunctionalPort functionalPort;
1147138Sgblack@eecs.umich.edu    VirtualPort virtPort;
1157193Sgblack@eecs.umich.edu
1167184Sgblack@eecs.umich.edu    /** kernel symbol table */
1177214Sgblack@eecs.umich.edu    SymbolTable *kernelSymtab;
1187214Sgblack@eecs.umich.edu
1197138Sgblack@eecs.umich.edu    /** Object pointer for the kernel code */
1207138Sgblack@eecs.umich.edu    ObjectFile *kernel;
1217138Sgblack@eecs.umich.edu
1227138Sgblack@eecs.umich.edu    /** Begining of kernel code */
1237138Sgblack@eecs.umich.edu    Addr kernelStart;
1247138Sgblack@eecs.umich.edu
1257184Sgblack@eecs.umich.edu    /** End of kernel code */
1267188Sgblack@eecs.umich.edu    Addr kernelEnd;
1277184Sgblack@eecs.umich.edu
1287648SAli.Saidi@ARM.com    /** Entry point in the kernel to start at */
1297188Sgblack@eecs.umich.edu    Addr kernelEntry;
1307184Sgblack@eecs.umich.edu
1317184Sgblack@eecs.umich.edu#else
1327648SAli.Saidi@ARM.com
1337184Sgblack@eecs.umich.edu    int page_ptr;
1347188Sgblack@eecs.umich.edu
1357188Sgblack@eecs.umich.edu  protected:
1367188Sgblack@eecs.umich.edu    uint64_t next_PID;
1377188Sgblack@eecs.umich.edu
1387188Sgblack@eecs.umich.edu  public:
1397188Sgblack@eecs.umich.edu    uint64_t allocatePID()
1407193Sgblack@eecs.umich.edu    {
1417193Sgblack@eecs.umich.edu        return next_PID++;
1427188Sgblack@eecs.umich.edu    }
1437188Sgblack@eecs.umich.edu
1447188Sgblack@eecs.umich.edu    /** Amount of physical memory that is still free */
1457193Sgblack@eecs.umich.edu    Addr freeMemSize();
1468203SAli.Saidi@ARM.com
1478203SAli.Saidi@ARM.com    /** Amount of physical memory that exists */
1487184Sgblack@eecs.umich.edu    Addr memSize();
1497184Sgblack@eecs.umich.edu
1507184Sgblack@eecs.umich.edu
1517184Sgblack@eecs.umich.edu#endif // FULL_SYSTEM
1527184Sgblack@eecs.umich.edu
1537193Sgblack@eecs.umich.edu  protected:
1547184Sgblack@eecs.umich.edu    Enums::MemoryMode memoryMode;
1557214Sgblack@eecs.umich.edu
1567215Sgblack@eecs.umich.edu#if FULL_SYSTEM
1577184Sgblack@eecs.umich.edu    /**
1587138Sgblack@eecs.umich.edu     * Fix up an address used to match PCs for hooking simulator
1597138Sgblack@eecs.umich.edu     * events on to target function executions.  See comment in
1607138Sgblack@eecs.umich.edu     * system.cc for details.
1617138Sgblack@eecs.umich.edu     */
1627138Sgblack@eecs.umich.edu    virtual Addr fixFuncEventAddr(Addr addr) = 0;
1637184Sgblack@eecs.umich.edu
1647188Sgblack@eecs.umich.edu    /**
1658203SAli.Saidi@ARM.com     * Add a function-based event to the given function, to be looked
1668203SAli.Saidi@ARM.com     * up in the specified symbol table.
1677648SAli.Saidi@ARM.com     */
1687188Sgblack@eecs.umich.edu    template <class T>
1697184Sgblack@eecs.umich.edu    T *addFuncEvent(SymbolTable *symtab, const char *lbl)
1707184Sgblack@eecs.umich.edu    {
1718203SAli.Saidi@ARM.com        Addr addr = 0; // initialize only to avoid compiler warning
1728203SAli.Saidi@ARM.com
1738203SAli.Saidi@ARM.com        if (symtab->findAddress(lbl, addr)) {
1747184Sgblack@eecs.umich.edu            T *ev = new T(&pcEventQueue, lbl, fixFuncEventAddr(addr));
1757188Sgblack@eecs.umich.edu            return ev;
1767188Sgblack@eecs.umich.edu        }
1777188Sgblack@eecs.umich.edu
1787188Sgblack@eecs.umich.edu        return NULL;
1797188Sgblack@eecs.umich.edu    }
1807188Sgblack@eecs.umich.edu
1817193Sgblack@eecs.umich.edu    /** Add a function-based event to kernel code. */
1827193Sgblack@eecs.umich.edu    template <class T>
1837188Sgblack@eecs.umich.edu    T *addKernelFuncEvent(const char *lbl)
1847188Sgblack@eecs.umich.edu    {
1857188Sgblack@eecs.umich.edu        return addFuncEvent<T>(kernelSymtab, lbl);
1867188Sgblack@eecs.umich.edu    }
1877193Sgblack@eecs.umich.edu
1887193Sgblack@eecs.umich.edu#endif
1897184Sgblack@eecs.umich.edu  public:
1907184Sgblack@eecs.umich.edu    std::vector<TheISA::RemoteGDB *> remoteGDB;
1917184Sgblack@eecs.umich.edu    std::vector<GDBListener *> gdbListen;
1927184Sgblack@eecs.umich.edu    bool breakpoint();
1937184Sgblack@eecs.umich.edu
1947193Sgblack@eecs.umich.edu  public:
1957184Sgblack@eecs.umich.edu    typedef SystemParams Params;
1967214Sgblack@eecs.umich.edu
1977215Sgblack@eecs.umich.edu  protected:
1987184Sgblack@eecs.umich.edu    Params *_params;
1997138Sgblack@eecs.umich.edu
2007138Sgblack@eecs.umich.edu  public:
2017138Sgblack@eecs.umich.edu    System(Params *p);
2027138Sgblack@eecs.umich.edu    ~System();
2037138Sgblack@eecs.umich.edu
2047138Sgblack@eecs.umich.edu    void startup();
2057188Sgblack@eecs.umich.edu
2067138Sgblack@eecs.umich.edu    const Params *params() const { return (const Params *)_params; }
2077138Sgblack@eecs.umich.edu
2087138Sgblack@eecs.umich.edu  public:
2097138Sgblack@eecs.umich.edu
2107188Sgblack@eecs.umich.edu#if FULL_SYSTEM
2117138Sgblack@eecs.umich.edu    /**
2127138Sgblack@eecs.umich.edu     * Returns the addess the kernel starts at.
2137422Sgblack@eecs.umich.edu     * @return address the kernel starts at
2147138Sgblack@eecs.umich.edu     */
2157188Sgblack@eecs.umich.edu    Addr getKernelStart() const { return kernelStart; }
2167188Sgblack@eecs.umich.edu
2177188Sgblack@eecs.umich.edu    /**
2187188Sgblack@eecs.umich.edu     * Returns the addess the kernel ends at.
2197188Sgblack@eecs.umich.edu     * @return address the kernel ends at
2207184Sgblack@eecs.umich.edu     */
2217193Sgblack@eecs.umich.edu    Addr getKernelEnd() const { return kernelEnd; }
2227193Sgblack@eecs.umich.edu
2237188Sgblack@eecs.umich.edu    /**
2247188Sgblack@eecs.umich.edu     * Returns the addess the entry point to the kernel code.
2257188Sgblack@eecs.umich.edu     * @return entry point of the kernel code
2267188Sgblack@eecs.umich.edu     */
2277188Sgblack@eecs.umich.edu    Addr getKernelEntry() const { return kernelEntry; }
2288203SAli.Saidi@ARM.com
2297188Sgblack@eecs.umich.edu#else
2307188Sgblack@eecs.umich.edu
2317188Sgblack@eecs.umich.edu    Addr new_page();
2327188Sgblack@eecs.umich.edu
2337188Sgblack@eecs.umich.edu#endif // FULL_SYSTEM
2347188Sgblack@eecs.umich.edu
2357188Sgblack@eecs.umich.edu    int registerThreadContext(ThreadContext *tc, int assigned=-1);
2368203SAli.Saidi@ARM.com    void replaceThreadContext(ThreadContext *tc, int context_id);
2378203SAli.Saidi@ARM.com
2387188Sgblack@eecs.umich.edu    void serialize(std::ostream &os);
2397188Sgblack@eecs.umich.edu    void unserialize(Checkpoint *cp, const std::string &section);
2407188Sgblack@eecs.umich.edu
2417400SAli.Saidi@ARM.com  public:
2427188Sgblack@eecs.umich.edu    ////////////////////////////////////////////
2437400SAli.Saidi@ARM.com    //
2447188Sgblack@eecs.umich.edu    // STATIC GLOBAL SYSTEM LIST
2457188Sgblack@eecs.umich.edu    //
2467797Sgblack@eecs.umich.edu    ////////////////////////////////////////////
2477797Sgblack@eecs.umich.edu
2488205SAli.Saidi@ARM.com    static std::vector<System *> systemList;
2497858SMatt.Horsnell@arm.com    static int numSystemsRunning;
2507188Sgblack@eecs.umich.edu
2517188Sgblack@eecs.umich.edu    static void printSystems();
2527648SAli.Saidi@ARM.com
2537648SAli.Saidi@ARM.com
2547188Sgblack@eecs.umich.edu};
2557648SAli.Saidi@ARM.com
2567648SAli.Saidi@ARM.com#endif // __SYSTEM_HH__
2577188Sgblack@eecs.umich.edu