Merge gblack@m5.eecs.umich.edu:/bk/multiarch
into ewok.(none):/home/gblack/m5/multiarch --HG-- extra : convert_revision : f6db244a66431dd6b8c5ba251ed02d76cd509cff
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2005 The Regents of The University of Michigan
|
||||
* Copyright (c) 2001-2006 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -35,6 +35,7 @@
|
||||
#include "base/callback.hh"
|
||||
#include "base/cprintf.hh"
|
||||
#include "base/output.hh"
|
||||
#include "base/trace.hh"
|
||||
#include "cpu/profile.hh"
|
||||
#include "kern/kernel_stats.hh"
|
||||
#include "sim/serialize.hh"
|
||||
@@ -53,10 +54,10 @@ ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num, System *_sys,
|
||||
AlphaITB *_itb, AlphaDTB *_dtb,
|
||||
FunctionalMemory *_mem)
|
||||
: _status(ExecContext::Unallocated), cpu(_cpu), thread_num(_thread_num),
|
||||
cpu_id(-1), mem(_mem), itb(_itb), dtb(_dtb), system(_sys),
|
||||
memctrl(_sys->memctrl), physmem(_sys->physmem),
|
||||
cpu_id(-1), lastActivate(0), lastSuspend(0), mem(_mem), itb(_itb),
|
||||
dtb(_dtb), system(_sys), memctrl(_sys->memctrl), physmem(_sys->physmem),
|
||||
kernelBinning(system->kernelBinning), bin(kernelBinning->bin),
|
||||
fnbin(kernelBinning->fnbin), profile(NULL),
|
||||
fnbin(kernelBinning->fnbin), profile(NULL), quiesceEvent(this),
|
||||
func_exe_inst(0), storeCondFailures(0)
|
||||
{
|
||||
kernelStats = new Kernel::Statistics(this);
|
||||
@@ -79,8 +80,8 @@ ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num, System *_sys,
|
||||
ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num,
|
||||
Process *_process, int _asid)
|
||||
: _status(ExecContext::Unallocated),
|
||||
cpu(_cpu), thread_num(_thread_num), cpu_id(-1),
|
||||
process(_process), mem(process->getMemory()), asid(_asid),
|
||||
cpu(_cpu), thread_num(_thread_num), cpu_id(-1), lastActivate(0),
|
||||
lastSuspend(0), process(_process), mem(process->getMemory()), asid(_asid),
|
||||
func_exe_inst(0), storeCondFailures(0)
|
||||
{
|
||||
memset(®s, 0, sizeof(RegFile));
|
||||
@@ -109,6 +110,23 @@ ExecContext::dumpFuncProfile()
|
||||
std::ostream *os = simout.create(csprintf("profile.%s.dat", cpu->name()));
|
||||
profile->dump(this, *os);
|
||||
}
|
||||
|
||||
ExecContext::EndQuiesceEvent::EndQuiesceEvent(ExecContext *_xc)
|
||||
: Event(&mainEventQueue), xc(_xc)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
ExecContext::EndQuiesceEvent::process()
|
||||
{
|
||||
xc->activate();
|
||||
}
|
||||
|
||||
const char*
|
||||
ExecContext::EndQuiesceEvent::description()
|
||||
{
|
||||
return "End Quiesce Event.";
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
@@ -143,7 +161,12 @@ ExecContext::serialize(ostream &os)
|
||||
SERIALIZE_SCALAR(inst);
|
||||
|
||||
#if FULL_SYSTEM
|
||||
Tick quiesceEndTick = 0;
|
||||
if (quiesceEvent.scheduled())
|
||||
quiesceEndTick = quiesceEvent.when();
|
||||
SERIALIZE_SCALAR(quiesceEndTick);
|
||||
kernelStats->serialize(os);
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -158,6 +181,11 @@ ExecContext::unserialize(Checkpoint *cp, const std::string §ion)
|
||||
UNSERIALIZE_SCALAR(inst);
|
||||
|
||||
#if FULL_SYSTEM
|
||||
Tick quiesceEndTick;
|
||||
UNSERIALIZE_SCALAR(quiesceEndTick);
|
||||
if (quiesceEndTick)
|
||||
quiesceEvent.schedule(quiesceEndTick);
|
||||
|
||||
kernelStats->unserialize(cp, section);
|
||||
#endif
|
||||
}
|
||||
@@ -169,6 +197,8 @@ ExecContext::activate(int delay)
|
||||
if (status() == Active)
|
||||
return;
|
||||
|
||||
lastActivate = curTick;
|
||||
|
||||
_status = Active;
|
||||
cpu->activateContext(thread_num, delay);
|
||||
}
|
||||
@@ -179,6 +209,9 @@ ExecContext::suspend()
|
||||
if (status() == Suspended)
|
||||
return;
|
||||
|
||||
lastActivate = curTick;
|
||||
lastSuspend = curTick;
|
||||
/*
|
||||
#if FULL_SYSTEM
|
||||
// Don't change the status from active if there are pending interrupts
|
||||
if (cpu->check_interrupts()) {
|
||||
@@ -186,7 +219,7 @@ ExecContext::suspend()
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
*/
|
||||
_status = Suspended;
|
||||
cpu->suspendContext(thread_num);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2005 The Regents of The University of Michigan
|
||||
* Copyright (c) 2001-2006 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -32,6 +32,7 @@
|
||||
#include "config/full_system.hh"
|
||||
#include "mem/functional/functional.hh"
|
||||
#include "mem/mem_req.hh"
|
||||
#include "sim/eventq.hh"
|
||||
#include "sim/host.hh"
|
||||
#include "sim/serialize.hh"
|
||||
#include "arch/isa_traits.hh"
|
||||
@@ -132,6 +133,9 @@ class ExecContext
|
||||
// it belongs. For full-system mode, this is the system CPU ID.
|
||||
int cpu_id;
|
||||
|
||||
Tick lastActivate;
|
||||
Tick lastSuspend;
|
||||
|
||||
#if FULL_SYSTEM
|
||||
FunctionalMemory *mem;
|
||||
AlphaITB *itb;
|
||||
@@ -154,6 +158,22 @@ class ExecContext
|
||||
Addr profilePC;
|
||||
void dumpFuncProfile();
|
||||
|
||||
/** Event for timing out quiesce instruction */
|
||||
struct EndQuiesceEvent : public Event
|
||||
{
|
||||
/** A pointer to the execution context that is quiesced */
|
||||
ExecContext *xc;
|
||||
|
||||
EndQuiesceEvent(ExecContext *_xc);
|
||||
|
||||
/** Event process to occur at interrupt*/
|
||||
virtual void process();
|
||||
|
||||
/** Event description */
|
||||
virtual const char *description();
|
||||
};
|
||||
EndQuiesceEvent quiesceEvent;
|
||||
|
||||
#else
|
||||
Process *process;
|
||||
|
||||
|
||||
@@ -347,12 +347,12 @@ SimpleCPU::copySrcTranslate(Addr src)
|
||||
// translate to physical address
|
||||
Fault fault = xc->translateDataReadReq(memReq);
|
||||
|
||||
assert(!fault->isAlignmentFault());
|
||||
|
||||
if (fault == NoFault) {
|
||||
xc->copySrcAddr = src;
|
||||
xc->copySrcPhysAddr = memReq->paddr + offset;
|
||||
} else {
|
||||
assert(!fault->isAlignmentFault());
|
||||
|
||||
xc->copySrcAddr = 0;
|
||||
xc->copySrcPhysAddr = 0;
|
||||
}
|
||||
@@ -382,8 +382,6 @@ SimpleCPU::copy(Addr dest)
|
||||
// translate to physical address
|
||||
Fault fault = xc->translateDataWriteReq(memReq);
|
||||
|
||||
assert(!fault->isAlignmentFault());
|
||||
|
||||
if (fault == NoFault) {
|
||||
Addr dest_addr = memReq->paddr + offset;
|
||||
// Need to read straight from memory since we have more than 8 bytes.
|
||||
@@ -402,6 +400,9 @@ SimpleCPU::copy(Addr dest)
|
||||
dcacheInterface->access(memReq);
|
||||
}
|
||||
}
|
||||
else
|
||||
assert(!fault->isAlignmentFault());
|
||||
|
||||
return fault;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user