system.cc revision 1835
18547Sprakash.ramrakhyani@arm.com/* 28547Sprakash.ramrakhyani@arm.com * Copyright (c) 2004-2005 The Regents of The University of Michigan 38547Sprakash.ramrakhyani@arm.com * All rights reserved. 48547Sprakash.ramrakhyani@arm.com * 58547Sprakash.ramrakhyani@arm.com * Redistribution and use in source and binary forms, with or without 68547Sprakash.ramrakhyani@arm.com * modification, are permitted provided that the following conditions are 78547Sprakash.ramrakhyani@arm.com * met: redistributions of source code must retain the above copyright 88547Sprakash.ramrakhyani@arm.com * notice, this list of conditions and the following disclaimer; 98547Sprakash.ramrakhyani@arm.com * redistributions in binary form must reproduce the above copyright 108547Sprakash.ramrakhyani@arm.com * notice, this list of conditions and the following disclaimer in the 118547Sprakash.ramrakhyani@arm.com * documentation and/or other materials provided with the distribution; 128547Sprakash.ramrakhyani@arm.com * neither the name of the copyright holders nor the names of its 138547Sprakash.ramrakhyani@arm.com * contributors may be used to endorse or promote products derived from 148547Sprakash.ramrakhyani@arm.com * this software without specific prior written permission. 158547Sprakash.ramrakhyani@arm.com * 168547Sprakash.ramrakhyani@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 178547Sprakash.ramrakhyani@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 188547Sprakash.ramrakhyani@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 198547Sprakash.ramrakhyani@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 208547Sprakash.ramrakhyani@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 218547Sprakash.ramrakhyani@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 228547Sprakash.ramrakhyani@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 238547Sprakash.ramrakhyani@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 248547Sprakash.ramrakhyani@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258547Sprakash.ramrakhyani@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 268547Sprakash.ramrakhyani@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278547Sprakash.ramrakhyani@arm.com */ 288547Sprakash.ramrakhyani@arm.com 298547Sprakash.ramrakhyani@arm.com/** 308547Sprakash.ramrakhyani@arm.com * @file 318547Sprakash.ramrakhyani@arm.com * Modifications for the FreeBSD kernel. 328547Sprakash.ramrakhyani@arm.com * Based on kern/linux/linux_system.cc. 338547Sprakash.ramrakhyani@arm.com * Currently only used to skip DELAY function. 348547Sprakash.ramrakhyani@arm.com * 358547Sprakash.ramrakhyani@arm.com */ 368547Sprakash.ramrakhyani@arm.com 378547Sprakash.ramrakhyani@arm.com#include "base/loader/symtab.hh" 388547Sprakash.ramrakhyani@arm.com#include "cpu/exec_context.hh" 398547Sprakash.ramrakhyani@arm.com#include "kern/freebsd/freebsd_system.hh" 408547Sprakash.ramrakhyani@arm.com#include "mem/functional/memory_control.hh" 418547Sprakash.ramrakhyani@arm.com#include "mem/functional/physical.hh" 428547Sprakash.ramrakhyani@arm.com#include "sim/builder.hh" 438547Sprakash.ramrakhyani@arm.com#include "targetarch/vtophys.hh" 448547Sprakash.ramrakhyani@arm.com 458547Sprakash.ramrakhyani@arm.comusing namespace std; 468547Sprakash.ramrakhyani@arm.com 478547Sprakash.ramrakhyani@arm.comFreebsdSystem::FreebsdSystem(Params *p) 488547Sprakash.ramrakhyani@arm.com : System(p) 498547Sprakash.ramrakhyani@arm.com{ 508547Sprakash.ramrakhyani@arm.com Addr addr = 0; 518547Sprakash.ramrakhyani@arm.com 528547Sprakash.ramrakhyani@arm.com /** 538547Sprakash.ramrakhyani@arm.com * Any time DELAY is called just skip the function. 548547Sprakash.ramrakhyani@arm.com * Replace calibrate_clocks with function below. 558547Sprakash.ramrakhyani@arm.com */ 568547Sprakash.ramrakhyani@arm.com skipDelayEvent = new SkipFuncEvent(&pcEventQueue, "DELAY"); 578547Sprakash.ramrakhyani@arm.com if (kernelSymtab->findAddress("DELAY", addr)) 588547Sprakash.ramrakhyani@arm.com skipDelayEvent->schedule(addr+sizeof(MachInst)); 598547Sprakash.ramrakhyani@arm.com 608547Sprakash.ramrakhyani@arm.com skipCalibrateClocks = new FreebsdSkipCalibrateClocksEvent(&pcEventQueue, "calibrate_clocks"); 618547Sprakash.ramrakhyani@arm.com if (kernelSymtab->findAddress("calibrate_clocks", addr)) 628547Sprakash.ramrakhyani@arm.com skipCalibrateClocks->schedule(addr + sizeof(MachInst) * 2); 638547Sprakash.ramrakhyani@arm.com 648547Sprakash.ramrakhyani@arm.com} 658547Sprakash.ramrakhyani@arm.com 668547Sprakash.ramrakhyani@arm.com 678547Sprakash.ramrakhyani@arm.comFreebsdSystem::~FreebsdSystem() 688547Sprakash.ramrakhyani@arm.com{ 698547Sprakash.ramrakhyani@arm.com delete skipDelayEvent; 708547Sprakash.ramrakhyani@arm.com delete skipCalibrateClocks; 718547Sprakash.ramrakhyani@arm.com} 728547Sprakash.ramrakhyani@arm.com 738547Sprakash.ramrakhyani@arm.com 748547Sprakash.ramrakhyani@arm.comvoid 758547Sprakash.ramrakhyani@arm.comFreebsdSystem::doCalibrateClocks(ExecContext *xc) 768547Sprakash.ramrakhyani@arm.com{ 778547Sprakash.ramrakhyani@arm.com Addr ppc_vaddr = 0; 788547Sprakash.ramrakhyani@arm.com Addr timer_vaddr = 0; 798547Sprakash.ramrakhyani@arm.com Addr ppc_paddr = 0; 808547Sprakash.ramrakhyani@arm.com Addr timer_paddr = 0; 818547Sprakash.ramrakhyani@arm.com 828547Sprakash.ramrakhyani@arm.com ppc_vaddr = (Addr)xc->regs.intRegFile[ArgumentReg1]; 838547Sprakash.ramrakhyani@arm.com timer_vaddr = (Addr)xc->regs.intRegFile[ArgumentReg2]; 848547Sprakash.ramrakhyani@arm.com 858547Sprakash.ramrakhyani@arm.com ppc_paddr = vtophys(physmem, ppc_vaddr); 868547Sprakash.ramrakhyani@arm.com timer_paddr = vtophys(physmem, timer_vaddr); 878547Sprakash.ramrakhyani@arm.com 888547Sprakash.ramrakhyani@arm.com uint8_t *ppc = physmem->dma_addr(ppc_paddr, sizeof(uint32_t)); 898547Sprakash.ramrakhyani@arm.com uint8_t *timer = physmem->dma_addr(timer_paddr, sizeof(uint32_t)); 908547Sprakash.ramrakhyani@arm.com 918547Sprakash.ramrakhyani@arm.com *(uint32_t *)ppc = 2000000000; 928547Sprakash.ramrakhyani@arm.com *(uint32_t *)timer = 1193180; 938547Sprakash.ramrakhyani@arm.com} 948547Sprakash.ramrakhyani@arm.com 958547Sprakash.ramrakhyani@arm.com 968547Sprakash.ramrakhyani@arm.comBEGIN_DECLARE_SIM_OBJECT_PARAMS(FreebsdSystem) 978547Sprakash.ramrakhyani@arm.com 988547Sprakash.ramrakhyani@arm.com Param<Tick> boot_cpu_frequency; 998547Sprakash.ramrakhyani@arm.com SimObjectParam<MemoryController *> memctrl; 1008547Sprakash.ramrakhyani@arm.com SimObjectParam<PhysicalMemory *> physmem; 1018547Sprakash.ramrakhyani@arm.com 1028547Sprakash.ramrakhyani@arm.com Param<string> kernel; 1038547Sprakash.ramrakhyani@arm.com Param<string> console; 10411358Sprakash.ramrakhyani@arm.com Param<string> pal; 10511358Sprakash.ramrakhyani@arm.com 10611358Sprakash.ramrakhyani@arm.com Param<string> boot_osflags; 10711358Sprakash.ramrakhyani@arm.com Param<string> readfile; 10811358Sprakash.ramrakhyani@arm.com Param<unsigned int> init_param; 10911358Sprakash.ramrakhyani@arm.com 1108547Sprakash.ramrakhyani@arm.com Param<uint64_t> system_type; 11111358Sprakash.ramrakhyani@arm.com Param<uint64_t> system_rev; 11211358Sprakash.ramrakhyani@arm.com 1138547Sprakash.ramrakhyani@arm.com Param<bool> bin; 11411358Sprakash.ramrakhyani@arm.com VectorParam<string> binned_fns; 1158547Sprakash.ramrakhyani@arm.com Param<bool> bin_int; 1168547Sprakash.ramrakhyani@arm.com 1178547Sprakash.ramrakhyani@arm.comEND_DECLARE_SIM_OBJECT_PARAMS(FreebsdSystem) 1188547Sprakash.ramrakhyani@arm.com 1198547Sprakash.ramrakhyani@arm.comBEGIN_INIT_SIM_OBJECT_PARAMS(FreebsdSystem) 1208547Sprakash.ramrakhyani@arm.com 1218547Sprakash.ramrakhyani@arm.com INIT_PARAM(boot_cpu_frequency, "Frequency of the boot CPU"), 1228547Sprakash.ramrakhyani@arm.com INIT_PARAM(memctrl, "memory controller"), 1238547Sprakash.ramrakhyani@arm.com INIT_PARAM(physmem, "phsyical memory"), 1248547Sprakash.ramrakhyani@arm.com INIT_PARAM(kernel, "file that contains the kernel code"), 1258547Sprakash.ramrakhyani@arm.com INIT_PARAM(console, "file that contains the console code"), 1268547Sprakash.ramrakhyani@arm.com INIT_PARAM(pal, "file that contains palcode"), 1278547Sprakash.ramrakhyani@arm.com INIT_PARAM_DFLT(boot_osflags, "flags to pass to the kernel during boot", 1288547Sprakash.ramrakhyani@arm.com "a"), 1298547Sprakash.ramrakhyani@arm.com INIT_PARAM_DFLT(readfile, "file to read startup script from", ""), 1308547Sprakash.ramrakhyani@arm.com INIT_PARAM_DFLT(init_param, "numerical value to pass into simulator", 0), 1318547Sprakash.ramrakhyani@arm.com INIT_PARAM_DFLT(system_type, "Type of system we are emulating", 34), 1328547Sprakash.ramrakhyani@arm.com INIT_PARAM_DFLT(system_rev, "Revision of system we are emulating", 1<<10), 1338547Sprakash.ramrakhyani@arm.com INIT_PARAM_DFLT(bin, "is this system to be binned", false), 1348547Sprakash.ramrakhyani@arm.com INIT_PARAM(binned_fns, "functions to be broken down and binned"), 1358547Sprakash.ramrakhyani@arm.com INIT_PARAM_DFLT(bin_int, "is interrupt code binned seperately?", true) 1368547Sprakash.ramrakhyani@arm.com 1378547Sprakash.ramrakhyani@arm.comEND_INIT_SIM_OBJECT_PARAMS(FreebsdSystem) 1388547Sprakash.ramrakhyani@arm.com 1398547Sprakash.ramrakhyani@arm.comCREATE_SIM_OBJECT(FreebsdSystem) 1408547Sprakash.ramrakhyani@arm.com{ 1418547Sprakash.ramrakhyani@arm.com System::Params *p = new System::Params; 1428547Sprakash.ramrakhyani@arm.com p->name = getInstanceName(); 1438547Sprakash.ramrakhyani@arm.com p->boot_cpu_frequency = boot_cpu_frequency; 1448547Sprakash.ramrakhyani@arm.com p->memctrl = memctrl; 1458547Sprakash.ramrakhyani@arm.com p->physmem = physmem; 1468547Sprakash.ramrakhyani@arm.com p->kernel_path = kernel; 1478547Sprakash.ramrakhyani@arm.com p->console_path = console; 1488547Sprakash.ramrakhyani@arm.com p->palcode = pal; 1498547Sprakash.ramrakhyani@arm.com p->boot_osflags = boot_osflags; 1508547Sprakash.ramrakhyani@arm.com p->init_param = init_param; 1518547Sprakash.ramrakhyani@arm.com p->readfile = readfile; 1528547Sprakash.ramrakhyani@arm.com p->system_type = system_type; 1538547Sprakash.ramrakhyani@arm.com p->system_rev = system_rev; 1548547Sprakash.ramrakhyani@arm.com p->bin = bin; 1558547Sprakash.ramrakhyani@arm.com p->binned_fns = binned_fns; 1568547Sprakash.ramrakhyani@arm.com p->bin_int = bin_int; 1578547Sprakash.ramrakhyani@arm.com return new FreebsdSystem(p); 1588547Sprakash.ramrakhyani@arm.com} 1598547Sprakash.ramrakhyani@arm.com 1608547Sprakash.ramrakhyani@arm.comREGISTER_SIM_OBJECT("FreebsdSystem", FreebsdSystem) 1618547Sprakash.ramrakhyani@arm.com 1628547Sprakash.ramrakhyani@arm.com