backdoor.cc revision 217
14120Sgblack@eecs.umich.edu/*
24120Sgblack@eecs.umich.edu * Copyright (c) 2003 The Regents of The University of Michigan
34120Sgblack@eecs.umich.edu * All rights reserved.
44120Sgblack@eecs.umich.edu *
54120Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
64120Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
74120Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
84120Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
94120Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
104120Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
114120Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
124120Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
134120Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
144120Sgblack@eecs.umich.edu * this software without specific prior written permission.
154120Sgblack@eecs.umich.edu *
164120Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
174120Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
184120Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
194120Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
204120Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
214120Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
224120Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
234120Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
244120Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
254120Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
264120Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274120Sgblack@eecs.umich.edu */
284120Sgblack@eecs.umich.edu
294120Sgblack@eecs.umich.edu/* @file
304120Sgblack@eecs.umich.edu * System Console Definition
315334Sgblack@eecs.umich.edu */
324120Sgblack@eecs.umich.edu
334120Sgblack@eecs.umich.edu#include <cstddef>
344120Sgblack@eecs.umich.edu#include <cstdio>
354120Sgblack@eecs.umich.edu#include <string>
364120Sgblack@eecs.umich.edu
374120Sgblack@eecs.umich.edu#include "base/inifile.hh"
384120Sgblack@eecs.umich.edu#include "base/str.hh"	// for to_number()
394120Sgblack@eecs.umich.edu#include "base/trace.hh"
404120Sgblack@eecs.umich.edu#include "cpu/base_cpu.hh"
414120Sgblack@eecs.umich.edu#include "cpu/exec_context.hh"
424120Sgblack@eecs.umich.edu#include "dev/alpha_console.hh"
434120Sgblack@eecs.umich.edu#include "dev/console.hh"
444120Sgblack@eecs.umich.edu#include "dev/simple_disk.hh"
454120Sgblack@eecs.umich.edu#include "dev/tlaser_clock.hh"
464120Sgblack@eecs.umich.edu#include "mem/functional_mem/memory_control.hh"
474120Sgblack@eecs.umich.edu#include "sim/builder.hh"
484120Sgblack@eecs.umich.edu#include "sim/system.hh"
494120Sgblack@eecs.umich.edu
504120Sgblack@eecs.umich.eduusing namespace std;
514120Sgblack@eecs.umich.edu
524120Sgblack@eecs.umich.eduAlphaConsole::AlphaConsole(const string &name, SimConsole *cons,
534120Sgblack@eecs.umich.edu                           SimpleDisk *d, int size, System *system,
544120Sgblack@eecs.umich.edu                           BaseCPU *cpu, TlaserClock *clock, int num_cpus,
554120Sgblack@eecs.umich.edu                           Addr addr, Addr mask, MemoryController *mmu)
564120Sgblack@eecs.umich.edu    : MmapDevice(name, addr, mask, mmu), disk(d), console(cons)
574120Sgblack@eecs.umich.edu{
584120Sgblack@eecs.umich.edu    consoleData = new uint8_t[size];
594120Sgblack@eecs.umich.edu    memset(consoleData, 0, size);
604120Sgblack@eecs.umich.edu
614120Sgblack@eecs.umich.edu    alphaAccess->last_offset = size - 1;
624120Sgblack@eecs.umich.edu    alphaAccess->kernStart = system->getKernelStart();
634120Sgblack@eecs.umich.edu    alphaAccess->kernEnd = system->getKernelEnd();
644120Sgblack@eecs.umich.edu    alphaAccess->entryPoint = system->getKernelEntry();
654120Sgblack@eecs.umich.edu
664120Sgblack@eecs.umich.edu    alphaAccess->version = ALPHA_ACCESS_VERSION;
674120Sgblack@eecs.umich.edu    alphaAccess->numCPUs = num_cpus;
684120Sgblack@eecs.umich.edu    alphaAccess->mem_size = system->physmem->getSize();
694120Sgblack@eecs.umich.edu    alphaAccess->cpuClock = cpu->getFreq() / 1000000;
704120Sgblack@eecs.umich.edu    alphaAccess->intrClockFrequency = clock->frequency();
714120Sgblack@eecs.umich.edu
724120Sgblack@eecs.umich.edu    alphaAccess->diskUnit = 1;
734120Sgblack@eecs.umich.edu}
744120Sgblack@eecs.umich.edu
754120Sgblack@eecs.umich.eduFault
764120Sgblack@eecs.umich.eduAlphaConsole::read(MemReqPtr req, uint8_t *data)
774120Sgblack@eecs.umich.edu{
784120Sgblack@eecs.umich.edu    memset(data, 0, req->size);
794120Sgblack@eecs.umich.edu
804120Sgblack@eecs.umich.edu    if (req->size == sizeof(uint32_t)) {
814120Sgblack@eecs.umich.edu        Addr daddr = req->paddr & addr_mask;
824120Sgblack@eecs.umich.edu        *(uint32_t *)data = *(uint32_t *)(consoleData + daddr);
834120Sgblack@eecs.umich.edu
844120Sgblack@eecs.umich.edu#if 0
854120Sgblack@eecs.umich.edu        DPRINTF(AlphaConsole, "read: offset=%#x val=%#x\n",
864202Sbinkertn@umich.edu                daddr, *(uint32_t *)data);
875069Sgblack@eecs.umich.edu#endif
884202Sbinkertn@umich.edu    }
894601Sgblack@eecs.umich.edu
904202Sbinkertn@umich.edu    return No_Fault;
915124Sgblack@eecs.umich.edu}
925083Sgblack@eecs.umich.edu
934679Sgblack@eecs.umich.eduFault
945083Sgblack@eecs.umich.eduAlphaConsole::write(MemReqPtr req, const uint8_t *data)
954679Sgblack@eecs.umich.edu{
964679Sgblack@eecs.umich.edu    uint64_t val;
974202Sbinkertn@umich.edu
984202Sbinkertn@umich.edu    switch (req->size) {
995124Sgblack@eecs.umich.edu      case sizeof(uint32_t):
1004249Sgblack@eecs.umich.edu        val = *(uint32_t *)data;
1014240Sgblack@eecs.umich.edu        break;
1024202Sbinkertn@umich.edu      case sizeof(uint64_t):
1034202Sbinkertn@umich.edu        val = *(uint64_t *)data;
1044997Sgblack@eecs.umich.edu        break;
1055135Sgblack@eecs.umich.edu      default:
1064997Sgblack@eecs.umich.edu        return Machine_Check_Fault;
1074997Sgblack@eecs.umich.edu    }
1085192Ssaidi@eecs.umich.edu
1095192Ssaidi@eecs.umich.edu    Addr paddr = req->paddr & addr_mask;
1104120Sgblack@eecs.umich.edu
1114202Sbinkertn@umich.edu    if (paddr == offsetof(AlphaAccess, diskUnit)) {
1125132Sgblack@eecs.umich.edu        alphaAccess->diskUnit = val;
1135132Sgblack@eecs.umich.edu        return No_Fault;
1144202Sbinkertn@umich.edu    }
1155299Sgblack@eecs.umich.edu
1165245Sgblack@eecs.umich.edu    if (paddr == offsetof(AlphaAccess, diskCount)) {
1175334Sgblack@eecs.umich.edu        alphaAccess->diskCount = val;
1185132Sgblack@eecs.umich.edu        return No_Fault;
1195086Sgblack@eecs.umich.edu    }
1205086Sgblack@eecs.umich.edu
1214202Sbinkertn@umich.edu    if (paddr == offsetof(AlphaAccess, diskPAddr)) {
1224202Sbinkertn@umich.edu        alphaAccess->diskPAddr = val;
1234120Sgblack@eecs.umich.edu        return No_Fault;
1244202Sbinkertn@umich.edu    }
1254202Sbinkertn@umich.edu
1264202Sbinkertn@umich.edu    if (paddr == offsetof(AlphaAccess, diskBlock)) {
1274120Sgblack@eecs.umich.edu        alphaAccess->diskBlock = val;
1285069Sgblack@eecs.umich.edu        return No_Fault;
1295081Sgblack@eecs.umich.edu    }
1305081Sgblack@eecs.umich.edu
1315081Sgblack@eecs.umich.edu    if (paddr == offsetof(AlphaAccess, diskOperation)) {
1325081Sgblack@eecs.umich.edu        if (val == 0x13)
1335081Sgblack@eecs.umich.edu            disk->read(alphaAccess->diskPAddr, alphaAccess->diskBlock,
1345081Sgblack@eecs.umich.edu                       alphaAccess->diskCount);
1355081Sgblack@eecs.umich.edu        else
1365081Sgblack@eecs.umich.edu            panic("Invalid disk operation!");
1375081Sgblack@eecs.umich.edu
1385081Sgblack@eecs.umich.edu        return No_Fault;
1395081Sgblack@eecs.umich.edu    }
1405081Sgblack@eecs.umich.edu
1415081Sgblack@eecs.umich.edu    if (paddr == offsetof(AlphaAccess, outputChar)) {
1425081Sgblack@eecs.umich.edu        console->out((char)(val & 0xff), false);
1435081Sgblack@eecs.umich.edu        return No_Fault;
1445081Sgblack@eecs.umich.edu    }
1455081Sgblack@eecs.umich.edu
1465081Sgblack@eecs.umich.edu    if (paddr == offsetof(AlphaAccess, bootStrapImpure)) {
1475081Sgblack@eecs.umich.edu        alphaAccess->bootStrapImpure = val;
1485081Sgblack@eecs.umich.edu        return No_Fault;
1495081Sgblack@eecs.umich.edu    }
1505081Sgblack@eecs.umich.edu
1515081Sgblack@eecs.umich.edu    if (paddr == offsetof(AlphaAccess, bootStrapCPU)) {
1525081Sgblack@eecs.umich.edu        warn("%d: Trying to launch another CPU!", curTick);
1535081Sgblack@eecs.umich.edu        int cpu = val;
1545081Sgblack@eecs.umich.edu        assert(cpu > 0 && "Must not access primary cpu");
1555081Sgblack@eecs.umich.edu
1565081Sgblack@eecs.umich.edu        ExecContext *other_xc = req->xc->system->execContexts[cpu];
1575081Sgblack@eecs.umich.edu        other_xc->regs.intRegFile[16] = cpu;
1585081Sgblack@eecs.umich.edu        other_xc->regs.ipr[TheISA::IPR_PALtemp16] = cpu;
1595081Sgblack@eecs.umich.edu        other_xc->regs.intRegFile[0] = cpu;
1605081Sgblack@eecs.umich.edu        other_xc->regs.intRegFile[30] = alphaAccess->bootStrapImpure;
1615081Sgblack@eecs.umich.edu        other_xc->setStatus(ExecContext::Active); //Start the cpu
1625081Sgblack@eecs.umich.edu        return No_Fault;
1635081Sgblack@eecs.umich.edu    }
1645081Sgblack@eecs.umich.edu
1655081Sgblack@eecs.umich.edu    return No_Fault;
1665081Sgblack@eecs.umich.edu}
1675081Sgblack@eecs.umich.edu
1685081Sgblack@eecs.umich.eduvoid
1695081Sgblack@eecs.umich.eduAlphaAccess::serialize(ostream &os)
1705081Sgblack@eecs.umich.edu{
1715081Sgblack@eecs.umich.edu    SERIALIZE_MEMBER(last_offset);
1725081Sgblack@eecs.umich.edu    SERIALIZE_MEMBER(version);
1735081Sgblack@eecs.umich.edu    SERIALIZE_MEMBER(numCPUs);
1745081Sgblack@eecs.umich.edu    SERIALIZE_MEMBER(mem_size);
1755081Sgblack@eecs.umich.edu    SERIALIZE_MEMBER(cpuClock);
1765081Sgblack@eecs.umich.edu    SERIALIZE_MEMBER(intrClockFrequency);
1775081Sgblack@eecs.umich.edu    SERIALIZE_MEMBER(kernStart);
1785081Sgblack@eecs.umich.edu    SERIALIZE_MEMBER(kernEnd);
1795081Sgblack@eecs.umich.edu    SERIALIZE_MEMBER(entryPoint);
1805081Sgblack@eecs.umich.edu    SERIALIZE_MEMBER(diskUnit);
1815081Sgblack@eecs.umich.edu    SERIALIZE_MEMBER(diskCount);
1825081Sgblack@eecs.umich.edu    SERIALIZE_MEMBER(diskPAddr);
1835081Sgblack@eecs.umich.edu    SERIALIZE_MEMBER(diskBlock);
1845081Sgblack@eecs.umich.edu    SERIALIZE_MEMBER(diskOperation);
1855081Sgblack@eecs.umich.edu    SERIALIZE_MEMBER(outputChar);
1865173Sgblack@eecs.umich.edu    SERIALIZE_MEMBER(bootStrapImpure);
1875081Sgblack@eecs.umich.edu    SERIALIZE_MEMBER(bootStrapCPU);
1885149Sgblack@eecs.umich.edu}
1895298Sgblack@eecs.umich.edu
1905081Sgblack@eecs.umich.eduvoid
1915081Sgblack@eecs.umich.eduAlphaAccess::unserialize(IniFile &db, const std::string &section)
1925081Sgblack@eecs.umich.edu{
1935081Sgblack@eecs.umich.edu    UNSERIALIZE_MEMBER(last_offset);
1945081Sgblack@eecs.umich.edu    UNSERIALIZE_MEMBER(version);
1955081Sgblack@eecs.umich.edu    UNSERIALIZE_MEMBER(numCPUs);
1965081Sgblack@eecs.umich.edu    UNSERIALIZE_MEMBER(mem_size);
1975081Sgblack@eecs.umich.edu    UNSERIALIZE_MEMBER(cpuClock);
1985081Sgblack@eecs.umich.edu    UNSERIALIZE_MEMBER(intrClockFrequency);
1995081Sgblack@eecs.umich.edu    UNSERIALIZE_MEMBER(kernStart);
2005081Sgblack@eecs.umich.edu    UNSERIALIZE_MEMBER(kernEnd);
2015081Sgblack@eecs.umich.edu    UNSERIALIZE_MEMBER(entryPoint);
2025081Sgblack@eecs.umich.edu    UNSERIALIZE_MEMBER(diskUnit);
2035081Sgblack@eecs.umich.edu    UNSERIALIZE_MEMBER(diskCount);
2045081Sgblack@eecs.umich.edu    UNSERIALIZE_MEMBER(diskPAddr);
2055081Sgblack@eecs.umich.edu    UNSERIALIZE_MEMBER(diskBlock);
2065081Sgblack@eecs.umich.edu    UNSERIALIZE_MEMBER(diskOperation);
2075081Sgblack@eecs.umich.edu    UNSERIALIZE_MEMBER(outputChar);
2085081Sgblack@eecs.umich.edu    UNSERIALIZE_MEMBER(bootStrapImpure);
2095081Sgblack@eecs.umich.edu    UNSERIALIZE_MEMBER(bootStrapCPU);
2105081Sgblack@eecs.umich.edu}
2115081Sgblack@eecs.umich.edu
2125081Sgblack@eecs.umich.eduvoid
2135081Sgblack@eecs.umich.eduAlphaConsole::serialize(ostream &os)
2145081Sgblack@eecs.umich.edu{
2155081Sgblack@eecs.umich.edu    alphaAccess->serialize(os);
2165081Sgblack@eecs.umich.edu}
2175081Sgblack@eecs.umich.edu
2185081Sgblack@eecs.umich.eduvoid
2195081Sgblack@eecs.umich.eduAlphaConsole::unserialize(IniFile &db, const std::string &section)
2205081Sgblack@eecs.umich.edu{
2215081Sgblack@eecs.umich.edu    alphaAccess->unserialize(db, section);
2225081Sgblack@eecs.umich.edu}
2235081Sgblack@eecs.umich.edu
2245081Sgblack@eecs.umich.eduBEGIN_DECLARE_SIM_OBJECT_PARAMS(AlphaConsole)
2255081Sgblack@eecs.umich.edu
2265081Sgblack@eecs.umich.edu    SimObjectParam<SimConsole *> sim_console;
2275081Sgblack@eecs.umich.edu    SimObjectParam<SimpleDisk *> disk;
2285081Sgblack@eecs.umich.edu    Param<int> size;
2295081Sgblack@eecs.umich.edu    Param<int> num_cpus;
2305081Sgblack@eecs.umich.edu    SimObjectParam<MemoryController *> mmu;
2315081Sgblack@eecs.umich.edu    Param<Addr> addr;
2325081Sgblack@eecs.umich.edu    Param<Addr> mask;
2335081Sgblack@eecs.umich.edu    SimObjectParam<System *> system;
2345081Sgblack@eecs.umich.edu    SimObjectParam<BaseCPU *> cpu;
2355081Sgblack@eecs.umich.edu    SimObjectParam<TlaserClock *> clock;
2365081Sgblack@eecs.umich.edu
2375081Sgblack@eecs.umich.eduEND_DECLARE_SIM_OBJECT_PARAMS(AlphaConsole)
2385081Sgblack@eecs.umich.edu
2395081Sgblack@eecs.umich.eduBEGIN_INIT_SIM_OBJECT_PARAMS(AlphaConsole)
2405081Sgblack@eecs.umich.edu
2415081Sgblack@eecs.umich.edu    INIT_PARAM(sim_console, "The Simulator Console"),
2425081Sgblack@eecs.umich.edu    INIT_PARAM(disk, "Simple Disk"),
2435081Sgblack@eecs.umich.edu    INIT_PARAM_DFLT(size, "AlphaConsole size", sizeof(AlphaAccess)),
2445081Sgblack@eecs.umich.edu    INIT_PARAM_DFLT(num_cpus, "Number of CPU's", 1),
2455081Sgblack@eecs.umich.edu    INIT_PARAM(mmu, "Memory Controller"),
2465081Sgblack@eecs.umich.edu    INIT_PARAM(addr, "Device Address"),
2475081Sgblack@eecs.umich.edu    INIT_PARAM(mask, "Address Mask"),
2485081Sgblack@eecs.umich.edu    INIT_PARAM(system, "system object"),
2495081Sgblack@eecs.umich.edu    INIT_PARAM(cpu, "Processor"),
2505081Sgblack@eecs.umich.edu    INIT_PARAM(clock, "Turbolaser Clock")
2515081Sgblack@eecs.umich.edu
2525081Sgblack@eecs.umich.eduEND_INIT_SIM_OBJECT_PARAMS(AlphaConsole)
2535081Sgblack@eecs.umich.edu
2545081Sgblack@eecs.umich.eduCREATE_SIM_OBJECT(AlphaConsole)
2555081Sgblack@eecs.umich.edu{
2565081Sgblack@eecs.umich.edu    return  new AlphaConsole(getInstanceName(), sim_console,
2575081Sgblack@eecs.umich.edu                             disk, size, system,
2585081Sgblack@eecs.umich.edu                             cpu, clock, num_cpus,
2595081Sgblack@eecs.umich.edu                             addr, mask, mmu);
2605081Sgblack@eecs.umich.edu}
2615081Sgblack@eecs.umich.edu
2625081Sgblack@eecs.umich.eduREGISTER_SIM_OBJECT("AlphaConsole", AlphaConsole)
2635081Sgblack@eecs.umich.edu