system.hh revision 2158
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 *
57087Snate@binkert.org * Redistribution and use in source and binary forms, with or without
67087Snate@binkert.org * modification, are permitted provided that the following conditions are
77087Snate@binkert.org * met: redistributions of source code must retain the above copyright
87087Snate@binkert.org * notice, this list of conditions and the following disclaimer;
97087Snate@binkert.org * redistributions in binary form must reproduce the above copyright
107087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the
117087Snate@binkert.org * documentation and/or other materials provided with the distribution;
127087Snate@binkert.org * 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
147087Snate@binkert.org * this software without specific prior written permission.
157087Snate@binkert.org *
167087Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
177087Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
187087Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
197087Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
207087Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
217087Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225086Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
237087Snate@binkert.org * 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
295086Sgblack@eecs.umich.edu#ifndef __SYSTEM_HH__
305086Sgblack@eecs.umich.edu#define __SYSTEM_HH__
315086Sgblack@eecs.umich.edu
325086Sgblack@eecs.umich.edu#include <string>
335086Sgblack@eecs.umich.edu#include <vector>
345086Sgblack@eecs.umich.edu
355086Sgblack@eecs.umich.edu#include "base/statistics.hh"
365086Sgblack@eecs.umich.edu#include "base/loader/symtab.hh"
375086Sgblack@eecs.umich.edu#include "cpu/pc_event.hh"
385086Sgblack@eecs.umich.edu#include "kern/system_events.hh"
395086Sgblack@eecs.umich.edu#include "sim/sim_object.hh"
405647Sgblack@eecs.umich.edu
415647Sgblack@eecs.umich.educlass BaseCPU;
425647Sgblack@eecs.umich.educlass ExecContext;
435647Sgblack@eecs.umich.educlass GDBListener;
445647Sgblack@eecs.umich.educlass MemoryController;
457629Sgblack@eecs.umich.educlass ObjectFile;
467629Sgblack@eecs.umich.educlass PhysicalMemory;
477629Sgblack@eecs.umich.educlass Platform;
485086Sgblack@eecs.umich.educlass RemoteGDB;
495135Sgblack@eecs.umich.edunamespace Kernel { class Binning; }
505647Sgblack@eecs.umich.edu
515234Sgblack@eecs.umich.educlass System : public SimObject
525086Sgblack@eecs.umich.edu{
535086Sgblack@eecs.umich.edu  public:
545086Sgblack@eecs.umich.edu    MemoryController *memctrl;
557707Sgblack@eecs.umich.edu    PhysicalMemory *physmem;
567707Sgblack@eecs.umich.edu    Platform *platform;
577707Sgblack@eecs.umich.edu    PCEventQueue pcEventQueue;
585086Sgblack@eecs.umich.edu    uint64_t init_param;
595086Sgblack@eecs.umich.edu
605086Sgblack@eecs.umich.edu    std::vector<ExecContext *> execContexts;
615086Sgblack@eecs.umich.edu    int numcpus;
625086Sgblack@eecs.umich.edu
635086Sgblack@eecs.umich.edu    int getNumCPUs()
645086Sgblack@eecs.umich.edu    {
655135Sgblack@eecs.umich.edu        if (numcpus != execContexts.size())
665135Sgblack@eecs.umich.edu            panic("cpu array not fully populated!");
675135Sgblack@eecs.umich.edu
685135Sgblack@eecs.umich.edu        return numcpus;
696048Sgblack@eecs.umich.edu    }
706048Sgblack@eecs.umich.edu
716048Sgblack@eecs.umich.edu    /** kernel symbol table */
726048Sgblack@eecs.umich.edu    SymbolTable *kernelSymtab;
736048Sgblack@eecs.umich.edu
746048Sgblack@eecs.umich.edu    /** Object pointer for the kernel code */
757720Sgblack@eecs.umich.edu    ObjectFile *kernel;
767720Sgblack@eecs.umich.edu
777720Sgblack@eecs.umich.edu    /** Begining of kernel code */
787720Sgblack@eecs.umich.edu    Addr kernelStart;
795135Sgblack@eecs.umich.edu
805135Sgblack@eecs.umich.edu    /** End of kernel code */
815135Sgblack@eecs.umich.edu    Addr kernelEnd;
825135Sgblack@eecs.umich.edu
835135Sgblack@eecs.umich.edu    /** Entry point in the kernel to start at */
845135Sgblack@eecs.umich.edu    Addr kernelEntry;
855135Sgblack@eecs.umich.edu
865135Sgblack@eecs.umich.edu    Kernel::Binning *kernelBinning;
875135Sgblack@eecs.umich.edu
885135Sgblack@eecs.umich.edu  protected:
895135Sgblack@eecs.umich.edu
905135Sgblack@eecs.umich.edu    /**
915135Sgblack@eecs.umich.edu     * Fix up an address used to match PCs for hooking simulator
925135Sgblack@eecs.umich.edu     * events on to target function executions.  See comment in
935135Sgblack@eecs.umich.edu     * system.cc for details.
945135Sgblack@eecs.umich.edu     */
955135Sgblack@eecs.umich.edu    virtual Addr fixFuncEventAddr(Addr addr) = 0;
965264Sgblack@eecs.umich.edu
975135Sgblack@eecs.umich.edu    /**
985135Sgblack@eecs.umich.edu     * Add a function-based event to the given function, to be looked
995135Sgblack@eecs.umich.edu     * up in the specified symbol table.
1005135Sgblack@eecs.umich.edu     */
1015141Sgblack@eecs.umich.edu    template <class T>
1025141Sgblack@eecs.umich.edu    T *System::addFuncEvent(SymbolTable *symtab, const char *lbl)
1035141Sgblack@eecs.umich.edu    {
1045141Sgblack@eecs.umich.edu        Addr addr = 0; // initialize only to avoid compiler warning
1055141Sgblack@eecs.umich.edu
1065141Sgblack@eecs.umich.edu        if (symtab->findAddress(lbl, addr)) {
1075141Sgblack@eecs.umich.edu            T *ev = new T(&pcEventQueue, lbl, fixFuncEventAddr(addr));
1085141Sgblack@eecs.umich.edu            return ev;
1095141Sgblack@eecs.umich.edu        }
1105182Sgblack@eecs.umich.edu
1115141Sgblack@eecs.umich.edu        return NULL;
1125141Sgblack@eecs.umich.edu    }
1135141Sgblack@eecs.umich.edu
1145141Sgblack@eecs.umich.edu    /** Add a function-based event to kernel code. */
1155141Sgblack@eecs.umich.edu    template <class T>
1165141Sgblack@eecs.umich.edu    T *System::addKernelFuncEvent(const char *lbl)
1175135Sgblack@eecs.umich.edu    {
1185141Sgblack@eecs.umich.edu        return addFuncEvent<T>(kernelSymtab, lbl);
1195141Sgblack@eecs.umich.edu    }
1205141Sgblack@eecs.umich.edu
1215141Sgblack@eecs.umich.edu  public:
1225141Sgblack@eecs.umich.edu    std::vector<RemoteGDB *> remoteGDB;
1235141Sgblack@eecs.umich.edu    std::vector<GDBListener *> gdbListen;
1245141Sgblack@eecs.umich.edu    virtual bool breakpoint() = 0;
1255141Sgblack@eecs.umich.edu
1265141Sgblack@eecs.umich.edu  public:
1275141Sgblack@eecs.umich.edu    struct Params
1285141Sgblack@eecs.umich.edu    {
1295141Sgblack@eecs.umich.edu        std::string name;
1305135Sgblack@eecs.umich.edu        Tick boot_cpu_frequency;
1315141Sgblack@eecs.umich.edu        MemoryController *memctrl;
1325141Sgblack@eecs.umich.edu        PhysicalMemory *physmem;
1335135Sgblack@eecs.umich.edu        uint64_t init_param;
1345141Sgblack@eecs.umich.edu        bool bin;
1355141Sgblack@eecs.umich.edu        std::vector<std::string> binned_fns;
1365141Sgblack@eecs.umich.edu        bool bin_int;
1375141Sgblack@eecs.umich.edu
1385135Sgblack@eecs.umich.edu        std::string kernel_path;
1395141Sgblack@eecs.umich.edu        std::string readfile;
1405141Sgblack@eecs.umich.edu    };
1415141Sgblack@eecs.umich.edu
1425141Sgblack@eecs.umich.edu  protected:
1435141Sgblack@eecs.umich.edu    Params *_params;
1445141Sgblack@eecs.umich.edu
1455141Sgblack@eecs.umich.edu  public:
1465141Sgblack@eecs.umich.edu    System(Params *p);
1475141Sgblack@eecs.umich.edu    ~System();
1485141Sgblack@eecs.umich.edu
1495141Sgblack@eecs.umich.edu    void startup();
1505141Sgblack@eecs.umich.edu
1515264Sgblack@eecs.umich.edu    const Params *params() const { return (const Params *)_params; }
1525141Sgblack@eecs.umich.edu
1535141Sgblack@eecs.umich.edu  public:
1545141Sgblack@eecs.umich.edu    /**
1555141Sgblack@eecs.umich.edu     * Returns the addess the kernel starts at.
1565141Sgblack@eecs.umich.edu     * @return address the kernel starts at
1575141Sgblack@eecs.umich.edu     */
1585141Sgblack@eecs.umich.edu    Addr getKernelStart() const { return kernelStart; }
1595141Sgblack@eecs.umich.edu
1605141Sgblack@eecs.umich.edu    /**
1615141Sgblack@eecs.umich.edu     * Returns the addess the kernel ends at.
1625141Sgblack@eecs.umich.edu     * @return address the kernel ends at
1635141Sgblack@eecs.umich.edu     */
1645141Sgblack@eecs.umich.edu    Addr getKernelEnd() const { return kernelEnd; }
1655141Sgblack@eecs.umich.edu
1665141Sgblack@eecs.umich.edu    /**
1675141Sgblack@eecs.umich.edu     * Returns the addess the entry point to the kernel code.
1685141Sgblack@eecs.umich.edu     * @return entry point of the kernel code
1695135Sgblack@eecs.umich.edu     */
1705135Sgblack@eecs.umich.edu    Addr getKernelEntry() const { return kernelEntry; }
1715135Sgblack@eecs.umich.edu
1725360Sgblack@eecs.umich.edu    int registerExecContext(ExecContext *xc, int xcIndex);
1735360Sgblack@eecs.umich.edu    void replaceExecContext(ExecContext *xc, int xcIndex);
1745360Sgblack@eecs.umich.edu
1755360Sgblack@eecs.umich.edu    void regStats();
1765360Sgblack@eecs.umich.edu    void serialize(std::ostream &os);
1775360Sgblack@eecs.umich.edu    void unserialize(Checkpoint *cp, const std::string &section);
1785647Sgblack@eecs.umich.edu
1795647Sgblack@eecs.umich.edu  public:
1805647Sgblack@eecs.umich.edu    ////////////////////////////////////////////
1815360Sgblack@eecs.umich.edu    //
1825647Sgblack@eecs.umich.edu    // STATIC GLOBAL SYSTEM LIST
1835647Sgblack@eecs.umich.edu    //
1845647Sgblack@eecs.umich.edu    ////////////////////////////////////////////
1855648Sgblack@eecs.umich.edu
1865648Sgblack@eecs.umich.edu    static std::vector<System *> systemList;
1875360Sgblack@eecs.umich.edu    static int numSystemsRunning;
1885141Sgblack@eecs.umich.edu
1895141Sgblack@eecs.umich.edu    static void printSystems();
1905141Sgblack@eecs.umich.edu
1915141Sgblack@eecs.umich.edu
1925141Sgblack@eecs.umich.edu};
1935141Sgblack@eecs.umich.edu
1945135Sgblack@eecs.umich.edu#endif // __SYSTEM_HH__
1955135Sgblack@eecs.umich.edu