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