backdoor.cc revision 146
112837Sgabeblack@google.com/* 212837Sgabeblack@google.com * Copyright (c) 2003 The Regents of The University of Michigan 312837Sgabeblack@google.com * All rights reserved. 412837Sgabeblack@google.com * 512837Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without 612837Sgabeblack@google.com * modification, are permitted provided that the following conditions are 712837Sgabeblack@google.com * met: redistributions of source code must retain the above copyright 812837Sgabeblack@google.com * notice, this list of conditions and the following disclaimer; 912837Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright 1012837Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the 1112837Sgabeblack@google.com * documentation and/or other materials provided with the distribution; 1212837Sgabeblack@google.com * neither the name of the copyright holders nor the names of its 1312837Sgabeblack@google.com * contributors may be used to endorse or promote products derived from 1412837Sgabeblack@google.com * this software without specific prior written permission. 1512837Sgabeblack@google.com * 1612837Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1712837Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1812837Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1912837Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2012837Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2112837Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2212837Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2312837Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2412837Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2512837Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2612837Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2712837Sgabeblack@google.com */ 2812837Sgabeblack@google.com 2912837Sgabeblack@google.com/* @file 3012901Sgabeblack@google.com * System Console Definition 3113135Sgabeblack@google.com */ 3212901Sgabeblack@google.com 3312901Sgabeblack@google.com#include <cstddef> 3412837Sgabeblack@google.com#include <cstdio> 3512982Sgabeblack@google.com#include <string> 3612951Sgabeblack@google.com 3712953Sgabeblack@google.com#include "base/inifile.hh" 3813260Sgabeblack@google.com#include "base/str.hh" // for to_number() 3913155Sgabeblack@google.com#include "base/trace.hh" 4012837Sgabeblack@google.com#include "cpu/base_cpu.hh" 4112951Sgabeblack@google.com#include "cpu/exec_context.hh" 4213155Sgabeblack@google.com#include "dev/alpha_console.hh" 4313135Sgabeblack@google.com#include "dev/console.hh" 4412837Sgabeblack@google.com#include "dev/simple_disk.hh" 4512952Sgabeblack@google.com#include "dev/tlaser_clock.hh" 4612952Sgabeblack@google.com#include "mem/functional_mem/memory_control.hh" 4712952Sgabeblack@google.com#include "sim/builder.hh" 4812952Sgabeblack@google.com#include "sim/system.hh" 4912952Sgabeblack@google.com 5012952Sgabeblack@google.comusing namespace std; 5113135Sgabeblack@google.com 5213135Sgabeblack@google.comAlphaConsole::AlphaConsole(const string &name, SimConsole *cons, 5313135Sgabeblack@google.com SimpleDisk *d, int size, System *system, 5413135Sgabeblack@google.com BaseCPU *cpu, TlaserClock *clock, int num_cpus, 5513135Sgabeblack@google.com Addr addr, Addr mask, MemoryController *mmu) 5613135Sgabeblack@google.com : MmapDevice(name, addr, mask, mmu), disk(d), console(cons) 5713135Sgabeblack@google.com{ 5813135Sgabeblack@google.com consoleData = new uint8_t[size]; 5912993Sgabeblack@google.com memset(consoleData, 0, size); 6012993Sgabeblack@google.com 6112952Sgabeblack@google.com alphaAccess->last_offset = size - 1; 6212952Sgabeblack@google.com alphaAccess->kernStart = system->getKernelStart(); 6312952Sgabeblack@google.com alphaAccess->kernEnd = system->getKernelEnd(); 6412952Sgabeblack@google.com alphaAccess->entryPoint = system->getKernelEntry(); 6512952Sgabeblack@google.com 6613135Sgabeblack@google.com alphaAccess->version = ALPHA_ACCESS_VERSION; 6713135Sgabeblack@google.com alphaAccess->numCPUs = num_cpus; 6813135Sgabeblack@google.com alphaAccess->mem_size = system->physmem->getSize(); 6913135Sgabeblack@google.com alphaAccess->cpuClock = cpu->getFreq() / 1000000; 7013135Sgabeblack@google.com alphaAccess->intrClockFrequency = clock->frequency(); 7113135Sgabeblack@google.com 7213135Sgabeblack@google.com alphaAccess->diskUnit = 1; 7313135Sgabeblack@google.com} 7412993Sgabeblack@google.com 7512993Sgabeblack@google.comFault 7612952Sgabeblack@google.comAlphaConsole::read(MemReqPtr req, uint8_t *data) 7712952Sgabeblack@google.com{ 7812952Sgabeblack@google.com memset(data, 0, req->size); 7912952Sgabeblack@google.com 8012952Sgabeblack@google.com if (req->size == sizeof(uint32_t)) { 8113135Sgabeblack@google.com Addr daddr = req->paddr & addr_mask; 8213135Sgabeblack@google.com *(uint32_t *)data = *(uint32_t *)(consoleData + daddr); 8313135Sgabeblack@google.com 8413135Sgabeblack@google.com#if 0 8513135Sgabeblack@google.com DPRINTF(AlphaConsole, "read: offset=%#x val=%#x\n", 8613135Sgabeblack@google.com daddr, *(uint32_t *)data); 8713135Sgabeblack@google.com#endif 8813135Sgabeblack@google.com } 8912993Sgabeblack@google.com 9013194Sgabeblack@google.com return No_Fault; 9112993Sgabeblack@google.com} 9212952Sgabeblack@google.com 9312952Sgabeblack@google.comFault 9413035Sgabeblack@google.comAlphaConsole::write(MemReqPtr req, const uint8_t *data) 9513035Sgabeblack@google.com{ 9612952Sgabeblack@google.com uint64_t val; 9712952Sgabeblack@google.com 9812837Sgabeblack@google.com switch (req->size) { 9912837Sgabeblack@google.com case sizeof(uint32_t): 10012837Sgabeblack@google.com val = *(uint32_t *)data; 10113091Sgabeblack@google.com break; 10212951Sgabeblack@google.com case sizeof(uint64_t): 10312951Sgabeblack@google.com val = *(uint64_t *)data; 10412837Sgabeblack@google.com break; 10513091Sgabeblack@google.com default: 10612951Sgabeblack@google.com return Machine_Check_Fault; 10712951Sgabeblack@google.com } 10812837Sgabeblack@google.com 10913091Sgabeblack@google.com Addr paddr = req->paddr & addr_mask; 11012837Sgabeblack@google.com 11112982Sgabeblack@google.com if (paddr == offsetof(AlphaAccess, diskUnit)) { 11212837Sgabeblack@google.com alphaAccess->diskUnit = val; 11313091Sgabeblack@google.com return No_Fault; 11412837Sgabeblack@google.com } 11512837Sgabeblack@google.com 11612837Sgabeblack@google.com if (paddr == offsetof(AlphaAccess, diskCount)) { 11712837Sgabeblack@google.com alphaAccess->diskCount = val; 11812837Sgabeblack@google.com return No_Fault; 11912837Sgabeblack@google.com } 12012837Sgabeblack@google.com 12112837Sgabeblack@google.com if (paddr == offsetof(AlphaAccess, diskPAddr)) { 12212837Sgabeblack@google.com alphaAccess->diskPAddr = val; 12312837Sgabeblack@google.com return No_Fault; 12412837Sgabeblack@google.com } 12512837Sgabeblack@google.com 12612837Sgabeblack@google.com if (paddr == offsetof(AlphaAccess, diskBlock)) { 12712837Sgabeblack@google.com alphaAccess->diskBlock = val; 12812837Sgabeblack@google.com return No_Fault; 12912837Sgabeblack@google.com } 13012837Sgabeblack@google.com 13112837Sgabeblack@google.com if (paddr == offsetof(AlphaAccess, diskOperation)) { 13212837Sgabeblack@google.com if (val == 0x13) 13312837Sgabeblack@google.com disk->read(alphaAccess->diskPAddr, alphaAccess->diskBlock, 13412837Sgabeblack@google.com alphaAccess->diskCount); 13512837Sgabeblack@google.com else 13612837Sgabeblack@google.com panic("Invalid disk operation!"); 13712837Sgabeblack@google.com 13812837Sgabeblack@google.com return No_Fault; 13912837Sgabeblack@google.com } 14012837Sgabeblack@google.com 14112837Sgabeblack@google.com if (paddr == offsetof(AlphaAccess, outputChar)) { 14212837Sgabeblack@google.com console->out((char)(val & 0xff), false); 14312837Sgabeblack@google.com return No_Fault; 14412837Sgabeblack@google.com } 14512837Sgabeblack@google.com 14612837Sgabeblack@google.com if (paddr == offsetof(AlphaAccess, bootStrapImpure)) { 14712837Sgabeblack@google.com alphaAccess->bootStrapImpure = val; 14812837Sgabeblack@google.com return No_Fault; 14912837Sgabeblack@google.com } 15012837Sgabeblack@google.com 15112837Sgabeblack@google.com if (paddr == offsetof(AlphaAccess, bootStrapCPU)) { 15212837Sgabeblack@google.com warn("%d: Trying to launch another CPU!", curTick); 15312837Sgabeblack@google.com int cpu = val; 15412837Sgabeblack@google.com assert(cpu > 0 && "Must not access primary cpu"); 15512837Sgabeblack@google.com 15612837Sgabeblack@google.com ExecContext *other_xc = req->xc->system->xcvec[cpu]; 15712837Sgabeblack@google.com other_xc->regs.intRegFile[16] = cpu; 15812837Sgabeblack@google.com other_xc->regs.ipr[TheISA::IPR_PALtemp16] = cpu; 15912837Sgabeblack@google.com other_xc->regs.intRegFile[0] = cpu; 16012837Sgabeblack@google.com other_xc->regs.intRegFile[30] = alphaAccess->bootStrapImpure; 16112837Sgabeblack@google.com other_xc->setStatus(ExecContext::Active); //Start the cpu 16212837Sgabeblack@google.com return No_Fault; 16312837Sgabeblack@google.com } 16412837Sgabeblack@google.com 16512837Sgabeblack@google.com return No_Fault; 16612837Sgabeblack@google.com} 16712837Sgabeblack@google.com 16812837Sgabeblack@google.comvoid 16912837Sgabeblack@google.comAlphaConsole::serialize() 17012837Sgabeblack@google.com{ 17112837Sgabeblack@google.com nameOut(); 17212837Sgabeblack@google.com // assumes full AlphaAccess size 17312837Sgabeblack@google.com // might have unnecessary fields here 17412837Sgabeblack@google.com paramOut("last_offset",alphaAccess->last_offset); 17512837Sgabeblack@google.com paramOut("version",alphaAccess->version); 17612837Sgabeblack@google.com paramOut("numCPUs",alphaAccess->numCPUs); 17712837Sgabeblack@google.com paramOut("mem_size",alphaAccess->mem_size); 17812837Sgabeblack@google.com paramOut("cpuClock",alphaAccess->cpuClock); 17912837Sgabeblack@google.com paramOut("intrClockFrequency",alphaAccess->intrClockFrequency); 18012837Sgabeblack@google.com paramOut("kernStart",alphaAccess->kernStart); 18113091Sgabeblack@google.com paramOut("kernEnd",alphaAccess->kernEnd); 18213091Sgabeblack@google.com paramOut("entryPoint",alphaAccess->entryPoint); 18313091Sgabeblack@google.com paramOut("diskUnit",alphaAccess->diskUnit); 18413091Sgabeblack@google.com paramOut("diskCount",alphaAccess->diskCount); 18513091Sgabeblack@google.com paramOut("diskPAddr",alphaAccess->diskPAddr); 18613091Sgabeblack@google.com paramOut("diskBlock",alphaAccess->diskBlock); 18713091Sgabeblack@google.com paramOut("diskOperation",alphaAccess->diskOperation); 18813091Sgabeblack@google.com paramOut("outputChar",alphaAccess->outputChar); 18913091Sgabeblack@google.com paramOut("bootStrapImpure",alphaAccess->bootStrapImpure); 19013091Sgabeblack@google.com paramOut("bootStrapCPU",alphaAccess->bootStrapCPU); 19113091Sgabeblack@google.com} 19213091Sgabeblack@google.com 19313091Sgabeblack@google.comvoid 19413091Sgabeblack@google.comAlphaConsole::unserialize(IniFile &db, const std::string &category, 19513091Sgabeblack@google.com ConfigNode *node) 19613091Sgabeblack@google.com{ 19713091Sgabeblack@google.com string data; 19813091Sgabeblack@google.com db.findDefault(category,"last_offset",data); 19913091Sgabeblack@google.com to_number(data,alphaAccess->last_offset); 20013091Sgabeblack@google.com db.findDefault(category,"version",data); 20113091Sgabeblack@google.com to_number(data,alphaAccess->version); 20213091Sgabeblack@google.com db.findDefault(category,"numCPUs",data); 20313091Sgabeblack@google.com to_number(data,alphaAccess->numCPUs); 20413091Sgabeblack@google.com db.findDefault(category,"mem_size",data); 20512837Sgabeblack@google.com to_number(data,alphaAccess->mem_size); 20612837Sgabeblack@google.com db.findDefault(category,"cpuClock",data); 20712837Sgabeblack@google.com to_number(data,alphaAccess->cpuClock); 20812837Sgabeblack@google.com db.findDefault(category,"intrClockFrequency",data); 20912837Sgabeblack@google.com to_number(data,alphaAccess->intrClockFrequency); 21012951Sgabeblack@google.com db.findDefault(category,"kernStart",data); 21112837Sgabeblack@google.com to_number(data,alphaAccess->kernStart); 21212837Sgabeblack@google.com db.findDefault(category,"kernEnd",data); 21312837Sgabeblack@google.com to_number(data,alphaAccess->kernEnd); 21412837Sgabeblack@google.com db.findDefault(category,"entryPoint",data); 21512837Sgabeblack@google.com to_number(data,alphaAccess->entryPoint); 21612951Sgabeblack@google.com db.findDefault(category,"diskUnit",data); 21712837Sgabeblack@google.com to_number(data,alphaAccess->diskUnit); 21812837Sgabeblack@google.com db.findDefault(category,"diskCount",data); 21912951Sgabeblack@google.com to_number(data,alphaAccess->diskCount); 22013079Sgabeblack@google.com db.findDefault(category,"diskPAddr",data); 22112951Sgabeblack@google.com to_number(data,alphaAccess->diskPAddr); 22212951Sgabeblack@google.com db.findDefault(category,"diskBlock",data); 22312837Sgabeblack@google.com to_number(data,alphaAccess->diskBlock); 22412951Sgabeblack@google.com db.findDefault(category,"diskOperation",data); 22513191Sgabeblack@google.com to_number(data,alphaAccess->diskOperation); 22613191Sgabeblack@google.com db.findDefault(category,"outputChar",data); 22713191Sgabeblack@google.com to_number(data,alphaAccess->outputChar); 22813191Sgabeblack@google.com db.findDefault(category,"bootStrapImpure",data); 22913191Sgabeblack@google.com to_number(data,alphaAccess->bootStrapImpure); 23013191Sgabeblack@google.com db.findDefault(category,"bootStrapCPU",data); 23113191Sgabeblack@google.com to_number(data,alphaAccess->bootStrapCPU); 23212951Sgabeblack@google.com 23312951Sgabeblack@google.com} 23413191Sgabeblack@google.com 23513191Sgabeblack@google.comBEGIN_DECLARE_SIM_OBJECT_PARAMS(AlphaConsole) 23613191Sgabeblack@google.com 23713191Sgabeblack@google.com SimObjectParam<SimConsole *> sim_console; 23813191Sgabeblack@google.com SimObjectParam<SimpleDisk *> disk; 23913191Sgabeblack@google.com Param<int> size; 24013191Sgabeblack@google.com Param<int> num_cpus; 24113191Sgabeblack@google.com SimObjectParam<MemoryController *> mmu; 24213191Sgabeblack@google.com Param<Addr> addr; 24313191Sgabeblack@google.com Param<Addr> mask; 24413191Sgabeblack@google.com SimObjectParam<System *> system; 24513191Sgabeblack@google.com SimObjectParam<BaseCPU *> cpu; 24612928Sgabeblack@google.com SimObjectParam<TlaserClock *> clock; 24712837Sgabeblack@google.com 24813260Sgabeblack@google.comEND_DECLARE_SIM_OBJECT_PARAMS(AlphaConsole) 24912837Sgabeblack@google.com 25013260Sgabeblack@google.comBEGIN_INIT_SIM_OBJECT_PARAMS(AlphaConsole) 25113260Sgabeblack@google.com 25212837Sgabeblack@google.com INIT_PARAM(sim_console, "The Simulator Console"), 25312837Sgabeblack@google.com INIT_PARAM(disk, "Simple Disk"), 25412837Sgabeblack@google.com INIT_PARAM_DFLT(size, "AlphaConsole size", sizeof(AlphaAccess)), 25513260Sgabeblack@google.com INIT_PARAM_DFLT(num_cpus, "Number of CPU's", 1), 25612837Sgabeblack@google.com INIT_PARAM(mmu, "Memory Controller"), 25713260Sgabeblack@google.com INIT_PARAM(addr, "Device Address"), 25813260Sgabeblack@google.com INIT_PARAM(mask, "Address Mask"), 25912837Sgabeblack@google.com INIT_PARAM(system, "system object"), 26012837Sgabeblack@google.com INIT_PARAM(cpu, "Processor"), 26112837Sgabeblack@google.com INIT_PARAM(clock, "Turbolaser Clock") 26213260Sgabeblack@google.com 26312837Sgabeblack@google.comEND_INIT_SIM_OBJECT_PARAMS(AlphaConsole) 26413260Sgabeblack@google.com 26513260Sgabeblack@google.comCREATE_SIM_OBJECT(AlphaConsole) 26612837Sgabeblack@google.com{ 26712837Sgabeblack@google.com return new AlphaConsole(getInstanceName(), sim_console, 26812837Sgabeblack@google.com disk, size, system, 26913260Sgabeblack@google.com cpu, clock, num_cpus, 27012837Sgabeblack@google.com addr, mask, mmu); 27113260Sgabeblack@google.com} 27213260Sgabeblack@google.com 27312837Sgabeblack@google.comREGISTER_SIM_OBJECT("AlphaConsole", AlphaConsole) 27412837Sgabeblack@google.com