system.cc revision 860
110448Snilay@cs.wisc.edu/* 210448Snilay@cs.wisc.edu * Copyright (c) 2003 The Regents of The University of Michigan 310448Snilay@cs.wisc.edu * All rights reserved. 410448Snilay@cs.wisc.edu * 510448Snilay@cs.wisc.edu * Redistribution and use in source and binary forms, with or without 610448Snilay@cs.wisc.edu * modification, are permitted provided that the following conditions are 710448Snilay@cs.wisc.edu * met: redistributions of source code must retain the above copyright 810448Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer; 910448Snilay@cs.wisc.edu * redistributions in binary form must reproduce the above copyright 1010448Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer in the 1110448Snilay@cs.wisc.edu * documentation and/or other materials provided with the distribution; 1210448Snilay@cs.wisc.edu * neither the name of the copyright holders nor the names of its 1310448Snilay@cs.wisc.edu * contributors may be used to endorse or promote products derived from 1410448Snilay@cs.wisc.edu * this software without specific prior written permission. 1510448Snilay@cs.wisc.edu * 1610448Snilay@cs.wisc.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1710448Snilay@cs.wisc.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1810448Snilay@cs.wisc.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1910448Snilay@cs.wisc.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2010448Snilay@cs.wisc.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2110448Snilay@cs.wisc.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2210447Snilay@cs.wisc.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2310447Snilay@cs.wisc.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2410447Snilay@cs.wisc.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2510447Snilay@cs.wisc.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2610447Snilay@cs.wisc.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2710447Snilay@cs.wisc.edu */ 2810447Snilay@cs.wisc.edu 2910447Snilay@cs.wisc.edu#include "base/loader/aout_object.hh" 3010447Snilay@cs.wisc.edu#include "base/loader/elf_object.hh" 3110447Snilay@cs.wisc.edu#include "base/loader/object_file.hh" 3210447Snilay@cs.wisc.edu#include "base/loader/symtab.hh" 3310447Snilay@cs.wisc.edu#include "base/remote_gdb.hh" 3410447Snilay@cs.wisc.edu#include "base/trace.hh" 3510447Snilay@cs.wisc.edu#include "cpu/exec_context.hh" 3610447Snilay@cs.wisc.edu#include "cpu/base_cpu.hh" 3710447Snilay@cs.wisc.edu#include "kern/linux/linux_events.hh" 3810447Snilay@cs.wisc.edu#include "kern/linux/linux_system.hh" 3910447Snilay@cs.wisc.edu#include "mem/functional_mem/memory_control.hh" 4010447Snilay@cs.wisc.edu#include "mem/functional_mem/physical_memory.hh" 4110447Snilay@cs.wisc.edu#include "sim/builder.hh" 4210447Snilay@cs.wisc.edu#include "dev/platform.hh" 4310447Snilay@cs.wisc.edu#include "targetarch/isa_traits.hh" 4410447Snilay@cs.wisc.edu#include "targetarch/vtophys.hh" 4510447Snilay@cs.wisc.edu 4610447Snilay@cs.wisc.eduextern SymbolTable *debugSymbolTable; 4710447Snilay@cs.wisc.edu 4810447Snilay@cs.wisc.edu//un-comment this to see the state of call stack when it changes. 4910447Snilay@cs.wisc.edu//#define SW_DEBUG 5010447Snilay@cs.wisc.edu 5110447Snilay@cs.wisc.eduusing namespace std; 5210447Snilay@cs.wisc.edu 5310447Snilay@cs.wisc.eduLinuxSystem::LinuxSystem(const string _name, const uint64_t _init_param, 5410447Snilay@cs.wisc.edu MemoryController *_memCtrl, PhysicalMemory *_physmem, 5510447Snilay@cs.wisc.edu const string &kernel_path, const string &console_path, 5610447Snilay@cs.wisc.edu const string &palcode, const string &boot_osflags, 5710447Snilay@cs.wisc.edu const string &bootloader_path, const bool _bin) 5810447Snilay@cs.wisc.edu : System(_name, _init_param, _memCtrl, _physmem, _bin), bin(_bin) 5910447Snilay@cs.wisc.edu{ 6010447Snilay@cs.wisc.edu kernelSymtab = new SymbolTable; 6110447Snilay@cs.wisc.edu consoleSymtab = new SymbolTable; 6210447Snilay@cs.wisc.edu bootloaderSymtab = new SymbolTable; 6310447Snilay@cs.wisc.edu 6410447Snilay@cs.wisc.edu ObjectFile *kernel = createObjectFile(kernel_path); 6510447Snilay@cs.wisc.edu if (kernel == NULL) 6610447Snilay@cs.wisc.edu fatal("Could not load kernel file %s", kernel_path); 6710447Snilay@cs.wisc.edu 6810447Snilay@cs.wisc.edu ObjectFile *console = createObjectFile(console_path); 6910447Snilay@cs.wisc.edu if (console == NULL) 7010447Snilay@cs.wisc.edu fatal("Could not load console file %s", console_path); 7110447Snilay@cs.wisc.edu 7210447Snilay@cs.wisc.edu ObjectFile *bootloader = createObjectFile(bootloader_path); 7310447Snilay@cs.wisc.edu if (bootloader == NULL) 7410447Snilay@cs.wisc.edu fatal("Could not load bootloader file %s", bootloader_path); 7510447Snilay@cs.wisc.edu 7610447Snilay@cs.wisc.edu if (!kernel->loadGlobalSymbols(kernelSymtab)) 7710447Snilay@cs.wisc.edu panic("could not load kernel symbols\n"); 7810447Snilay@cs.wisc.edu debugSymbolTable = kernelSymtab; 7910447Snilay@cs.wisc.edu 8010447Snilay@cs.wisc.edu if (!kernel->loadLocalSymbols(kernelSymtab)) 8110447Snilay@cs.wisc.edu panic("could not load kernel local symbols\n"); 8210447Snilay@cs.wisc.edu 8310447Snilay@cs.wisc.edu if (!console->loadGlobalSymbols(consoleSymtab)) 8410447Snilay@cs.wisc.edu panic("could not load console symbols\n"); 8510447Snilay@cs.wisc.edu 8610447Snilay@cs.wisc.edu if (!bootloader->loadGlobalSymbols(bootloaderSymtab)) 8710447Snilay@cs.wisc.edu panic("could not load bootloader symbols\n"); 8810447Snilay@cs.wisc.edu 8910447Snilay@cs.wisc.edu // Load pal file 9010447Snilay@cs.wisc.edu ObjectFile *pal = createObjectFile(palcode); 9110447Snilay@cs.wisc.edu if (pal == NULL) 9210447Snilay@cs.wisc.edu fatal("Could not load PALcode file %s", palcode); 9310447Snilay@cs.wisc.edu pal->loadSections(physmem, true); 9410447Snilay@cs.wisc.edu 9510447Snilay@cs.wisc.edu // Load console file 9610447Snilay@cs.wisc.edu console->loadSections(physmem, true); 9710447Snilay@cs.wisc.edu 9810447Snilay@cs.wisc.edu // Load kernel file 9910447Snilay@cs.wisc.edu kernel->loadSections(physmem, true); 10010447Snilay@cs.wisc.edu kernelStart = kernel->textBase(); 10110447Snilay@cs.wisc.edu kernelEnd = kernel->bssBase() + kernel->bssSize(); 10210447Snilay@cs.wisc.edu /* FIXME: entrypoint not in kernel, but in bootloader, 10310447Snilay@cs.wisc.edu variable should be re-named appropriately */ 10410447Snilay@cs.wisc.edu kernelEntry = kernel->entryPoint(); 10510447Snilay@cs.wisc.edu 10610447Snilay@cs.wisc.edu 10710447Snilay@cs.wisc.edu DPRINTF(Loader, "Kernel start = %#x\n" 10810447Snilay@cs.wisc.edu "Kernel end = %#x\n" 10910447Snilay@cs.wisc.edu "Kernel entry = %#x\n", 11010447Snilay@cs.wisc.edu kernelStart, kernelEnd, kernelEntry); 11110447Snilay@cs.wisc.edu 11210447Snilay@cs.wisc.edu DPRINTF(Loader, "Kernel loaded...\n"); 11310447Snilay@cs.wisc.edu 11410447Snilay@cs.wisc.edu // Load bootloader file 11510447Snilay@cs.wisc.edu bootloader->loadSections(physmem, true); 11610447Snilay@cs.wisc.edu kernelEntry = bootloader->entryPoint(); 11710447Snilay@cs.wisc.edu kernelStart = bootloader->textBase(); 11810447Snilay@cs.wisc.edu DPRINTF(Loader, "Bootloader entry at %#x\n", kernelEntry); 11910447Snilay@cs.wisc.edu 12010447Snilay@cs.wisc.edu#ifdef DEBUG 12110447Snilay@cs.wisc.edu kernelPanicEvent = new BreakPCEvent(&pcEventQueue, "kernel panic"); 12210447Snilay@cs.wisc.edu consolePanicEvent = new BreakPCEvent(&pcEventQueue, "console panic"); 12310447Snilay@cs.wisc.edu#endif 12410447Snilay@cs.wisc.edu 12510447Snilay@cs.wisc.edu badaddrEvent = new LinuxBadAddrEvent(&pcEventQueue, "badaddr"); 12610447Snilay@cs.wisc.edu skipPowerStateEvent = new LinuxSkipFuncEvent(&pcEventQueue, 12710447Snilay@cs.wisc.edu "tl_v48_capture_power_state"); 12810447Snilay@cs.wisc.edu skipScavengeBootEvent = new LinuxSkipFuncEvent(&pcEventQueue, 12910447Snilay@cs.wisc.edu "pmap_scavenge_boot"); 13010447Snilay@cs.wisc.edu printfEvent = new LinuxPrintfEvent(&pcEventQueue, "printf"); 13110447Snilay@cs.wisc.edu 13210447Snilay@cs.wisc.edu skipIdeDelay50msEvent = new LinuxSkipIdeDelay50msEvent(&pcEventQueue, 13310447Snilay@cs.wisc.edu "ide_delay_50ms"); 13410447Snilay@cs.wisc.edu 13510447Snilay@cs.wisc.edu skipDelayLoopEvent = new LinuxSkipDelayLoopEvent(&pcEventQueue, 13610447Snilay@cs.wisc.edu "calibrate_delay"); 13710447Snilay@cs.wisc.edu 13810447Snilay@cs.wisc.edu skipCacheProbeEvent = new LinuxSkipFuncEvent(&pcEventQueue, "determine_cpu_caches"); 13910447Snilay@cs.wisc.edu 14010447Snilay@cs.wisc.edu /* debugPrintfEvent = new DebugPrintfEvent(&pcEventQueue, 14110447Snilay@cs.wisc.edu "debug_printf", false); 14210447Snilay@cs.wisc.edu debugPrintfrEvent = new DebugPrintfEvent(&pcEventQueue, 14310447Snilay@cs.wisc.edu "debug_printfr", true); 14410447Snilay@cs.wisc.edu dumpMbufEvent = new DumpMbufEvent(&pcEventQueue, "dump_mbuf"); 14510447Snilay@cs.wisc.edu*/ 14610447Snilay@cs.wisc.edu 14710447Snilay@cs.wisc.edu Addr addr = 0; 14810447Snilay@cs.wisc.edu 14910447Snilay@cs.wisc.edu if (kernelSymtab->findAddress("est_cycle_freq", addr)) { 15010447Snilay@cs.wisc.edu Addr paddr = vtophys(physmem, addr); 15110447Snilay@cs.wisc.edu uint8_t *est_cycle_frequency = 15210447Snilay@cs.wisc.edu physmem->dma_addr(paddr, sizeof(uint64_t)); 15310447Snilay@cs.wisc.edu 15410447Snilay@cs.wisc.edu if (est_cycle_frequency) 15510447Snilay@cs.wisc.edu *(uint64_t *)est_cycle_frequency = ticksPerSecond; 15610447Snilay@cs.wisc.edu } 15710447Snilay@cs.wisc.edu 15810447Snilay@cs.wisc.edu if (kernelSymtab->findAddress("aic7xxx_no_reset", addr)) { 15910447Snilay@cs.wisc.edu Addr paddr = vtophys(physmem, addr); 16010447Snilay@cs.wisc.edu uint8_t *aic7xxx_no_reset = 16110447Snilay@cs.wisc.edu physmem->dma_addr(paddr, sizeof(uint32_t)); 16210447Snilay@cs.wisc.edu 16310447Snilay@cs.wisc.edu if (aic7xxx_no_reset) { 16410447Snilay@cs.wisc.edu *(uint32_t *)aic7xxx_no_reset = 1; 16510447Snilay@cs.wisc.edu } 16610447Snilay@cs.wisc.edu } 16710447Snilay@cs.wisc.edu 16810447Snilay@cs.wisc.edu if (consoleSymtab->findAddress("env_booted_osflags", addr)) { 16910447Snilay@cs.wisc.edu Addr paddr = vtophys(physmem, addr); 17010447Snilay@cs.wisc.edu char *osflags = (char *)physmem->dma_addr(paddr, sizeof(uint32_t)); 17110447Snilay@cs.wisc.edu 17210447Snilay@cs.wisc.edu if (osflags) 17310447Snilay@cs.wisc.edu strcpy(osflags, boot_osflags.c_str()); 17410447Snilay@cs.wisc.edu } 17510447Snilay@cs.wisc.edu 17610447Snilay@cs.wisc.edu if (consoleSymtab->findAddress("xxm_rpb", addr)) { 17710447Snilay@cs.wisc.edu Addr paddr = vtophys(physmem, addr); 17810447Snilay@cs.wisc.edu char *hwprb = (char *)physmem->dma_addr(paddr, sizeof(uint64_t)); 17910447Snilay@cs.wisc.edu 18010447Snilay@cs.wisc.edu if (hwprb) { 18110447Snilay@cs.wisc.edu *(uint64_t*)(hwprb+0x50) = 34; // Tsunami 18210447Snilay@cs.wisc.edu *(uint64_t*)(hwprb+0x58) = (1<<10); 18310447Snilay@cs.wisc.edu } 18410447Snilay@cs.wisc.edu else 18510447Snilay@cs.wisc.edu panic("could not translate hwprb addr to set system type/variation\n"); 18610447Snilay@cs.wisc.edu 18710447Snilay@cs.wisc.edu } else 18810447Snilay@cs.wisc.edu panic("could not find hwprb to set system type/variation\n"); 18910447Snilay@cs.wisc.edu 19010447Snilay@cs.wisc.edu#ifdef DEBUG 19110447Snilay@cs.wisc.edu if (kernelSymtab->findAddress("panic", addr)) 19210447Snilay@cs.wisc.edu kernelPanicEvent->schedule(addr); 19310447Snilay@cs.wisc.edu else 19410447Snilay@cs.wisc.edu panic("could not find kernel symbol \'panic\'"); 19510447Snilay@cs.wisc.edu 19610447Snilay@cs.wisc.edu if (consoleSymtab->findAddress("panic", addr)) 19710447Snilay@cs.wisc.edu consolePanicEvent->schedule(addr); 19810447Snilay@cs.wisc.edu#endif 19910447Snilay@cs.wisc.edu 20010447Snilay@cs.wisc.edu if (kernelSymtab->findAddress("badaddr", addr)) 20110447Snilay@cs.wisc.edu badaddrEvent->schedule(addr); 20210447Snilay@cs.wisc.edu // else 20310447Snilay@cs.wisc.edu //panic("could not find kernel symbol \'badaddr\'"); 20410447Snilay@cs.wisc.edu 20510447Snilay@cs.wisc.edu if (kernelSymtab->findAddress("tl_v48_capture_power_state", addr)) 20610447Snilay@cs.wisc.edu skipPowerStateEvent->schedule(addr); 20710447Snilay@cs.wisc.edu 20810447Snilay@cs.wisc.edu if (kernelSymtab->findAddress("pmap_scavenge_boot", addr)) 20910447Snilay@cs.wisc.edu skipScavengeBootEvent->schedule(addr); 21010447Snilay@cs.wisc.edu 21110447Snilay@cs.wisc.edu if (kernelSymtab->findAddress("ide_delay_50ms", addr)) 21210447Snilay@cs.wisc.edu skipIdeDelay50msEvent->schedule(addr+8); 21310447Snilay@cs.wisc.edu 21410447Snilay@cs.wisc.edu if (kernelSymtab->findAddress("calibrate_delay", addr)) 21510447Snilay@cs.wisc.edu skipDelayLoopEvent->schedule(addr+8); 21610447Snilay@cs.wisc.edu 21710447Snilay@cs.wisc.edu if (kernelSymtab->findAddress("determine_cpu_caches", addr)) 21810447Snilay@cs.wisc.edu skipCacheProbeEvent->schedule(addr+8); 21910447Snilay@cs.wisc.edu 22010447Snilay@cs.wisc.edu#if TRACING_ON 22110447Snilay@cs.wisc.edu if (kernelSymtab->findAddress("printk", addr)) 22210447Snilay@cs.wisc.edu printfEvent->schedule(addr); 22310447Snilay@cs.wisc.edu 22410447Snilay@cs.wisc.edu if (kernelSymtab->findAddress("m5printf", addr)) 22510447Snilay@cs.wisc.edu debugPrintfEvent->schedule(addr); 22610447Snilay@cs.wisc.edu 22710447Snilay@cs.wisc.edu if (kernelSymtab->findAddress("m5printfr", addr)) 22810447Snilay@cs.wisc.edu debugPrintfrEvent->schedule(addr); 22910447Snilay@cs.wisc.edu 23010447Snilay@cs.wisc.edu if (kernelSymtab->findAddress("m5_dump_mbuf", addr)) 23110447Snilay@cs.wisc.edu dumpMbufEvent->schedule(addr); 23210447Snilay@cs.wisc.edu#endif 23310447Snilay@cs.wisc.edu} 23410447Snilay@cs.wisc.edu 23510447Snilay@cs.wisc.eduLinuxSystem::~LinuxSystem() 23610447Snilay@cs.wisc.edu{ 23710447Snilay@cs.wisc.edu delete kernel; 23810447Snilay@cs.wisc.edu delete console; 23910447Snilay@cs.wisc.edu 24010447Snilay@cs.wisc.edu delete kernelSymtab; 24110447Snilay@cs.wisc.edu delete consoleSymtab; 24210447Snilay@cs.wisc.edu delete bootloaderSymtab; 24310447Snilay@cs.wisc.edu 24410447Snilay@cs.wisc.edu delete kernelPanicEvent; 24510447Snilay@cs.wisc.edu delete consolePanicEvent; 24610447Snilay@cs.wisc.edu delete badaddrEvent; 24710447Snilay@cs.wisc.edu delete skipPowerStateEvent; 24810447Snilay@cs.wisc.edu delete skipScavengeBootEvent; 24910447Snilay@cs.wisc.edu delete printfEvent; 25010447Snilay@cs.wisc.edu /*delete debugPrintfEvent; 25110447Snilay@cs.wisc.edu delete debugPrintfrEvent; 25210447Snilay@cs.wisc.edu delete dumpMbufEvent; 25310447Snilay@cs.wisc.edu*/ 25410447Snilay@cs.wisc.edu} 25510447Snilay@cs.wisc.edu 25610447Snilay@cs.wisc.eduvoid 25710447Snilay@cs.wisc.eduLinuxSystem::setDelayLoop(ExecContext *xc) 25810447Snilay@cs.wisc.edu{ 25910447Snilay@cs.wisc.edu Addr addr = 0; 26010447Snilay@cs.wisc.edu if (kernelSymtab->findAddress("loops_per_jiffy", addr)) { 26110447Snilay@cs.wisc.edu Addr paddr = vtophys(physmem, addr); 26210447Snilay@cs.wisc.edu 26310447Snilay@cs.wisc.edu uint8_t *loops_per_jiffy = 26410447Snilay@cs.wisc.edu physmem->dma_addr(paddr, sizeof(uint32_t)); 26510447Snilay@cs.wisc.edu 26610447Snilay@cs.wisc.edu Tick cpuFreq = xc->cpu->getFreq(); 26710447Snilay@cs.wisc.edu Tick intrFreq = platform->interrupt_frequency; 26810447Snilay@cs.wisc.edu *(uint32_t *)loops_per_jiffy = 26910447Snilay@cs.wisc.edu (uint32_t)((cpuFreq / intrFreq) * 0.9988); 27010447Snilay@cs.wisc.edu } 27110447Snilay@cs.wisc.edu} 27210447Snilay@cs.wisc.edu 27310447Snilay@cs.wisc.eduint 27410447Snilay@cs.wisc.eduLinuxSystem::registerExecContext(ExecContext *xc) 27510447Snilay@cs.wisc.edu{ 27610447Snilay@cs.wisc.edu int xcIndex = System::registerExecContext(xc); 27710447Snilay@cs.wisc.edu 27810447Snilay@cs.wisc.edu if (xcIndex == 0) { 27910447Snilay@cs.wisc.edu // activate with zero delay so that we start ticking right 28010447Snilay@cs.wisc.edu // away on cycle 0 28110447Snilay@cs.wisc.edu xc->activate(0); 28210447Snilay@cs.wisc.edu } 28310447Snilay@cs.wisc.edu 28410447Snilay@cs.wisc.edu RemoteGDB *rgdb = new RemoteGDB(this, xc); 28510447Snilay@cs.wisc.edu GDBListener *gdbl = new GDBListener(rgdb, 7000 + xcIndex); 28610447Snilay@cs.wisc.edu gdbl->listen(); 28710447Snilay@cs.wisc.edu// gdbl->accept(); 28810447Snilay@cs.wisc.edu 28910447Snilay@cs.wisc.edu if (remoteGDB.size() <= xcIndex) { 29010447Snilay@cs.wisc.edu remoteGDB.resize(xcIndex+1); 29110447Snilay@cs.wisc.edu } 29210447Snilay@cs.wisc.edu 29310447Snilay@cs.wisc.edu remoteGDB[xcIndex] = rgdb; 29410447Snilay@cs.wisc.edu 29510447Snilay@cs.wisc.edu return xcIndex; 29610447Snilay@cs.wisc.edu} 29710447Snilay@cs.wisc.edu 29810447Snilay@cs.wisc.edu 29910447Snilay@cs.wisc.eduvoid 30010447Snilay@cs.wisc.eduLinuxSystem::replaceExecContext(ExecContext *xc, int xcIndex) 30110447Snilay@cs.wisc.edu{ 30210447Snilay@cs.wisc.edu System::replaceExecContext(xcIndex, xc); 30310447Snilay@cs.wisc.edu remoteGDB[xcIndex]->replaceExecContext(xc); 30410447Snilay@cs.wisc.edu} 30510447Snilay@cs.wisc.edu 30610447Snilay@cs.wisc.edubool 30710447Snilay@cs.wisc.eduLinuxSystem::breakpoint() 30810447Snilay@cs.wisc.edu{ 30910447Snilay@cs.wisc.edu return remoteGDB[0]->trap(ALPHA_KENTRY_IF); 31010447Snilay@cs.wisc.edu} 31110447Snilay@cs.wisc.edu 31210447Snilay@cs.wisc.eduvoid 31310447Snilay@cs.wisc.eduLinuxSystem::populateMap(std::string callee, std::string caller) 31410447Snilay@cs.wisc.edu{ 31510447Snilay@cs.wisc.edu multimap<const string, string>::const_iterator i; 31610447Snilay@cs.wisc.edu i = callerMap.insert(make_pair(callee, caller)); 31710447Snilay@cs.wisc.edu assert(i != callerMap.end() && "should not fail populating callerMap"); 31810447Snilay@cs.wisc.edu} 31910447Snilay@cs.wisc.edu 32010447Snilay@cs.wisc.edubool 32110447Snilay@cs.wisc.eduLinuxSystem::findCaller(std::string callee, std::string caller) const 32210447Snilay@cs.wisc.edu{ 32310447Snilay@cs.wisc.edu typedef multimap<const std::string, std::string>::const_iterator iter; 32410447Snilay@cs.wisc.edu pair<iter, iter> range; 32510447Snilay@cs.wisc.edu 32610447Snilay@cs.wisc.edu range = callerMap.equal_range(callee); 32710447Snilay@cs.wisc.edu for (iter i = range.first; i != range.second; ++i) { 32810447Snilay@cs.wisc.edu if ((*i).second == caller) 32910447Snilay@cs.wisc.edu return true; 33010447Snilay@cs.wisc.edu } 33110447Snilay@cs.wisc.edu return false; 33210447Snilay@cs.wisc.edu} 33310447Snilay@cs.wisc.edu 33410447Snilay@cs.wisc.eduvoid 33510447Snilay@cs.wisc.eduLinuxSystem::dumpState(ExecContext *xc) const 33610447Snilay@cs.wisc.edu{ 33710447Snilay@cs.wisc.edu#ifndef SW_DEBUG 33810447Snilay@cs.wisc.edu return; 33910447Snilay@cs.wisc.edu#endif 34010447Snilay@cs.wisc.edu if (xc->swCtx) { 34110447Snilay@cs.wisc.edu stack<fnCall *> copy(xc->swCtx->callStack); 34210447Snilay@cs.wisc.edu if (copy.empty()) 34310447Snilay@cs.wisc.edu return; 34410447Snilay@cs.wisc.edu cprintf("xc->swCtx:\n"); 34510447Snilay@cs.wisc.edu fnCall *top; 34610447Snilay@cs.wisc.edu cprintf("|| call: %d\n",xc->swCtx->calls); 34710447Snilay@cs.wisc.edu for (top = copy.top(); !copy.empty(); copy.pop() ) { 34810447Snilay@cs.wisc.edu top = copy.top(); 34910447Snilay@cs.wisc.edu cprintf("|| %13s : %s \n", top->name, top->myBin->name()); 35010447Snilay@cs.wisc.edu } 35110447Snilay@cs.wisc.edu } 35210447Snilay@cs.wisc.edu} 35310447Snilay@cs.wisc.edu 35410447Snilay@cs.wisc.eduBEGIN_DECLARE_SIM_OBJECT_PARAMS(LinuxSystem) 35510447Snilay@cs.wisc.edu 35610447Snilay@cs.wisc.edu Param<bool> bin; 35710447Snilay@cs.wisc.edu SimObjectParam<MemoryController *> mem_ctl; 35810447Snilay@cs.wisc.edu SimObjectParam<PhysicalMemory *> physmem; 35910447Snilay@cs.wisc.edu Param<uint64_t> init_param; 36010447Snilay@cs.wisc.edu 36110447Snilay@cs.wisc.edu Param<string> kernel_code; 36210447Snilay@cs.wisc.edu Param<string> console_code; 36310447Snilay@cs.wisc.edu Param<string> pal_code; 36410447Snilay@cs.wisc.edu Param<string> boot_osflags; 36510447Snilay@cs.wisc.edu Param<string> bootloader_code; 36610447Snilay@cs.wisc.edu 36710447Snilay@cs.wisc.eduEND_DECLARE_SIM_OBJECT_PARAMS(LinuxSystem) 36810447Snilay@cs.wisc.edu 36910447Snilay@cs.wisc.eduBEGIN_INIT_SIM_OBJECT_PARAMS(LinuxSystem) 37010447Snilay@cs.wisc.edu 37110447Snilay@cs.wisc.edu 37210447Snilay@cs.wisc.edu INIT_PARAM_DFLT(bin, "is this system to be binned", false), 37310447Snilay@cs.wisc.edu INIT_PARAM(mem_ctl, "memory controller"), 37410447Snilay@cs.wisc.edu INIT_PARAM(physmem, "phsyical memory"), 37510447Snilay@cs.wisc.edu INIT_PARAM_DFLT(init_param, "numerical value to pass into simulator", 0), 37610447Snilay@cs.wisc.edu INIT_PARAM(kernel_code, "file that contains the code"), 37710447Snilay@cs.wisc.edu INIT_PARAM(console_code, "file that contains the console code"), 37810447Snilay@cs.wisc.edu INIT_PARAM(pal_code, "file that contains palcode"), 37910447Snilay@cs.wisc.edu INIT_PARAM_DFLT(boot_osflags, "flags to pass to the kernel during boot", 38010447Snilay@cs.wisc.edu "a"), 38110447Snilay@cs.wisc.edu INIT_PARAM(bootloader_code, "file that contains the bootloader") 38210447Snilay@cs.wisc.edu 38310447Snilay@cs.wisc.edu 38410447Snilay@cs.wisc.eduEND_INIT_SIM_OBJECT_PARAMS(LinuxSystem) 38510447Snilay@cs.wisc.edu 38610447Snilay@cs.wisc.eduCREATE_SIM_OBJECT(LinuxSystem) 38710447Snilay@cs.wisc.edu{ 38810447Snilay@cs.wisc.edu LinuxSystem *sys = new LinuxSystem(getInstanceName(), init_param, mem_ctl, 38910447Snilay@cs.wisc.edu physmem, kernel_code, console_code, 39010447Snilay@cs.wisc.edu pal_code, boot_osflags, bootloader_code, bin); 39110447Snilay@cs.wisc.edu 39210447Snilay@cs.wisc.edu return sys; 39310447Snilay@cs.wisc.edu} 39410447Snilay@cs.wisc.edu 39510447Snilay@cs.wisc.eduREGISTER_SIM_OBJECT("LinuxSystem", LinuxSystem) 39610447Snilay@cs.wisc.edu