system.cc revision 860
12207SN/A/*
22207SN/A * Copyright (c) 2003 The Regents of The University of Michigan
32207SN/A * All rights reserved.
42207SN/A *
52207SN/A * Redistribution and use in source and binary forms, with or without
62207SN/A * modification, are permitted provided that the following conditions are
72207SN/A * met: redistributions of source code must retain the above copyright
82207SN/A * notice, this list of conditions and the following disclaimer;
92207SN/A * redistributions in binary form must reproduce the above copyright
102207SN/A * notice, this list of conditions and the following disclaimer in the
112207SN/A * documentation and/or other materials provided with the distribution;
122207SN/A * neither the name of the copyright holders nor the names of its
132207SN/A * contributors may be used to endorse or promote products derived from
142207SN/A * this software without specific prior written permission.
152207SN/A *
162207SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172207SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182207SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192207SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202207SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212207SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222207SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232207SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242207SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252207SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262207SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272665Ssaidi@eecs.umich.edu */
282665Ssaidi@eecs.umich.edu
292665Ssaidi@eecs.umich.edu#include "base/loader/aout_object.hh"
302207SN/A#include "base/loader/elf_object.hh"
312207SN/A#include "base/loader/object_file.hh"
323589Sgblack@eecs.umich.edu#include "base/loader/symtab.hh"
334111Sgblack@eecs.umich.edu#include "base/remote_gdb.hh"
342474SN/A#include "base/trace.hh"
352207SN/A#include "cpu/exec_context.hh"
363760Sgblack@eecs.umich.edu#include "cpu/base_cpu.hh"
372454SN/A#include "kern/linux/linux_events.hh"
382976Sgblack@eecs.umich.edu#include "kern/linux/linux_system.hh"
392454SN/A#include "mem/functional_mem/memory_control.hh"
402680Sktlim@umich.edu#include "mem/functional_mem/physical_memory.hh"
412561SN/A#include "sim/builder.hh"
424434Ssaidi@eecs.umich.edu#include "dev/platform.hh"
432561SN/A#include "targetarch/isa_traits.hh"
442474SN/A#include "targetarch/vtophys.hh"
452207SN/A
462458SN/Aextern SymbolTable *debugSymbolTable;
472474SN/A
482458SN/A//un-comment this to see the state of call stack when it changes.
492207SN/A//#define SW_DEBUG
505154Sgblack@eecs.umich.edu
515285Sgblack@eecs.umich.eduusing namespace std;
525285Sgblack@eecs.umich.edu
532474SN/ALinuxSystem::LinuxSystem(const string _name, const uint64_t _init_param,
542474SN/A                         MemoryController *_memCtrl, PhysicalMemory *_physmem,
552474SN/A                         const string &kernel_path, const string &console_path,
562474SN/A                         const string &palcode, const string &boot_osflags,
572474SN/A                         const string &bootloader_path, const bool _bin)
582474SN/A     : System(_name, _init_param, _memCtrl, _physmem, _bin), bin(_bin)
592474SN/A{
602474SN/A    kernelSymtab = new SymbolTable;
613415Sgblack@eecs.umich.edu    consoleSymtab = new SymbolTable;
623415Sgblack@eecs.umich.edu    bootloaderSymtab = new SymbolTable;
633415Sgblack@eecs.umich.edu
643415Sgblack@eecs.umich.edu    ObjectFile *kernel = createObjectFile(kernel_path);
652474SN/A    if (kernel == NULL)
662474SN/A        fatal("Could not load kernel file %s", kernel_path);
674111Sgblack@eecs.umich.edu
684111Sgblack@eecs.umich.edu    ObjectFile *console = createObjectFile(console_path);
694111Sgblack@eecs.umich.edu    if (console == NULL)
704111Sgblack@eecs.umich.edu        fatal("Could not load console file %s", console_path);
715128Sgblack@eecs.umich.edu
725128Sgblack@eecs.umich.edu    ObjectFile *bootloader = createObjectFile(bootloader_path);
735128Sgblack@eecs.umich.edu    if (bootloader == NULL)
745128Sgblack@eecs.umich.edu        fatal("Could not load bootloader file %s", bootloader_path);
755128Sgblack@eecs.umich.edu
765128Sgblack@eecs.umich.edu    if (!kernel->loadGlobalSymbols(kernelSymtab))
775128Sgblack@eecs.umich.edu        panic("could not load kernel symbols\n");
784111Sgblack@eecs.umich.edu    debugSymbolTable = kernelSymtab;
795128Sgblack@eecs.umich.edu
805128Sgblack@eecs.umich.edu    if (!kernel->loadLocalSymbols(kernelSymtab))
815128Sgblack@eecs.umich.edu        panic("could not load kernel local symbols\n");
825128Sgblack@eecs.umich.edu
835128Sgblack@eecs.umich.edu    if (!console->loadGlobalSymbols(consoleSymtab))
845128Sgblack@eecs.umich.edu        panic("could not load console symbols\n");
855128Sgblack@eecs.umich.edu
865128Sgblack@eecs.umich.edu    if (!bootloader->loadGlobalSymbols(bootloaderSymtab))
875128Sgblack@eecs.umich.edu        panic("could not load bootloader symbols\n");
885128Sgblack@eecs.umich.edu
895128Sgblack@eecs.umich.edu    // Load pal file
905128Sgblack@eecs.umich.edu    ObjectFile *pal = createObjectFile(palcode);
915128Sgblack@eecs.umich.edu    if (pal == NULL)
925128Sgblack@eecs.umich.edu        fatal("Could not load PALcode file %s", palcode);
935128Sgblack@eecs.umich.edu    pal->loadSections(physmem, true);
945128Sgblack@eecs.umich.edu
955128Sgblack@eecs.umich.edu    // Load console file
965128Sgblack@eecs.umich.edu    console->loadSections(physmem, true);
975128Sgblack@eecs.umich.edu
985128Sgblack@eecs.umich.edu    // Load kernel file
995128Sgblack@eecs.umich.edu    kernel->loadSections(physmem, true);
1005128Sgblack@eecs.umich.edu    kernelStart = kernel->textBase();
1015128Sgblack@eecs.umich.edu    kernelEnd = kernel->bssBase() + kernel->bssSize();
1025128Sgblack@eecs.umich.edu    /* FIXME: entrypoint not in kernel, but in bootloader,
1035128Sgblack@eecs.umich.edu       variable should be re-named appropriately */
1044111Sgblack@eecs.umich.edu    kernelEntry = kernel->entryPoint();
1054111Sgblack@eecs.umich.edu
1064111Sgblack@eecs.umich.edu
1074111Sgblack@eecs.umich.edu    DPRINTF(Loader, "Kernel start = %#x\n"
1084111Sgblack@eecs.umich.edu            "Kernel end   = %#x\n"
1094111Sgblack@eecs.umich.edu            "Kernel entry = %#x\n",
1102474SN/A            kernelStart, kernelEnd, kernelEntry);
1115285Sgblack@eecs.umich.edu
1124111Sgblack@eecs.umich.edu    DPRINTF(Loader, "Kernel loaded...\n");
1135285Sgblack@eecs.umich.edu
1144111Sgblack@eecs.umich.edu    // Load bootloader file
1155713Shsul@eecs.umich.edu    bootloader->loadSections(physmem, true);
1164111Sgblack@eecs.umich.edu    kernelEntry = bootloader->entryPoint();
1174111Sgblack@eecs.umich.edu    kernelStart = bootloader->textBase();
1182646Ssaidi@eecs.umich.edu    DPRINTF(Loader, "Bootloader entry at %#x\n", kernelEntry);
1195713Shsul@eecs.umich.edu
1202646Ssaidi@eecs.umich.edu#ifdef DEBUG
1215713Shsul@eecs.umich.edu    kernelPanicEvent = new BreakPCEvent(&pcEventQueue, "kernel panic");
1224997Sgblack@eecs.umich.edu    consolePanicEvent = new BreakPCEvent(&pcEventQueue, "console panic");
1232561SN/A#endif
1242561SN/A
1252561SN/A    badaddrEvent = new LinuxBadAddrEvent(&pcEventQueue, "badaddr");
1262561SN/A    skipPowerStateEvent = new LinuxSkipFuncEvent(&pcEventQueue,
1272561SN/A                                            "tl_v48_capture_power_state");
1285713Shsul@eecs.umich.edu    skipScavengeBootEvent = new LinuxSkipFuncEvent(&pcEventQueue,
1295713Shsul@eecs.umich.edu                                              "pmap_scavenge_boot");
1302561SN/A    printfEvent = new LinuxPrintfEvent(&pcEventQueue, "printf");
1315713Shsul@eecs.umich.edu
1325713Shsul@eecs.umich.edu    skipIdeDelay50msEvent = new LinuxSkipIdeDelay50msEvent(&pcEventQueue,
1332561SN/A                                                     "ide_delay_50ms");
1345713Shsul@eecs.umich.edu
1355713Shsul@eecs.umich.edu    skipDelayLoopEvent = new LinuxSkipDelayLoopEvent(&pcEventQueue,
1362561SN/A                                                     "calibrate_delay");
1375713Shsul@eecs.umich.edu
1385713Shsul@eecs.umich.edu    skipCacheProbeEvent = new LinuxSkipFuncEvent(&pcEventQueue, "determine_cpu_caches");
1392561SN/A
1405713Shsul@eecs.umich.edu   /* debugPrintfEvent = new DebugPrintfEvent(&pcEventQueue,
1413415Sgblack@eecs.umich.edu                                            "debug_printf", false);
1425713Shsul@eecs.umich.edu    debugPrintfrEvent = new DebugPrintfEvent(&pcEventQueue,
1435713Shsul@eecs.umich.edu                                             "debug_printfr", true);
1443415Sgblack@eecs.umich.edu    dumpMbufEvent = new DumpMbufEvent(&pcEventQueue, "dump_mbuf");
1455713Shsul@eecs.umich.edu*/
1463589Sgblack@eecs.umich.edu
1475713Shsul@eecs.umich.edu    Addr addr = 0;
1484997Sgblack@eecs.umich.edu
1494997Sgblack@eecs.umich.edu    if (kernelSymtab->findAddress("est_cycle_freq", addr)) {
1504997Sgblack@eecs.umich.edu        Addr paddr = vtophys(physmem, addr);
1514997Sgblack@eecs.umich.edu        uint8_t *est_cycle_frequency =
1524997Sgblack@eecs.umich.edu            physmem->dma_addr(paddr, sizeof(uint64_t));
1535713Shsul@eecs.umich.edu
1542474SN/A        if (est_cycle_frequency)
1552474SN/A            *(uint64_t *)est_cycle_frequency = ticksPerSecond;
1565285Sgblack@eecs.umich.edu    }
1575285Sgblack@eecs.umich.edu
1582585SN/A    if (kernelSymtab->findAddress("aic7xxx_no_reset", addr)) {
1595285Sgblack@eecs.umich.edu        Addr paddr = vtophys(physmem, addr);
1605285Sgblack@eecs.umich.edu        uint8_t *aic7xxx_no_reset =
1612585SN/A            physmem->dma_addr(paddr, sizeof(uint32_t));
1625285Sgblack@eecs.umich.edu
1635285Sgblack@eecs.umich.edu        if (aic7xxx_no_reset) {
1645713Shsul@eecs.umich.edu            *(uint32_t *)aic7xxx_no_reset = 1;
1655285Sgblack@eecs.umich.edu        }
1665713Shsul@eecs.umich.edu    }
1675285Sgblack@eecs.umich.edu
1685285Sgblack@eecs.umich.edu    if (consoleSymtab->findAddress("env_booted_osflags", addr)) {
1694111Sgblack@eecs.umich.edu        Addr paddr = vtophys(physmem, addr);
1703415Sgblack@eecs.umich.edu        char *osflags = (char *)physmem->dma_addr(paddr, sizeof(uint32_t));
1712561SN/A
1725285Sgblack@eecs.umich.edu        if (osflags)
1732561SN/A            strcpy(osflags, boot_osflags.c_str());
1745285Sgblack@eecs.umich.edu    }
1755285Sgblack@eecs.umich.edu
1765285Sgblack@eecs.umich.edu    if (consoleSymtab->findAddress("xxm_rpb", addr)) {
1775285Sgblack@eecs.umich.edu        Addr paddr = vtophys(physmem, addr);
1785285Sgblack@eecs.umich.edu        char *hwprb = (char *)physmem->dma_addr(paddr, sizeof(uint64_t));
1795713Shsul@eecs.umich.edu
1805285Sgblack@eecs.umich.edu        if (hwprb) {
1815713Shsul@eecs.umich.edu            *(uint64_t*)(hwprb+0x50) = 34;      // Tsunami
1825285Sgblack@eecs.umich.edu            *(uint64_t*)(hwprb+0x58) = (1<<10);
1835285Sgblack@eecs.umich.edu        }
1845285Sgblack@eecs.umich.edu        else
1855285Sgblack@eecs.umich.edu            panic("could not translate hwprb addr to set system type/variation\n");
1865285Sgblack@eecs.umich.edu
1875285Sgblack@eecs.umich.edu    } else
1885285Sgblack@eecs.umich.edu        panic("could not find hwprb to set system type/variation\n");
1895285Sgblack@eecs.umich.edu
1905285Sgblack@eecs.umich.edu#ifdef DEBUG
1915285Sgblack@eecs.umich.edu    if (kernelSymtab->findAddress("panic", addr))
1925771Shsul@eecs.umich.edu        kernelPanicEvent->schedule(addr);
1935285Sgblack@eecs.umich.edu    else
1945285Sgblack@eecs.umich.edu        panic("could not find kernel symbol \'panic\'");
1952474SN/A
1963044Sgblack@eecs.umich.edu    if (consoleSymtab->findAddress("panic", addr))
1973044Sgblack@eecs.umich.edu        consolePanicEvent->schedule(addr);
1983044Sgblack@eecs.umich.edu#endif
1993044Sgblack@eecs.umich.edu
2003044Sgblack@eecs.umich.edu    if (kernelSymtab->findAddress("badaddr", addr))
2013044Sgblack@eecs.umich.edu        badaddrEvent->schedule(addr);
2025285Sgblack@eecs.umich.edu   // else
2035285Sgblack@eecs.umich.edu        //panic("could not find kernel symbol \'badaddr\'");
2045286Sgblack@eecs.umich.edu
2052561SN/A    if (kernelSymtab->findAddress("tl_v48_capture_power_state", addr))
2062561SN/A        skipPowerStateEvent->schedule(addr);
2072561SN/A
2082561SN/A    if (kernelSymtab->findAddress("pmap_scavenge_boot", addr))
2092585SN/A        skipScavengeBootEvent->schedule(addr);
2102585SN/A
2112585SN/A    if (kernelSymtab->findAddress("ide_delay_50ms", addr))
2122585SN/A        skipIdeDelay50msEvent->schedule(addr+8);
2132585SN/A
2142585SN/A    if (kernelSymtab->findAddress("calibrate_delay", addr))
2152585SN/A        skipDelayLoopEvent->schedule(addr+8);
2162585SN/A
2172585SN/A    if (kernelSymtab->findAddress("determine_cpu_caches", addr))
2182585SN/A        skipCacheProbeEvent->schedule(addr+8);
2192585SN/A
2202585SN/A#if TRACING_ON
2212585SN/A    if (kernelSymtab->findAddress("printk", addr))
2222585SN/A        printfEvent->schedule(addr);
2232585SN/A
2242585SN/A    if (kernelSymtab->findAddress("m5printf", addr))
2252585SN/A        debugPrintfEvent->schedule(addr);
2262585SN/A
2272585SN/A    if (kernelSymtab->findAddress("m5printfr", addr))
2282585SN/A        debugPrintfrEvent->schedule(addr);
2292585SN/A
2302976Sgblack@eecs.umich.edu    if (kernelSymtab->findAddress("m5_dump_mbuf", addr))
2312976Sgblack@eecs.umich.edu        dumpMbufEvent->schedule(addr);
2322976Sgblack@eecs.umich.edu#endif
2332976Sgblack@eecs.umich.edu}
2342976Sgblack@eecs.umich.edu
2352976Sgblack@eecs.umich.eduLinuxSystem::~LinuxSystem()
2364793Sgblack@eecs.umich.edu{
2372976Sgblack@eecs.umich.edu    delete kernel;
2384793Sgblack@eecs.umich.edu    delete console;
2392976Sgblack@eecs.umich.edu
2402976Sgblack@eecs.umich.edu    delete kernelSymtab;
2414793Sgblack@eecs.umich.edu    delete consoleSymtab;
2422976Sgblack@eecs.umich.edu    delete bootloaderSymtab;
2432976Sgblack@eecs.umich.edu
2444793Sgblack@eecs.umich.edu    delete kernelPanicEvent;
2452976Sgblack@eecs.umich.edu    delete consolePanicEvent;
2464793Sgblack@eecs.umich.edu    delete badaddrEvent;
2472976Sgblack@eecs.umich.edu    delete skipPowerStateEvent;
2484793Sgblack@eecs.umich.edu    delete skipScavengeBootEvent;
2492976Sgblack@eecs.umich.edu    delete printfEvent;
2502976Sgblack@eecs.umich.edu    /*delete debugPrintfEvent;
2512976Sgblack@eecs.umich.edu    delete debugPrintfrEvent;
2524793Sgblack@eecs.umich.edu    delete dumpMbufEvent;
2532976Sgblack@eecs.umich.edu*/
2544793Sgblack@eecs.umich.edu}
2552976Sgblack@eecs.umich.edu
2564793Sgblack@eecs.umich.eduvoid
2572976Sgblack@eecs.umich.eduLinuxSystem::setDelayLoop(ExecContext *xc)
2584793Sgblack@eecs.umich.edu{
2594793Sgblack@eecs.umich.edu    Addr addr = 0;
2604793Sgblack@eecs.umich.edu    if (kernelSymtab->findAddress("loops_per_jiffy", addr)) {
2614793Sgblack@eecs.umich.edu        Addr paddr = vtophys(physmem, addr);
2622976Sgblack@eecs.umich.edu
2634793Sgblack@eecs.umich.edu        uint8_t *loops_per_jiffy =
2642976Sgblack@eecs.umich.edu            physmem->dma_addr(paddr, sizeof(uint32_t));
2652585SN/A
2662561SN/A        Tick cpuFreq = xc->cpu->getFreq();
2672561SN/A        Tick intrFreq = platform->interrupt_frequency;
2684164Sgblack@eecs.umich.edu        *(uint32_t *)loops_per_jiffy =
2695286Sgblack@eecs.umich.edu            (uint32_t)((cpuFreq / intrFreq) * 0.9988);
2704111Sgblack@eecs.umich.edu    }
2714111Sgblack@eecs.umich.edu}
2724111Sgblack@eecs.umich.edu
2734111Sgblack@eecs.umich.eduint
2744111Sgblack@eecs.umich.eduLinuxSystem::registerExecContext(ExecContext *xc)
2754111Sgblack@eecs.umich.edu{
2764111Sgblack@eecs.umich.edu    int xcIndex = System::registerExecContext(xc);
2774111Sgblack@eecs.umich.edu
2784111Sgblack@eecs.umich.edu    if (xcIndex == 0) {
2794111Sgblack@eecs.umich.edu        // activate with zero delay so that we start ticking right
2804111Sgblack@eecs.umich.edu        // away on cycle 0
2814111Sgblack@eecs.umich.edu        xc->activate(0);
2824111Sgblack@eecs.umich.edu    }
2834111Sgblack@eecs.umich.edu
2845286Sgblack@eecs.umich.edu    RemoteGDB *rgdb = new RemoteGDB(this, xc);
2855286Sgblack@eecs.umich.edu    GDBListener *gdbl = new GDBListener(rgdb, 7000 + xcIndex);
2865286Sgblack@eecs.umich.edu    gdbl->listen();
2875286Sgblack@eecs.umich.edu//    gdbl->accept();
2885286Sgblack@eecs.umich.edu
2895286Sgblack@eecs.umich.edu    if (remoteGDB.size() <= xcIndex) {
2905286Sgblack@eecs.umich.edu        remoteGDB.resize(xcIndex+1);
2914111Sgblack@eecs.umich.edu    }
2925285Sgblack@eecs.umich.edu
2934111Sgblack@eecs.umich.edu    remoteGDB[xcIndex] = rgdb;
2944111Sgblack@eecs.umich.edu
2954111Sgblack@eecs.umich.edu    return xcIndex;
2964111Sgblack@eecs.umich.edu}
2974111Sgblack@eecs.umich.edu
2984111Sgblack@eecs.umich.edu
2994111Sgblack@eecs.umich.eduvoid
3004111Sgblack@eecs.umich.eduLinuxSystem::replaceExecContext(ExecContext *xc, int xcIndex)
3015286Sgblack@eecs.umich.edu{
3025286Sgblack@eecs.umich.edu    System::replaceExecContext(xcIndex, xc);
3034111Sgblack@eecs.umich.edu    remoteGDB[xcIndex]->replaceExecContext(xc);
3044111Sgblack@eecs.umich.edu}
3054111Sgblack@eecs.umich.edu
3064111Sgblack@eecs.umich.edubool
3074111Sgblack@eecs.umich.eduLinuxSystem::breakpoint()
3084111Sgblack@eecs.umich.edu{
3095286Sgblack@eecs.umich.edu    return remoteGDB[0]->trap(ALPHA_KENTRY_IF);
3105286Sgblack@eecs.umich.edu}
3115286Sgblack@eecs.umich.edu
3125286Sgblack@eecs.umich.eduvoid
3135286Sgblack@eecs.umich.eduLinuxSystem::populateMap(std::string callee, std::string caller)
3145286Sgblack@eecs.umich.edu{
3155286Sgblack@eecs.umich.edu    multimap<const string, string>::const_iterator i;
3165286Sgblack@eecs.umich.edu    i = callerMap.insert(make_pair(callee, caller));
3175286Sgblack@eecs.umich.edu    assert(i != callerMap.end() && "should not fail populating callerMap");
3185286Sgblack@eecs.umich.edu}
3194111Sgblack@eecs.umich.edu
3205286Sgblack@eecs.umich.edubool
3214111Sgblack@eecs.umich.eduLinuxSystem::findCaller(std::string callee, std::string caller) const
3224111Sgblack@eecs.umich.edu{
3235285Sgblack@eecs.umich.edu    typedef multimap<const std::string, std::string>::const_iterator iter;
3244111Sgblack@eecs.umich.edu    pair<iter, iter> range;
3254111Sgblack@eecs.umich.edu
3264111Sgblack@eecs.umich.edu    range = callerMap.equal_range(callee);
3274111Sgblack@eecs.umich.edu    for (iter i = range.first; i != range.second; ++i) {
3285286Sgblack@eecs.umich.edu        if ((*i).second == caller)
3295286Sgblack@eecs.umich.edu            return true;
3305286Sgblack@eecs.umich.edu    }
3315286Sgblack@eecs.umich.edu    return false;
3325286Sgblack@eecs.umich.edu}
3335286Sgblack@eecs.umich.edu
3345286Sgblack@eecs.umich.eduvoid
3355286Sgblack@eecs.umich.eduLinuxSystem::dumpState(ExecContext *xc) const
3365286Sgblack@eecs.umich.edu{
3375286Sgblack@eecs.umich.edu#ifndef SW_DEBUG
3385286Sgblack@eecs.umich.edu    return;
3395286Sgblack@eecs.umich.edu#endif
3404111Sgblack@eecs.umich.edu    if (xc->swCtx) {
3415941Sgblack@eecs.umich.edu        stack<fnCall *> copy(xc->swCtx->callStack);
3425941Sgblack@eecs.umich.edu        if (copy.empty())
3435941Sgblack@eecs.umich.edu            return;
3445941Sgblack@eecs.umich.edu        cprintf("xc->swCtx:\n");
3455941Sgblack@eecs.umich.edu        fnCall *top;
3465941Sgblack@eecs.umich.edu        cprintf("||   call: %d\n",xc->swCtx->calls);
3475941Sgblack@eecs.umich.edu        for (top = copy.top(); !copy.empty(); copy.pop() ) {
3485941Sgblack@eecs.umich.edu            top = copy.top();
3495941Sgblack@eecs.umich.edu            cprintf("||  %13s : %s \n", top->name, top->myBin->name());
3505941Sgblack@eecs.umich.edu        }
3515941Sgblack@eecs.umich.edu    }
3525941Sgblack@eecs.umich.edu}
3534111Sgblack@eecs.umich.edu
3545286Sgblack@eecs.umich.eduBEGIN_DECLARE_SIM_OBJECT_PARAMS(LinuxSystem)
3555286Sgblack@eecs.umich.edu
3564111Sgblack@eecs.umich.edu    Param<bool> bin;
3574111Sgblack@eecs.umich.edu    SimObjectParam<MemoryController *> mem_ctl;
3584111Sgblack@eecs.umich.edu    SimObjectParam<PhysicalMemory *> physmem;
3595285Sgblack@eecs.umich.edu    Param<uint64_t> init_param;
3605567Snate@binkert.org
3614111Sgblack@eecs.umich.edu    Param<string> kernel_code;
3625286Sgblack@eecs.umich.edu    Param<string> console_code;
3635286Sgblack@eecs.umich.edu    Param<string> pal_code;
3645286Sgblack@eecs.umich.edu    Param<string> boot_osflags;
3655286Sgblack@eecs.umich.edu    Param<string> bootloader_code;
3664111Sgblack@eecs.umich.edu
3674111Sgblack@eecs.umich.eduEND_DECLARE_SIM_OBJECT_PARAMS(LinuxSystem)
3684111Sgblack@eecs.umich.edu
3694111Sgblack@eecs.umich.eduBEGIN_INIT_SIM_OBJECT_PARAMS(LinuxSystem)
3704111Sgblack@eecs.umich.edu
3714111Sgblack@eecs.umich.edu
3724111Sgblack@eecs.umich.edu    INIT_PARAM_DFLT(bin, "is this system to be binned", false),
3734111Sgblack@eecs.umich.edu    INIT_PARAM(mem_ctl, "memory controller"),
3744111Sgblack@eecs.umich.edu    INIT_PARAM(physmem, "phsyical memory"),
3754111Sgblack@eecs.umich.edu    INIT_PARAM_DFLT(init_param, "numerical value to pass into simulator", 0),
3764111Sgblack@eecs.umich.edu    INIT_PARAM(kernel_code, "file that contains the code"),
3774111Sgblack@eecs.umich.edu    INIT_PARAM(console_code, "file that contains the console code"),
3785285Sgblack@eecs.umich.edu    INIT_PARAM(pal_code, "file that contains palcode"),
3794111Sgblack@eecs.umich.edu    INIT_PARAM_DFLT(boot_osflags, "flags to pass to the kernel during boot",
3805285Sgblack@eecs.umich.edu                                   "a"),
3815286Sgblack@eecs.umich.edu    INIT_PARAM(bootloader_code, "file that contains the bootloader")
3825286Sgblack@eecs.umich.edu
3835286Sgblack@eecs.umich.edu
3845286Sgblack@eecs.umich.eduEND_INIT_SIM_OBJECT_PARAMS(LinuxSystem)
3854111Sgblack@eecs.umich.edu
3864117Sgblack@eecs.umich.eduCREATE_SIM_OBJECT(LinuxSystem)
3874117Sgblack@eecs.umich.edu{
3884111Sgblack@eecs.umich.edu    LinuxSystem *sys = new LinuxSystem(getInstanceName(), init_param, mem_ctl,
3894111Sgblack@eecs.umich.edu                                       physmem, kernel_code, console_code,
3904111Sgblack@eecs.umich.edu                                       pal_code, boot_osflags, bootloader_code, bin);
3915285Sgblack@eecs.umich.edu
3925285Sgblack@eecs.umich.edu    return sys;
3935285Sgblack@eecs.umich.edu}
3944111Sgblack@eecs.umich.edu
3955285Sgblack@eecs.umich.eduREGISTER_SIM_OBJECT("LinuxSystem", LinuxSystem)
3964111Sgblack@eecs.umich.edu