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 §ion) 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 §ion) 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