system.cc revision 1821
1/* 2 * Copyright (c) 2004-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; 9 * redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution; 12 * neither the name of the copyright holders nor the names of its 13 * contributors may be used to endorse or promote products derived from 14 * this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29/** 30 * @file 31 * Modifications for the FreeBSD kernel. Based off of kern/linux/linux_system.cc. 32 * Currently only used to skip DELAY function. 33 * 34 */ 35 36#include "base/loader/symtab.hh" 37#include "base/trace.hh" 38#include "cpu/exec_context.hh" 39#include "cpu/base.hh" 40#include "kern/freebsd/freebsd_system.hh" 41#include "kern/system_events.hh" 42#include "mem/functional/memory_control.hh" 43#include "mem/functional/physical.hh" 44#include "sim/builder.hh" 45#include "dev/platform.hh" 46#include "targetarch/isa_traits.hh" 47#include "targetarch/vtophys.hh" 48#include "sim/debug.hh" 49 50using namespace std; 51 52FreebsdSystem::FreebsdSystem(Params *p) 53 : System(p) 54{ 55 Addr addr = 0; 56 57 /** 58 * Any time ide_delay_50ms, calibarte_delay or 59 * determine_cpu_caches is called just skip the 60 * function. Currently determine_cpu_caches only is used put 61 * information in proc, however if that changes in the future we 62 * will have to fill in the cache size variables appropriately. 63 */ 64 skipDelayEvent = new SkipFuncEvent(&pcEventQueue, "DELAY"); 65 if (kernelSymtab->findAddress("DELAY", addr)) 66 skipDelayEvent->schedule(addr+sizeof(MachInst)); 67 68 skipOROMEvent = new SkipFuncEvent(&pcEventQueue, "orm_identify"); 69 if (kernelSymtab->findAddress("orm_identify", addr)) 70 skipOROMEvent->schedule(addr+sizeof(MachInst)); 71 72 skipAicEvent = new SkipFuncEvent(&pcEventQueue, "ahc_isa_identify"); 73 if (kernelSymtab->findAddress("ahc_isa_identify", addr)) 74 skipAicEvent->schedule(addr+sizeof(MachInst)); 75 76 skipPNPEvent = new SkipFuncEvent(&pcEventQueue, "pnp_identify"); 77 if (kernelSymtab->findAddress("pnp_identify", addr)) 78 skipPNPEvent->schedule(addr+sizeof(MachInst)); 79 80 skipATAEvent = new SkipFuncEvent(&pcEventQueue, "ata_attach"); 81 if (kernelSymtab->findAddress("ata_attach", addr)) 82 skipATAEvent->schedule(addr+sizeof(MachInst)); 83 84 skipCalibrateClocks = new FreebsdSkipCalibrateClocksEvent(&pcEventQueue, "calibrate_clocks"); 85 if (kernelSymtab->findAddress("calibrate_clocks", addr)) 86 skipCalibrateClocks->schedule(addr + sizeof(MachInst) * 2); 87 88} 89 90 91FreebsdSystem::~FreebsdSystem() 92{ 93 delete skipDelayEvent; 94 delete skipOROMEvent; 95 delete skipAicEvent; 96 delete skipATAEvent; 97 delete skipPNPEvent; 98 delete skipCalibrateClocks; 99} 100 101 102void 103FreebsdSystem::doCalibrateClocks(ExecContext *xc) 104{ 105 Addr ppc_vaddr = 0; 106 Addr timer_vaddr = 0; 107 Addr ppc_paddr = 0; 108 Addr timer_paddr = 0; 109 110 ppc_vaddr = (Addr)xc->regs.intRegFile[ArgumentReg1]; 111 timer_vaddr = (Addr)xc->regs.intRegFile[ArgumentReg2]; 112 113 ppc_paddr = vtophys(physmem, ppc_vaddr); 114 timer_paddr = vtophys(physmem, timer_vaddr); 115 116 uint8_t *ppc = physmem->dma_addr(ppc_paddr, sizeof(uint32_t)); 117 uint8_t *timer = physmem->dma_addr(timer_paddr, sizeof(uint32_t)); 118 119 *(uint32_t *)ppc = 2000000000; 120 *(uint32_t *)timer = 1193180; 121} 122 123 124BEGIN_DECLARE_SIM_OBJECT_PARAMS(FreebsdSystem) 125 126 Param<Tick> boot_cpu_frequency; 127 SimObjectParam<MemoryController *> memctrl; 128 SimObjectParam<PhysicalMemory *> physmem; 129 130 Param<string> kernel; 131 Param<string> console; 132 Param<string> pal; 133 134 Param<string> boot_osflags; 135 Param<string> readfile; 136 Param<unsigned int> init_param; 137 138 Param<uint64_t> system_type; 139 Param<uint64_t> system_rev; 140 141 Param<bool> bin; 142 VectorParam<string> binned_fns; 143 Param<bool> bin_int; 144 145END_DECLARE_SIM_OBJECT_PARAMS(FreebsdSystem) 146 147BEGIN_INIT_SIM_OBJECT_PARAMS(FreebsdSystem) 148 149 INIT_PARAM(boot_cpu_frequency, "Frequency of the boot CPU"), 150 INIT_PARAM(memctrl, "memory controller"), 151 INIT_PARAM(physmem, "phsyical memory"), 152 INIT_PARAM(kernel, "file that contains the kernel code"), 153 INIT_PARAM(console, "file that contains the console code"), 154 INIT_PARAM(pal, "file that contains palcode"), 155 INIT_PARAM_DFLT(boot_osflags, "flags to pass to the kernel during boot", 156 "a"), 157 INIT_PARAM_DFLT(readfile, "file to read startup script from", ""), 158 INIT_PARAM_DFLT(init_param, "numerical value to pass into simulator", 0), 159 INIT_PARAM_DFLT(system_type, "Type of system we are emulating", 34), 160 INIT_PARAM_DFLT(system_rev, "Revision of system we are emulating", 1<<10), 161 INIT_PARAM_DFLT(bin, "is this system to be binned", false), 162 INIT_PARAM(binned_fns, "functions to be broken down and binned"), 163 INIT_PARAM_DFLT(bin_int, "is interrupt code binned seperately?", true) 164 165END_INIT_SIM_OBJECT_PARAMS(FreebsdSystem) 166 167CREATE_SIM_OBJECT(FreebsdSystem) 168{ 169 System::Params *p = new System::Params; 170 p->name = getInstanceName(); 171 p->boot_cpu_frequency = boot_cpu_frequency; 172 p->memctrl = memctrl; 173 p->physmem = physmem; 174 p->kernel_path = kernel; 175 p->console_path = console; 176 p->palcode = pal; 177 p->boot_osflags = boot_osflags; 178 p->init_param = init_param; 179 p->readfile = readfile; 180 p->system_type = system_type; 181 p->system_rev = system_rev; 182 p->bin = bin; 183 p->binned_fns = binned_fns; 184 p->bin_int = bin_int; 185 return new FreebsdSystem(p); 186} 187 188REGISTER_SIM_OBJECT("FreebsdSystem", FreebsdSystem) 189 190