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