Merge zizzer:/bk/m5
into zeep.eecs.umich.edu:/z/saidi/work/m5.head cpu/simple/cpu.cc: remove initCPU from constructor dev/alpha_console.cc: we are panicing, so no need to return a fault --HG-- extra : convert_revision : 72389ea0c96e91a55f35b884200325224bfb6ed9
This commit is contained in:
commit
e1c3acd91c
8 changed files with 88 additions and 75 deletions
|
@ -70,13 +70,16 @@ AlphaISA::swap_palshadow(RegFile *regs, bool use_shadow)
|
||||||
// Machine dependent functions
|
// Machine dependent functions
|
||||||
//
|
//
|
||||||
void
|
void
|
||||||
AlphaISA::initCPU(RegFile *regs)
|
AlphaISA::initCPU(RegFile *regs, int cpuId)
|
||||||
{
|
{
|
||||||
initIPRs(regs);
|
initIPRs(regs, cpuId);
|
||||||
// CPU comes up with PAL regs enabled
|
// CPU comes up with PAL regs enabled
|
||||||
swap_palshadow(regs, true);
|
swap_palshadow(regs, true);
|
||||||
|
|
||||||
regs->pc = regs->ipr[IPR_PAL_BASE] + fault_addr(ResetFault);
|
regs->intRegFile[16] = cpuId;
|
||||||
|
regs->intRegFile[0] = cpuId;
|
||||||
|
|
||||||
|
regs->pc = regs->ipr[IPR_PAL_BASE] + fault_addr[Reset_Fault];
|
||||||
regs->npc = regs->pc + sizeof(MachInst);
|
regs->npc = regs->pc + sizeof(MachInst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,15 +87,25 @@ AlphaISA::initCPU(RegFile *regs)
|
||||||
//
|
//
|
||||||
// alpha exceptions - value equals trap address, update with MD_FAULT_TYPE
|
// alpha exceptions - value equals trap address, update with MD_FAULT_TYPE
|
||||||
//
|
//
|
||||||
const Addr
|
Addr
|
||||||
AlphaISA::fault_addr(Fault fault)
|
AlphaISA::fault_addr[Num_Faults] = {
|
||||||
{
|
0x0000, /* No_Fault */
|
||||||
//Check for the system wide faults
|
0x0001, /* Reset_Fault */
|
||||||
if(fault == NoFault) return 0x0000;
|
0x0401, /* Machine_Check_Fault */
|
||||||
else if(fault == MachineCheckFault) return 0x0401;
|
0x0501, /* Arithmetic_Fault */
|
||||||
else if(fault == AlignmentFault) return 0x0301;
|
0x0101, /* Interrupt_Fault */
|
||||||
//Deal with the alpha specific faults
|
0x0201, /* Ndtb_Miss_Fault */
|
||||||
return ((AlphaFault*)fault)->vect;
|
0x0281, /* Pdtb_Miss_Fault */
|
||||||
|
0x0301, /* Alignment_Fault */
|
||||||
|
0x0381, /* DTB_Fault_Fault */
|
||||||
|
0x0381, /* DTB_Acv_Fault */
|
||||||
|
0x0181, /* ITB_Miss_Fault */
|
||||||
|
0x0181, /* ITB_Fault_Fault */
|
||||||
|
0x0081, /* ITB_Acv_Fault */
|
||||||
|
0x0481, /* Unimplemented_Opcode_Fault */
|
||||||
|
0x0581, /* Fen_Fault */
|
||||||
|
0x2001, /* Pal_Fault */
|
||||||
|
0x0501, /* Integer_Overflow_Fault: maps to Arithmetic_Fault */
|
||||||
};
|
};
|
||||||
|
|
||||||
const int AlphaISA::reg_redir[AlphaISA::NumIntRegs] = {
|
const int AlphaISA::reg_redir[AlphaISA::NumIntRegs] = {
|
||||||
|
@ -106,13 +119,14 @@ const int AlphaISA::reg_redir[AlphaISA::NumIntRegs] = {
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
void
|
void
|
||||||
AlphaISA::initIPRs(RegFile *regs)
|
AlphaISA::initIPRs(RegFile *regs, int cpuId)
|
||||||
{
|
{
|
||||||
uint64_t *ipr = regs->ipr;
|
uint64_t *ipr = regs->ipr;
|
||||||
|
|
||||||
bzero((char *)ipr, NumInternalProcRegs * sizeof(InternalProcReg));
|
bzero((char *)ipr, NumInternalProcRegs * sizeof(InternalProcReg));
|
||||||
ipr[IPR_PAL_BASE] = PalBase;
|
ipr[IPR_PAL_BASE] = PalBase;
|
||||||
ipr[IPR_MCSR] = 0x6;
|
ipr[IPR_MCSR] = 0x6;
|
||||||
|
ipr[IPR_PALtemp16] = cpuId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -158,7 +172,7 @@ AlphaISA::processInterrupts(CPU *cpu)
|
||||||
if (ipl && ipl > ipr[IPR_IPLR]) {
|
if (ipl && ipl > ipr[IPR_IPLR]) {
|
||||||
ipr[IPR_ISR] = summary;
|
ipr[IPR_ISR] = summary;
|
||||||
ipr[IPR_INTID] = ipl;
|
ipr[IPR_INTID] = ipl;
|
||||||
cpu->trap(InterruptFault);
|
cpu->trap(Interrupt_Fault);
|
||||||
DPRINTF(Flow, "Interrupt! IPLR=%d ipl=%d summary=%x\n",
|
DPRINTF(Flow, "Interrupt! IPLR=%d ipl=%d summary=%x\n",
|
||||||
ipr[IPR_IPLR], ipl, summary);
|
ipr[IPR_IPLR], ipl, summary);
|
||||||
}
|
}
|
||||||
|
@ -179,23 +193,23 @@ AlphaISA::zeroRegisters(CPU *cpu)
|
||||||
void
|
void
|
||||||
ExecContext::ev5_trap(Fault fault)
|
ExecContext::ev5_trap(Fault fault)
|
||||||
{
|
{
|
||||||
DPRINTF(Fault, "Fault %s at PC: %#x\n", fault->name, regs.pc);
|
DPRINTF(Fault, "Fault %s at PC: %#x\n", FaultName(fault), regs.pc);
|
||||||
cpu->recordEvent(csprintf("Fault %s", fault->name));
|
cpu->recordEvent(csprintf("Fault %s", FaultName(fault)));
|
||||||
|
|
||||||
assert(!misspeculating());
|
assert(!misspeculating());
|
||||||
kernelStats->fault(fault);
|
kernelStats->fault(fault);
|
||||||
|
|
||||||
if (fault == ArithmeticFault)
|
if (fault == Arithmetic_Fault)
|
||||||
panic("Arithmetic traps are unimplemented!");
|
panic("Arithmetic traps are unimplemented!");
|
||||||
|
|
||||||
AlphaISA::InternalProcReg *ipr = regs.ipr;
|
AlphaISA::InternalProcReg *ipr = regs.ipr;
|
||||||
|
|
||||||
// exception restart address
|
// exception restart address
|
||||||
if (fault != InterruptFault || !inPalMode())
|
if (fault != Interrupt_Fault || !inPalMode())
|
||||||
ipr[AlphaISA::IPR_EXC_ADDR] = regs.pc;
|
ipr[AlphaISA::IPR_EXC_ADDR] = regs.pc;
|
||||||
|
|
||||||
if (fault == PalFault || fault == ArithmeticFault /* ||
|
if (fault == Pal_Fault || fault == Arithmetic_Fault /* ||
|
||||||
fault == InterruptFault && !inPalMode() */) {
|
fault == Interrupt_Fault && !inPalMode() */) {
|
||||||
// traps... skip faulting instruction
|
// traps... skip faulting instruction
|
||||||
ipr[AlphaISA::IPR_EXC_ADDR] += 4;
|
ipr[AlphaISA::IPR_EXC_ADDR] += 4;
|
||||||
}
|
}
|
||||||
|
@ -203,7 +217,7 @@ ExecContext::ev5_trap(Fault fault)
|
||||||
if (!inPalMode())
|
if (!inPalMode())
|
||||||
AlphaISA::swap_palshadow(®s, true);
|
AlphaISA::swap_palshadow(®s, true);
|
||||||
|
|
||||||
regs.pc = ipr[AlphaISA::IPR_PAL_BASE] + AlphaISA::fault_addr(fault);
|
regs.pc = ipr[AlphaISA::IPR_PAL_BASE] + AlphaISA::fault_addr[fault];
|
||||||
regs.npc = regs.pc + sizeof(MachInst);
|
regs.npc = regs.pc + sizeof(MachInst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,13 +226,13 @@ void
|
||||||
AlphaISA::intr_post(RegFile *regs, Fault fault, Addr pc)
|
AlphaISA::intr_post(RegFile *regs, Fault fault, Addr pc)
|
||||||
{
|
{
|
||||||
InternalProcReg *ipr = regs->ipr;
|
InternalProcReg *ipr = regs->ipr;
|
||||||
bool use_pc = (fault == NoFault);
|
bool use_pc = (fault == No_Fault);
|
||||||
|
|
||||||
if (fault == ArithmeticFault)
|
if (fault == Arithmetic_Fault)
|
||||||
panic("arithmetic faults NYI...");
|
panic("arithmetic faults NYI...");
|
||||||
|
|
||||||
// compute exception restart address
|
// compute exception restart address
|
||||||
if (use_pc || fault == PalFault || fault == ArithmeticFault) {
|
if (use_pc || fault == Pal_Fault || fault == Arithmetic_Fault) {
|
||||||
// traps... skip faulting instruction
|
// traps... skip faulting instruction
|
||||||
ipr[IPR_EXC_ADDR] = regs->pc + 4;
|
ipr[IPR_EXC_ADDR] = regs->pc + 4;
|
||||||
} else {
|
} else {
|
||||||
|
@ -228,7 +242,7 @@ AlphaISA::intr_post(RegFile *regs, Fault fault, Addr pc)
|
||||||
|
|
||||||
// jump to expection address (PAL PC bit set here as well...)
|
// jump to expection address (PAL PC bit set here as well...)
|
||||||
if (!use_pc)
|
if (!use_pc)
|
||||||
regs->npc = ipr[IPR_PAL_BASE] + fault_addr(fault);
|
regs->npc = ipr[IPR_PAL_BASE] + fault_addr[fault];
|
||||||
else
|
else
|
||||||
regs->npc = ipr[IPR_PAL_BASE] + pc;
|
regs->npc = ipr[IPR_PAL_BASE] + pc;
|
||||||
|
|
||||||
|
@ -241,7 +255,7 @@ ExecContext::hwrei()
|
||||||
uint64_t *ipr = regs.ipr;
|
uint64_t *ipr = regs.ipr;
|
||||||
|
|
||||||
if (!inPalMode())
|
if (!inPalMode())
|
||||||
return UnimplementedOpcodeFault;
|
return Unimplemented_Opcode_Fault;
|
||||||
|
|
||||||
setNextPC(ipr[AlphaISA::IPR_EXC_ADDR]);
|
setNextPC(ipr[AlphaISA::IPR_EXC_ADDR]);
|
||||||
|
|
||||||
|
@ -255,7 +269,7 @@ ExecContext::hwrei()
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: XXX check for interrupts? XXX
|
// FIXME: XXX check for interrupts? XXX
|
||||||
return NoFault;
|
return No_Fault;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t
|
uint64_t
|
||||||
|
@ -353,12 +367,12 @@ ExecContext::readIpr(int idx, Fault &fault)
|
||||||
case AlphaISA::IPR_DTB_IAP:
|
case AlphaISA::IPR_DTB_IAP:
|
||||||
case AlphaISA::IPR_ITB_IA:
|
case AlphaISA::IPR_ITB_IA:
|
||||||
case AlphaISA::IPR_ITB_IAP:
|
case AlphaISA::IPR_ITB_IAP:
|
||||||
fault = UnimplementedOpcodeFault;
|
fault = Unimplemented_Opcode_Fault;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// invalid IPR
|
// invalid IPR
|
||||||
fault = UnimplementedOpcodeFault;
|
fault = Unimplemented_Opcode_Fault;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -377,7 +391,7 @@ ExecContext::setIpr(int idx, uint64_t val)
|
||||||
uint64_t old;
|
uint64_t old;
|
||||||
|
|
||||||
if (misspeculating())
|
if (misspeculating())
|
||||||
return NoFault;
|
return No_Fault;
|
||||||
|
|
||||||
switch (idx) {
|
switch (idx) {
|
||||||
case AlphaISA::IPR_PALtemp0:
|
case AlphaISA::IPR_PALtemp0:
|
||||||
|
@ -523,7 +537,7 @@ ExecContext::setIpr(int idx, uint64_t val)
|
||||||
case AlphaISA::IPR_ITB_PTE_TEMP:
|
case AlphaISA::IPR_ITB_PTE_TEMP:
|
||||||
case AlphaISA::IPR_DTB_PTE_TEMP:
|
case AlphaISA::IPR_DTB_PTE_TEMP:
|
||||||
// read-only registers
|
// read-only registers
|
||||||
return UnimplementedOpcodeFault;
|
return Unimplemented_Opcode_Fault;
|
||||||
|
|
||||||
case AlphaISA::IPR_HWINT_CLR:
|
case AlphaISA::IPR_HWINT_CLR:
|
||||||
case AlphaISA::IPR_SL_XMIT:
|
case AlphaISA::IPR_SL_XMIT:
|
||||||
|
@ -625,11 +639,11 @@ ExecContext::setIpr(int idx, uint64_t val)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// invalid IPR
|
// invalid IPR
|
||||||
return UnimplementedOpcodeFault;
|
return Unimplemented_Opcode_Fault;
|
||||||
}
|
}
|
||||||
|
|
||||||
// no error...
|
// no error...
|
||||||
return NoFault;
|
return No_Fault;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -137,8 +137,6 @@ FullO3CPU<Impl>::FullO3CPU(Params ¶ms)
|
||||||
system->execContexts[i] =
|
system->execContexts[i] =
|
||||||
new ExecContext(this, i, system, itb, dtb, mem);
|
new ExecContext(this, i, system, itb, dtb, mem);
|
||||||
|
|
||||||
// initialize CPU, including PC
|
|
||||||
TheISA::initCPU(&system->execContexts[i]->regs);
|
|
||||||
execContexts.push_back(system->execContexts[i]);
|
execContexts.push_back(system->execContexts[i]);
|
||||||
#else
|
#else
|
||||||
if (i < params.workload.size()) {
|
if (i < params.workload.size()) {
|
||||||
|
@ -250,6 +248,7 @@ FullO3CPU<Impl>::init()
|
||||||
// that it can start properly.
|
// that it can start properly.
|
||||||
#if FULL_SYSTEM
|
#if FULL_SYSTEM
|
||||||
ExecContext *src_xc = system->execContexts[0];
|
ExecContext *src_xc = system->execContexts[0];
|
||||||
|
TheISA::initCPU(&src_xc->regs, src_xc->cpu_id);
|
||||||
#else
|
#else
|
||||||
ExecContext *src_xc = thread[0];
|
ExecContext *src_xc = thread[0];
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -84,6 +84,21 @@ SimpleCPU::TickEvent::TickEvent(SimpleCPU *c, int w)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
SimpleCPU::init()
|
||||||
|
{
|
||||||
|
BaseCPU::init();
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
for (int i = 0; i < execContexts.size(); ++i) {
|
||||||
|
ExecContext *xc = execContexts[i];
|
||||||
|
|
||||||
|
// initialize CPU, including PC
|
||||||
|
TheISA::initCPU(&xc->regs, xc->cpu_id);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SimpleCPU::TickEvent::process()
|
SimpleCPU::TickEvent::process()
|
||||||
{
|
{
|
||||||
|
@ -124,8 +139,6 @@ SimpleCPU::SimpleCPU(Params *p)
|
||||||
#if FULL_SYSTEM
|
#if FULL_SYSTEM
|
||||||
xc = new ExecContext(this, 0, p->system, p->itb, p->dtb, p->mem);
|
xc = new ExecContext(this, 0, p->system, p->itb, p->dtb, p->mem);
|
||||||
|
|
||||||
// initialize CPU, including PC
|
|
||||||
initCPU(&xc->regs);
|
|
||||||
#else
|
#else
|
||||||
xc = new ExecContext(this, /* thread_num */ 0, p->process, /* asid */ 0);
|
xc = new ExecContext(this, /* thread_num */ 0, p->process, /* asid */ 0);
|
||||||
#endif // !FULL_SYSTEM
|
#endif // !FULL_SYSTEM
|
||||||
|
|
|
@ -68,6 +68,7 @@ class SimpleCPU : public BaseCPU
|
||||||
public:
|
public:
|
||||||
// main simulation loop (one cycle)
|
// main simulation loop (one cycle)
|
||||||
void tick();
|
void tick();
|
||||||
|
virtual void init();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct TickEvent : public Event
|
struct TickEvent : public Event
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
* System Console Memory Mapped Register Definition
|
* System Console Memory Mapped Register Definition
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define ALPHA_ACCESS_VERSION (1303)
|
#define ALPHA_ACCESS_VERSION (1305)
|
||||||
|
|
||||||
#ifdef CONSOLE
|
#ifdef CONSOLE
|
||||||
typedef unsigned uint32_t;
|
typedef unsigned uint32_t;
|
||||||
|
@ -67,9 +67,7 @@ struct AlphaAccess
|
||||||
uint64_t inputChar; // 68: Placeholder for input
|
uint64_t inputChar; // 68: Placeholder for input
|
||||||
|
|
||||||
// MP boot
|
// MP boot
|
||||||
uint64_t bootStrapImpure; // 70:
|
uint64_t cpuStack[64]; // 70:
|
||||||
uint32_t bootStrapCPU; // 78:
|
|
||||||
uint32_t align2; // 7C: Dummy placeholder for alignment
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __ALPHA_ACCESS_H__
|
#endif // __ALPHA_ACCESS_H__
|
||||||
|
|
|
@ -81,9 +81,7 @@ AlphaConsole::AlphaConsole(const string &name, SimConsole *cons, SimpleDisk *d,
|
||||||
alphaAccess->diskOperation = 0;
|
alphaAccess->diskOperation = 0;
|
||||||
alphaAccess->outputChar = 0;
|
alphaAccess->outputChar = 0;
|
||||||
alphaAccess->inputChar = 0;
|
alphaAccess->inputChar = 0;
|
||||||
alphaAccess->bootStrapImpure = 0;
|
bzero(alphaAccess->cpuStack, sizeof(alphaAccess->cpuStack));
|
||||||
alphaAccess->bootStrapCPU = 0;
|
|
||||||
alphaAccess->align2 = 0;
|
|
||||||
|
|
||||||
system->setAlphaAccess(addr);
|
system->setAlphaAccess(addr);
|
||||||
}
|
}
|
||||||
|
@ -123,9 +121,6 @@ AlphaConsole::read(MemReqPtr &req, uint8_t *data)
|
||||||
case offsetof(AlphaAccess, numCPUs):
|
case offsetof(AlphaAccess, numCPUs):
|
||||||
*(uint32_t*)data = alphaAccess->numCPUs;
|
*(uint32_t*)data = alphaAccess->numCPUs;
|
||||||
break;
|
break;
|
||||||
case offsetof(AlphaAccess, bootStrapCPU):
|
|
||||||
*(uint32_t*)data = alphaAccess->bootStrapCPU;
|
|
||||||
break;
|
|
||||||
case offsetof(AlphaAccess, intrClockFrequency):
|
case offsetof(AlphaAccess, intrClockFrequency):
|
||||||
*(uint32_t*)data = alphaAccess->intrClockFrequency;
|
*(uint32_t*)data = alphaAccess->intrClockFrequency;
|
||||||
break;
|
break;
|
||||||
|
@ -176,11 +171,14 @@ AlphaConsole::read(MemReqPtr &req, uint8_t *data)
|
||||||
case offsetof(AlphaAccess, outputChar):
|
case offsetof(AlphaAccess, outputChar):
|
||||||
*(uint64_t*)data = alphaAccess->outputChar;
|
*(uint64_t*)data = alphaAccess->outputChar;
|
||||||
break;
|
break;
|
||||||
case offsetof(AlphaAccess, bootStrapImpure):
|
|
||||||
*(uint64_t*)data = alphaAccess->bootStrapImpure;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
panic("Unknown 64bit access, %#x\n", daddr);
|
int cpunum = (daddr - offsetof(AlphaAccess, cpuStack)) /
|
||||||
|
sizeof(alphaAccess->cpuStack[0]);
|
||||||
|
|
||||||
|
if (cpunum >= 0 && cpunum < 64)
|
||||||
|
*(uint64_t*)data = alphaAccess->cpuStack[cpunum];
|
||||||
|
else
|
||||||
|
panic("Unknown 64bit access, %#x\n", daddr);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -240,24 +238,18 @@ AlphaConsole::write(MemReqPtr &req, const uint8_t *data)
|
||||||
console->out((char)(val & 0xff));
|
console->out((char)(val & 0xff));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case offsetof(AlphaAccess, bootStrapImpure):
|
|
||||||
alphaAccess->bootStrapImpure = val;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case offsetof(AlphaAccess, bootStrapCPU):
|
|
||||||
warn("%d: Trying to launch another CPU!", curTick);
|
|
||||||
assert(val > 0 && "Must not access primary cpu");
|
|
||||||
|
|
||||||
other_xc = req->xc->system->execContexts[val];
|
|
||||||
other_xc->regs.intRegFile[16] = val;
|
|
||||||
other_xc->regs.ipr[TheISA::IPR_PALtemp16] = val;
|
|
||||||
other_xc->regs.intRegFile[0] = val;
|
|
||||||
other_xc->regs.intRegFile[30] = alphaAccess->bootStrapImpure;
|
|
||||||
other_xc->activate(); //Start the cpu
|
other_xc->activate(); //Start the cpu
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return MachineCheckFault;
|
int cpunum = (daddr - offsetof(AlphaAccess, cpuStack)) /
|
||||||
|
sizeof(alphaAccess->cpuStack[0]);
|
||||||
|
warn("%d: Trying to launch CPU number %d!", curTick, cpunum);
|
||||||
|
assert(val > 0 && "Must not access primary cpu");
|
||||||
|
if (cpunum >= 0 && cpunum < 64)
|
||||||
|
alphaAccess->cpuStack[cpunum] = val;
|
||||||
|
else
|
||||||
|
panic("Unknown 64bit access, %#x\n", daddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NoFault;
|
return NoFault;
|
||||||
|
@ -288,8 +280,7 @@ AlphaConsole::Access::serialize(ostream &os)
|
||||||
SERIALIZE_SCALAR(diskOperation);
|
SERIALIZE_SCALAR(diskOperation);
|
||||||
SERIALIZE_SCALAR(outputChar);
|
SERIALIZE_SCALAR(outputChar);
|
||||||
SERIALIZE_SCALAR(inputChar);
|
SERIALIZE_SCALAR(inputChar);
|
||||||
SERIALIZE_SCALAR(bootStrapImpure);
|
SERIALIZE_ARRAY(cpuStack,64);
|
||||||
SERIALIZE_SCALAR(bootStrapCPU);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -311,8 +302,7 @@ AlphaConsole::Access::unserialize(Checkpoint *cp, const std::string §ion)
|
||||||
UNSERIALIZE_SCALAR(diskOperation);
|
UNSERIALIZE_SCALAR(diskOperation);
|
||||||
UNSERIALIZE_SCALAR(outputChar);
|
UNSERIALIZE_SCALAR(outputChar);
|
||||||
UNSERIALIZE_SCALAR(inputChar);
|
UNSERIALIZE_SCALAR(inputChar);
|
||||||
UNSERIALIZE_SCALAR(bootStrapImpure);
|
UNSERIALIZE_ARRAY(cpuStack, 64);
|
||||||
UNSERIALIZE_SCALAR(bootStrapCPU);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -96,7 +96,7 @@ class AlphaConsole : public PioDevice
|
||||||
BaseCPU *cpu;
|
BaseCPU *cpu;
|
||||||
|
|
||||||
Addr addr;
|
Addr addr;
|
||||||
static const Addr size = 0x80; // equal to sizeof(alpha_access);
|
static const Addr size = sizeof(struct AlphaAccess);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** Standard Constructor */
|
/** Standard Constructor */
|
||||||
|
|
|
@ -307,11 +307,9 @@ System::registerExecContext(ExecContext *xc, int id)
|
||||||
void
|
void
|
||||||
System::startup()
|
System::startup()
|
||||||
{
|
{
|
||||||
if (!execContexts.empty()) {
|
int i;
|
||||||
// activate with zero delay so that we start ticking right
|
for (i = 0; i < execContexts.size(); i++)
|
||||||
// away on cycle 0
|
execContexts[i]->activate(0);
|
||||||
execContexts[0]->activate(0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in a new issue