system.hh revision 3565
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 *
55086Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
65086Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
75086Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
85086Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
95086Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
105086Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
115086Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
125086Sgblack@eecs.umich.edu * 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
145086Sgblack@eecs.umich.edu * this software without specific prior written permission.
155086Sgblack@eecs.umich.edu *
165086Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175086Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185086Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195086Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205086Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215086Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225086Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235086Sgblack@eecs.umich.edu * 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 * Authors: Steve Reinhardt
295086Sgblack@eecs.umich.edu *          Lisa Hsu
305086Sgblack@eecs.umich.edu *          Nathan Binkert
315086Sgblack@eecs.umich.edu */
325086Sgblack@eecs.umich.edu
335086Sgblack@eecs.umich.edu#ifndef __SYSTEM_HH__
345086Sgblack@eecs.umich.edu#define __SYSTEM_HH__
355086Sgblack@eecs.umich.edu
365086Sgblack@eecs.umich.edu#include <string>
375086Sgblack@eecs.umich.edu#include <vector>
385086Sgblack@eecs.umich.edu
395086Sgblack@eecs.umich.edu#include "base/loader/symtab.hh"
405086Sgblack@eecs.umich.edu#include "base/misc.hh"
415086Sgblack@eecs.umich.edu#include "base/statistics.hh"
425086Sgblack@eecs.umich.edu#include "config/full_system.hh"
435086Sgblack@eecs.umich.edu#include "cpu/pc_event.hh"
445086Sgblack@eecs.umich.edu#include "mem/port.hh"
455086Sgblack@eecs.umich.edu#include "sim/sim_object.hh"
465086Sgblack@eecs.umich.edu#if FULL_SYSTEM
475086Sgblack@eecs.umich.edu#include "kern/system_events.hh"
485086Sgblack@eecs.umich.edu#include "mem/vport.hh"
495086Sgblack@eecs.umich.edu#endif
505086Sgblack@eecs.umich.edu
515086Sgblack@eecs.umich.educlass BaseCPU;
525086Sgblack@eecs.umich.educlass ThreadContext;
535086Sgblack@eecs.umich.educlass ObjectFile;
545086Sgblack@eecs.umich.educlass PhysicalMemory;
555086Sgblack@eecs.umich.edu
565086Sgblack@eecs.umich.edu#if FULL_SYSTEM
575086Sgblack@eecs.umich.educlass Platform;
585135Sgblack@eecs.umich.educlass GDBListener;
595135Sgblack@eecs.umich.edunamespace TheISA
605135Sgblack@eecs.umich.edu{
615086Sgblack@eecs.umich.edu    class RemoteGDB;
625135Sgblack@eecs.umich.edu}
635086Sgblack@eecs.umich.edu#endif
645086Sgblack@eecs.umich.edu
655086Sgblack@eecs.umich.educlass System : public SimObject
665086Sgblack@eecs.umich.edu{
675086Sgblack@eecs.umich.edu  public:
685086Sgblack@eecs.umich.edu
695086Sgblack@eecs.umich.edu    static const char *MemoryModeStrings[3];
705086Sgblack@eecs.umich.edu
715086Sgblack@eecs.umich.edu    SimObject::MemoryMode getMemoryMode() { assert(memoryMode); return memoryMode; }
725086Sgblack@eecs.umich.edu
735086Sgblack@eecs.umich.edu    /** Change the memory mode of the system. This should only be called by the
745135Sgblack@eecs.umich.edu     * python!!
755135Sgblack@eecs.umich.edu     * @param mode Mode to change to (atomic/timing)
765135Sgblack@eecs.umich.edu     */
775135Sgblack@eecs.umich.edu    void setMemoryMode(SimObject::MemoryMode mode);
785135Sgblack@eecs.umich.edu
795135Sgblack@eecs.umich.edu    PhysicalMemory *physmem;
805135Sgblack@eecs.umich.edu    PCEventQueue pcEventQueue;
815135Sgblack@eecs.umich.edu
825135Sgblack@eecs.umich.edu    std::vector<ThreadContext *> threadContexts;
835135Sgblack@eecs.umich.edu    int numcpus;
845135Sgblack@eecs.umich.edu
855135Sgblack@eecs.umich.edu    int getNumCPUs()
865135Sgblack@eecs.umich.edu    {
875135Sgblack@eecs.umich.edu        if (numcpus != threadContexts.size())
885135Sgblack@eecs.umich.edu            panic("cpu array not fully populated!");
895135Sgblack@eecs.umich.edu
905135Sgblack@eecs.umich.edu        return numcpus;
915135Sgblack@eecs.umich.edu    }
925135Sgblack@eecs.umich.edu
935135Sgblack@eecs.umich.edu#if FULL_SYSTEM
945135Sgblack@eecs.umich.edu    Platform *platform;
955135Sgblack@eecs.umich.edu    uint64_t init_param;
965135Sgblack@eecs.umich.edu
975135Sgblack@eecs.umich.edu    /** Port to physical memory used for writing object files into ram at
985135Sgblack@eecs.umich.edu     * boot.*/
995135Sgblack@eecs.umich.edu    FunctionalPort functionalPort;
1005135Sgblack@eecs.umich.edu    VirtualPort virtPort;
1015135Sgblack@eecs.umich.edu
1025135Sgblack@eecs.umich.edu    /** kernel symbol table */
1035135Sgblack@eecs.umich.edu    SymbolTable *kernelSymtab;
1045135Sgblack@eecs.umich.edu
1055135Sgblack@eecs.umich.edu    /** Object pointer for the kernel code */
1065135Sgblack@eecs.umich.edu    ObjectFile *kernel;
1075135Sgblack@eecs.umich.edu
1085135Sgblack@eecs.umich.edu    /** Begining of kernel code */
1095135Sgblack@eecs.umich.edu    Addr kernelStart;
1105141Sgblack@eecs.umich.edu
1115141Sgblack@eecs.umich.edu    /** End of kernel code */
1125141Sgblack@eecs.umich.edu    Addr kernelEnd;
1135141Sgblack@eecs.umich.edu
1145141Sgblack@eecs.umich.edu    /** Entry point in the kernel to start at */
1155141Sgblack@eecs.umich.edu    Addr kernelEntry;
1165141Sgblack@eecs.umich.edu
1175135Sgblack@eecs.umich.edu#else
1185135Sgblack@eecs.umich.edu
1195135Sgblack@eecs.umich.edu    int page_ptr;
1205135Sgblack@eecs.umich.edu
1215141Sgblack@eecs.umich.edu
1225135Sgblack@eecs.umich.edu#endif // FULL_SYSTEM
1235135Sgblack@eecs.umich.edu
1245141Sgblack@eecs.umich.edu  protected:
1255141Sgblack@eecs.umich.edu
1265141Sgblack@eecs.umich.edu    SimObject::MemoryMode memoryMode;
1275141Sgblack@eecs.umich.edu
1285141Sgblack@eecs.umich.edu#if FULL_SYSTEM
1295141Sgblack@eecs.umich.edu    /**
1305141Sgblack@eecs.umich.edu     * Fix up an address used to match PCs for hooking simulator
1315135Sgblack@eecs.umich.edu     * events on to target function executions.  See comment in
1325135Sgblack@eecs.umich.edu     * system.cc for details.
1335135Sgblack@eecs.umich.edu     */
1345135Sgblack@eecs.umich.edu    virtual Addr fixFuncEventAddr(Addr addr) = 0;
1355141Sgblack@eecs.umich.edu
1365135Sgblack@eecs.umich.edu    /**
1375135Sgblack@eecs.umich.edu     * Add a function-based event to the given function, to be looked
1385135Sgblack@eecs.umich.edu     * up in the specified symbol table.
1395135Sgblack@eecs.umich.edu     */
1405135Sgblack@eecs.umich.edu    template <class T>
1415135Sgblack@eecs.umich.edu    T *addFuncEvent(SymbolTable *symtab, const char *lbl)
1425135Sgblack@eecs.umich.edu    {
1435135Sgblack@eecs.umich.edu        Addr addr = 0; // initialize only to avoid compiler warning
1445135Sgblack@eecs.umich.edu
1455135Sgblack@eecs.umich.edu        if (symtab->findAddress(lbl, addr)) {
1465135Sgblack@eecs.umich.edu            T *ev = new T(&pcEventQueue, lbl, fixFuncEventAddr(addr));
1475135Sgblack@eecs.umich.edu            return ev;
1485135Sgblack@eecs.umich.edu        }
1495135Sgblack@eecs.umich.edu
1505135Sgblack@eecs.umich.edu        return NULL;
1515135Sgblack@eecs.umich.edu    }
1525135Sgblack@eecs.umich.edu
1535135Sgblack@eecs.umich.edu    /** Add a function-based event to kernel code. */
1545135Sgblack@eecs.umich.edu    template <class T>
1555135Sgblack@eecs.umich.edu    T *addKernelFuncEvent(const char *lbl)
1565135Sgblack@eecs.umich.edu    {
1575135Sgblack@eecs.umich.edu        return addFuncEvent<T>(kernelSymtab, lbl);
1585135Sgblack@eecs.umich.edu    }
1595135Sgblack@eecs.umich.edu
1605135Sgblack@eecs.umich.edu#endif
1615135Sgblack@eecs.umich.edu  public:
1625135Sgblack@eecs.umich.edu#if FULL_SYSTEM
1635135Sgblack@eecs.umich.edu    std::vector<TheISA::RemoteGDB *> remoteGDB;
1645141Sgblack@eecs.umich.edu    std::vector<GDBListener *> gdbListen;
1655141Sgblack@eecs.umich.edu    virtual bool breakpoint() = 0;
1665141Sgblack@eecs.umich.edu#endif // FULL_SYSTEM
1675141Sgblack@eecs.umich.edu
1685141Sgblack@eecs.umich.edu  public:
1695141Sgblack@eecs.umich.edu    struct Params
1705141Sgblack@eecs.umich.edu    {
1715141Sgblack@eecs.umich.edu        std::string name;
1725141Sgblack@eecs.umich.edu        PhysicalMemory *physmem;
1735182Sgblack@eecs.umich.edu        SimObject::MemoryMode mem_mode;
1745141Sgblack@eecs.umich.edu
1755141Sgblack@eecs.umich.edu#if FULL_SYSTEM
1765141Sgblack@eecs.umich.edu        Tick boot_cpu_frequency;
1775141Sgblack@eecs.umich.edu        std::string boot_osflags;
1785141Sgblack@eecs.umich.edu        uint64_t init_param;
1795141Sgblack@eecs.umich.edu
1805135Sgblack@eecs.umich.edu        std::string kernel_path;
1815141Sgblack@eecs.umich.edu        std::string readfile;
1825141Sgblack@eecs.umich.edu        std::string symbolfile;
1835141Sgblack@eecs.umich.edu#endif
1845141Sgblack@eecs.umich.edu    };
1855141Sgblack@eecs.umich.edu
1865141Sgblack@eecs.umich.edu  protected:
1875141Sgblack@eecs.umich.edu    Params *_params;
1885141Sgblack@eecs.umich.edu
1895141Sgblack@eecs.umich.edu  public:
1905141Sgblack@eecs.umich.edu    System(Params *p);
1915141Sgblack@eecs.umich.edu    ~System();
1925141Sgblack@eecs.umich.edu
1935135Sgblack@eecs.umich.edu    void startup();
1945135Sgblack@eecs.umich.edu
1955135Sgblack@eecs.umich.edu    const Params *params() const { return (const Params *)_params; }
1965135Sgblack@eecs.umich.edu
1975135Sgblack@eecs.umich.edu  public:
1985135Sgblack@eecs.umich.edu
1995135Sgblack@eecs.umich.edu#if FULL_SYSTEM
2005135Sgblack@eecs.umich.edu    /**
2015135Sgblack@eecs.umich.edu     * Returns the addess the kernel starts at.
2025141Sgblack@eecs.umich.edu     * @return address the kernel starts at
2035141Sgblack@eecs.umich.edu     */
2045135Sgblack@eecs.umich.edu    Addr getKernelStart() const { return kernelStart; }
2055141Sgblack@eecs.umich.edu
2065141Sgblack@eecs.umich.edu    /**
2075141Sgblack@eecs.umich.edu     * Returns the addess the kernel ends at.
2085141Sgblack@eecs.umich.edu     * @return address the kernel ends at
2095135Sgblack@eecs.umich.edu     */
2105141Sgblack@eecs.umich.edu    Addr getKernelEnd() const { return kernelEnd; }
2115141Sgblack@eecs.umich.edu
2125141Sgblack@eecs.umich.edu    /**
2135141Sgblack@eecs.umich.edu     * Returns the addess the entry point to the kernel code.
2145141Sgblack@eecs.umich.edu     * @return entry point of the kernel code
2155141Sgblack@eecs.umich.edu     */
2165141Sgblack@eecs.umich.edu    Addr getKernelEntry() const { return kernelEntry; }
2175141Sgblack@eecs.umich.edu
2185141Sgblack@eecs.umich.edu#else
2195141Sgblack@eecs.umich.edu
2205141Sgblack@eecs.umich.edu    Addr new_page();
2215141Sgblack@eecs.umich.edu
2225141Sgblack@eecs.umich.edu#endif // FULL_SYSTEM
2235141Sgblack@eecs.umich.edu
2245141Sgblack@eecs.umich.edu    int registerThreadContext(ThreadContext *tc, int tcIndex);
2255141Sgblack@eecs.umich.edu    void replaceThreadContext(ThreadContext *tc, int tcIndex);
2265141Sgblack@eecs.umich.edu
2275141Sgblack@eecs.umich.edu    void serialize(std::ostream &os);
2285141Sgblack@eecs.umich.edu    void unserialize(Checkpoint *cp, const std::string &section);
2295141Sgblack@eecs.umich.edu
2305141Sgblack@eecs.umich.edu  public:
2315141Sgblack@eecs.umich.edu    ////////////////////////////////////////////
2325141Sgblack@eecs.umich.edu    //
2335141Sgblack@eecs.umich.edu    // STATIC GLOBAL SYSTEM LIST
2345141Sgblack@eecs.umich.edu    //
2355141Sgblack@eecs.umich.edu    ////////////////////////////////////////////
2365141Sgblack@eecs.umich.edu
2375141Sgblack@eecs.umich.edu    static std::vector<System *> systemList;
2385141Sgblack@eecs.umich.edu    static int numSystemsRunning;
2395141Sgblack@eecs.umich.edu
2405135Sgblack@eecs.umich.edu    static void printSystems();
2415135Sgblack@eecs.umich.edu
2425135Sgblack@eecs.umich.edu
2435135Sgblack@eecs.umich.edu};
2445135Sgblack@eecs.umich.edu
2455135Sgblack@eecs.umich.edu#endif // __SYSTEM_HH__
2465141Sgblack@eecs.umich.edu