Make FullCPU schedule its TickEvent when one of its contexts becomes active.
This fixes detailed-mpboot, which was broken as of my last change. Also clean up some of the ExecContext status initialization. cpu/base_cpu.hh: CPU::execCtxStatusChg() now takes thread_num as an arg so the CPU knows which execContext had the status change. BaseCPU::registerExecContexts() no longer needs to be virtual. cpu/exec_context.cc: Initialize _status directly... don't use setStatus() as this will notify the CPU of the change before it is ready. CPU::execCtxStatusChg() now takes thread_num as an arg so the CPU knows which execContext had the status change. cpu/exec_context.hh: Don't need initStatus() any more. cpu/simple_cpu/simple_cpu.cc: Move execCtxStatusChg() from header to .cc file. No longer need specialized version of registerExecContexts to schedule TickEvent. cpu/simple_cpu/simple_cpu.hh: Move execCtxStatusChg() from header to .cc file. CPU::execCtxStatusChg() now takes thread_num as arg (must be 0 for SimpleCPU). No longer need specialized version of registerExecContexts to schedule TickEvent. kern/tru64/tru64_system.cc: Don't need initRegs; the PC etc. get initialized in the CPU constructor. ExecContexts start out as Unallocated, so no need to set them to Unallocated here. kern/tru64/tru64_system.hh: Don't need initRegs; the PC etc. get initialized in the CPU constructor. sim/prog.cc: ExecContexts start out as Unallocated, so no need to set them to Unallocated here. --HG-- extra : convert_revision : e960ebbeb845960344633798e251b6c8bf1c0378
This commit is contained in:
parent
cd6b6df581
commit
91cb532f9f
8 changed files with 23 additions and 63 deletions
|
@ -73,7 +73,7 @@ class BaseCPU : public SimObject
|
||||||
std::vector<ExecContext *> execContexts;
|
std::vector<ExecContext *> execContexts;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual void execCtxStatusChg() {}
|
virtual void execCtxStatusChg(int thread_num) {}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ class BaseCPU : public SimObject
|
||||||
|
|
||||||
virtual void regStats();
|
virtual void regStats();
|
||||||
|
|
||||||
virtual void registerExecContexts();
|
void registerExecContexts();
|
||||||
|
|
||||||
/// Prepare for another CPU to take over execution. Called by
|
/// Prepare for another CPU to take over execution. Called by
|
||||||
/// takeOverFrom() on its argument.
|
/// takeOverFrom() on its argument.
|
||||||
|
|
|
@ -44,24 +44,22 @@ using namespace std;
|
||||||
ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num, System *_sys,
|
ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num, System *_sys,
|
||||||
AlphaItb *_itb, AlphaDtb *_dtb,
|
AlphaItb *_itb, AlphaDtb *_dtb,
|
||||||
FunctionalMemory *_mem)
|
FunctionalMemory *_mem)
|
||||||
: kernelStats(this, _cpu), cpu(_cpu), thread_num(_thread_num),
|
: _status(ExecContext::Unallocated),
|
||||||
|
kernelStats(this, _cpu), cpu(_cpu), thread_num(_thread_num),
|
||||||
cpu_id(-1), mem(_mem), itb(_itb), dtb(_dtb), system(_sys),
|
cpu_id(-1), mem(_mem), itb(_itb), dtb(_dtb), system(_sys),
|
||||||
memCtrl(_sys->memCtrl), physmem(_sys->physmem),
|
memCtrl(_sys->memCtrl), physmem(_sys->physmem),
|
||||||
func_exe_insn(0), storeCondFailures(0)
|
func_exe_insn(0), storeCondFailures(0)
|
||||||
{
|
{
|
||||||
memset(®s, 0, sizeof(RegFile));
|
memset(®s, 0, sizeof(RegFile));
|
||||||
setStatus(ExecContext::Unallocated);
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num,
|
ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num,
|
||||||
Process *_process, int _asid)
|
Process *_process, int _asid)
|
||||||
: cpu(_cpu), thread_num(_thread_num), cpu_id(-1),
|
: _status(ExecContext::Unallocated),
|
||||||
process(_process), asid (_asid),
|
cpu(_cpu), thread_num(_thread_num), cpu_id(-1),
|
||||||
|
process(_process), mem(process->getMemory()), asid(_asid),
|
||||||
func_exe_insn(0), storeCondFailures(0)
|
func_exe_insn(0), storeCondFailures(0)
|
||||||
{
|
{
|
||||||
setStatus(ExecContext::Unallocated);
|
|
||||||
|
|
||||||
mem = process->getMemory();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num,
|
ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num,
|
||||||
|
@ -114,7 +112,7 @@ ExecContext::setStatus(Status new_status)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_status = new_status;
|
_status = new_status;
|
||||||
cpu->execCtxStatusChg();
|
cpu->execCtxStatusChg(thread_num);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -68,10 +68,6 @@ class ExecContext
|
||||||
public:
|
public:
|
||||||
Status status() const { return _status; }
|
Status status() const { return _status; }
|
||||||
|
|
||||||
// Unlike setStatus(), initStatus() has no side effects other than
|
|
||||||
// setting the _status variable.
|
|
||||||
void initStatus(Status init_status) { _status = init_status; }
|
|
||||||
|
|
||||||
void setStatus(Status new_status);
|
void setStatus(Status new_status);
|
||||||
|
|
||||||
#ifdef FULL_SYSTEM
|
#ifdef FULL_SYSTEM
|
||||||
|
|
|
@ -163,25 +163,6 @@ SimpleCPU::~SimpleCPU()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
SimpleCPU::registerExecContexts()
|
|
||||||
{
|
|
||||||
BaseCPU::registerExecContexts();
|
|
||||||
|
|
||||||
// if any of this CPU's ExecContexts are active, mark the CPU as
|
|
||||||
// running and schedule its tick event.
|
|
||||||
for (int i = 0; i < execContexts.size(); ++i) {
|
|
||||||
ExecContext *xc = execContexts[i];
|
|
||||||
if (xc->status() == ExecContext::Active && _status != Running) {
|
|
||||||
_status = Running;
|
|
||||||
// this should only happen at initialization time
|
|
||||||
assert(curTick == 0);
|
|
||||||
tickEvent.schedule(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
SimpleCPU::switchOut()
|
SimpleCPU::switchOut()
|
||||||
{
|
{
|
||||||
|
@ -212,6 +193,18 @@ SimpleCPU::takeOverFrom(BaseCPU *oldCPU)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
SimpleCPU::execCtxStatusChg(int thread_num) {
|
||||||
|
assert(thread_num == 0);
|
||||||
|
assert(xc);
|
||||||
|
|
||||||
|
if (xc->status() == ExecContext::Active)
|
||||||
|
setStatus(Running);
|
||||||
|
else
|
||||||
|
setStatus(Idle);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
SimpleCPU::regStats()
|
SimpleCPU::regStats()
|
||||||
{
|
{
|
||||||
|
|
|
@ -136,8 +136,6 @@ class SimpleCPU : public BaseCPU
|
||||||
// execution context
|
// execution context
|
||||||
ExecContext *xc;
|
ExecContext *xc;
|
||||||
|
|
||||||
void registerExecContexts();
|
|
||||||
|
|
||||||
void switchOut();
|
void switchOut();
|
||||||
void takeOverFrom(BaseCPU *oldCPU);
|
void takeOverFrom(BaseCPU *oldCPU);
|
||||||
|
|
||||||
|
@ -178,14 +176,7 @@ class SimpleCPU : public BaseCPU
|
||||||
|
|
||||||
Status status() const { return _status; }
|
Status status() const { return _status; }
|
||||||
|
|
||||||
virtual void execCtxStatusChg() {
|
virtual void execCtxStatusChg(int thread_num);
|
||||||
if (xc) {
|
|
||||||
if (xc->status() == ExecContext::Active)
|
|
||||||
setStatus(Running);
|
|
||||||
else
|
|
||||||
setStatus(Idle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setStatus(Status new_status) {
|
void setStatus(Status new_status) {
|
||||||
Status old_status = status();
|
Status old_status = status();
|
||||||
|
|
|
@ -72,10 +72,6 @@ Tru64System::Tru64System(const string _name, const uint64_t _init_param,
|
||||||
fatal("Could not load PALcode file %s", palcode);
|
fatal("Could not load PALcode file %s", palcode);
|
||||||
pal->loadSections(physmem, true);
|
pal->loadSections(physmem, true);
|
||||||
|
|
||||||
// copy of initial reg file contents
|
|
||||||
initRegs = new RegFile;
|
|
||||||
memset(initRegs, 0, sizeof(RegFile));
|
|
||||||
|
|
||||||
// Load console file
|
// Load console file
|
||||||
console->loadSections(physmem, true);
|
console->loadSections(physmem, true);
|
||||||
|
|
||||||
|
@ -90,10 +86,6 @@ Tru64System::Tru64System(const string _name, const uint64_t _init_param,
|
||||||
"Kernel entry = %#x\n",
|
"Kernel entry = %#x\n",
|
||||||
kernelStart, kernelEnd, kernelEntry);
|
kernelStart, kernelEnd, kernelEntry);
|
||||||
|
|
||||||
// Setup kernel boot parameters
|
|
||||||
initRegs->pc = 0x4001;
|
|
||||||
initRegs->npc = initRegs->pc + sizeof(MachInst);
|
|
||||||
|
|
||||||
DPRINTF(Loader, "Kernel loaded...\n");
|
DPRINTF(Loader, "Kernel loaded...\n");
|
||||||
|
|
||||||
kernelPanicEvent = new BreakPCEvent(&pcEventQueue, "kernel panic");
|
kernelPanicEvent = new BreakPCEvent(&pcEventQueue, "kernel panic");
|
||||||
|
@ -164,8 +156,6 @@ Tru64System::Tru64System(const string _name, const uint64_t _init_param,
|
||||||
|
|
||||||
Tru64System::~Tru64System()
|
Tru64System::~Tru64System()
|
||||||
{
|
{
|
||||||
delete initRegs;
|
|
||||||
|
|
||||||
delete kernel;
|
delete kernel;
|
||||||
delete console;
|
delete console;
|
||||||
|
|
||||||
|
@ -190,11 +180,7 @@ Tru64System::registerExecContext(ExecContext *xc)
|
||||||
int xcIndex = System::registerExecContext(xc);
|
int xcIndex = System::registerExecContext(xc);
|
||||||
|
|
||||||
if (xcIndex == 0) {
|
if (xcIndex == 0) {
|
||||||
// xc->regs = *initRegs;
|
xc->setStatus(ExecContext::Active);
|
||||||
xc->initStatus(ExecContext::Active);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
xc->initStatus(ExecContext::Unallocated);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RemoteGDB *rgdb = new RemoteGDB(this, xc);
|
RemoteGDB *rgdb = new RemoteGDB(this, xc);
|
||||||
|
|
|
@ -67,7 +67,6 @@ class Tru64System : public System
|
||||||
DumpMbufEvent *dumpMbufEvent;
|
DumpMbufEvent *dumpMbufEvent;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RegFile *initRegs;
|
|
||||||
|
|
||||||
Addr kernelStart;
|
Addr kernelStart;
|
||||||
Addr kernelEnd;
|
Addr kernelEnd;
|
||||||
|
|
|
@ -148,10 +148,7 @@ Process::registerExecContext(ExecContext *xc)
|
||||||
xc->regs = *init_regs;
|
xc->regs = *init_regs;
|
||||||
|
|
||||||
// mark this context as active
|
// mark this context as active
|
||||||
xc->initStatus(ExecContext::Active);
|
xc->setStatus(ExecContext::Active);
|
||||||
}
|
|
||||||
else {
|
|
||||||
xc->initStatus(ExecContext::Unallocated);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// return CPU number to caller and increment available CPU count
|
// return CPU number to caller and increment available CPU count
|
||||||
|
|
Loading…
Reference in a new issue