#include "base/bitfield.hh"
#include "base/trace.hh"
#include "cpu/base.hh"
-#include "cpu/exec_context.hh"
+#include "cpu/thread_context.hh"
#include "sim/system.hh"
using namespace std;
-using namespace AlphaISA;
-ProcessInfo::ProcessInfo(ExecContext *_xc)
- : xc(_xc)
+namespace AlphaISA {
+
+ProcessInfo::ProcessInfo(ThreadContext *_tc)
+ : tc(_tc)
{
Addr addr = 0;
+ VirtualPort *vp = tc->getVirtPort();
+ SymbolTable *symtab = tc->getSystemPtr()->kernelSymtab;
- if (!xc->getSystemPtr()->kernelSymtab->findAddress("thread_info_size", addr))
+ if (!symtab->findAddress("thread_info_size", addr))
panic("thread info not compiled into kernel\n");
- thread_info_size = gtoh(xc->getVirtPort()->read<int32_t>(addr));
+ thread_info_size = vp->readGtoH<int32_t>(addr);
- if (!xc->getSystemPtr()->kernelSymtab->findAddress("task_struct_size", addr))
+ if (!symtab->findAddress("task_struct_size", addr))
panic("thread info not compiled into kernel\n");
- task_struct_size = gtoh(xc->getVirtPort()->read<int32_t>(addr));
+ task_struct_size = vp->readGtoH<int32_t>(addr);
- if (!xc->getSystemPtr()->kernelSymtab->findAddress("thread_info_task", addr))
+ if (!symtab->findAddress("thread_info_task", addr))
panic("thread info not compiled into kernel\n");
- task_off = gtoh(xc->getVirtPort()->read<int32_t>(addr));
+ task_off = vp->readGtoH<int32_t>(addr);
- if (!xc->getSystemPtr()->kernelSymtab->findAddress("task_struct_pid", addr))
+ if (!symtab->findAddress("task_struct_pid", addr))
panic("thread info not compiled into kernel\n");
- pid_off = gtoh(xc->getVirtPort()->read<int32_t>(addr));
+ pid_off = vp->readGtoH<int32_t>(addr);
- if (!xc->getSystemPtr()->kernelSymtab->findAddress("task_struct_comm", addr))
+ if (!symtab->findAddress("task_struct_comm", addr))
panic("thread info not compiled into kernel\n");
- name_off = gtoh(xc->getVirtPort()->read<int32_t>(addr));
+ name_off = vp->readGtoH<int32_t>(addr);
}
Addr
if (base == ULL(0xfffffc0000000000))
return 0;
- return gtoh(xc->getVirtPort()->read<Addr>(base + task_off));
+ Addr tsk;
+
+ VirtualPort *vp;
+
+ vp = tc->getVirtPort();
+ tsk = vp->readGtoH<Addr>(base + task_off);
+
+ return tsk;
}
int
if (!task)
return -1;
- return gtoh(xc->getVirtPort()->read<uint16_t>(task + pid_off));
+ uint16_t pd;
+
+ VirtualPort *vp;
+
+ vp = tc->getVirtPort();
+ pd = vp->readGtoH<uint16_t>(task + pid_off);
+
+ return pd;
}
string
return "console";
char comm[256];
- CopyStringOut(xc, comm, task + name_off, sizeof(comm));
+ CopyStringOut(tc, comm, task + name_off, sizeof(comm));
if (!comm[0])
return "startup";
}
StackTrace::StackTrace()
- : xc(0), stack(64)
+ : tc(0), stack(64)
{
}
-StackTrace::StackTrace(ExecContext *_xc, StaticInstPtr inst)
- : xc(0), stack(64)
+StackTrace::StackTrace(ThreadContext *_tc, StaticInstPtr inst)
+ : tc(0), stack(64)
{
- trace(_xc, inst);
+ trace(_tc, inst);
}
StackTrace::~StackTrace()
}
void
-StackTrace::trace(ExecContext *_xc, bool is_call)
+StackTrace::trace(ThreadContext *_tc, bool is_call)
{
- xc = _xc;
+ tc = _tc;
+
+ System *sys = tc->getSystemPtr();
- bool usermode = (xc->readMiscReg(AlphaISA::IPR_DTB_CM) & 0x18) != 0;
+ bool usermode =
+ (tc->readMiscRegNoEffect(IPR_DTB_CM) & 0x18) != 0;
- Addr pc = xc->readNextPC();
- bool kernel = xc->getSystemPtr()->kernelStart <= pc &&
- pc <= xc->getSystemPtr()->kernelEnd;
+ Addr pc = tc->readNextPC();
+ bool kernel = sys->kernelStart <= pc && pc <= sys->kernelEnd;
if (usermode) {
stack.push_back(user);
return;
}
- SymbolTable *symtab = xc->getSystemPtr()->kernelSymtab;
- Addr ksp = xc->readIntReg(TheISA::StackPointerReg);
+ SymbolTable *symtab = sys->kernelSymtab;
+ Addr ksp = tc->readIntReg(StackPointerReg);
Addr bottom = ksp & ~0x3fff;
- Addr addr;
if (is_call) {
+ Addr addr;
if (!symtab->findNearestAddr(pc, addr))
panic("could not find address %#x", pc);
stack.push_back(addr);
- pc = xc->readPC();
+ pc = tc->readPC();
}
- Addr ra;
- int size;
-
while (ksp > bottom) {
+ Addr addr;
if (!symtab->findNearestAddr(pc, addr))
panic("could not find symbol for pc=%#x", pc);
assert(pc >= addr && "symbol botch: callpc < func");
if (isEntry(addr))
return;
+ Addr ra;
+ int size;
if (decodePrologue(ksp, pc, addr, size, ra)) {
if (!ra)
return;
return;
}
- bool kernel = xc->getSystemPtr()->kernelStart <= pc &&
- pc <= xc->getSystemPtr()->kernelEnd;
+ bool kernel = sys->kernelStart <= pc && pc <= sys->kernelEnd;
if (!kernel)
return;
bool
StackTrace::isEntry(Addr addr)
{
- if (addr == xc->readMiscReg(AlphaISA::IPR_PALtemp12))
+ if (addr == tc->readMiscRegNoEffect(IPR_PALtemp12))
return true;
- if (addr == xc->readMiscReg(AlphaISA::IPR_PALtemp7))
+ if (addr == tc->readMiscRegNoEffect(IPR_PALtemp7))
return true;
- if (addr == xc->readMiscReg(AlphaISA::IPR_PALtemp11))
+ if (addr == tc->readMiscRegNoEffect(IPR_PALtemp11))
return true;
- if (addr == xc->readMiscReg(AlphaISA::IPR_PALtemp21))
+ if (addr == tc->readMiscRegNoEffect(IPR_PALtemp21))
return true;
- if (addr == xc->readMiscReg(AlphaISA::IPR_PALtemp9))
+ if (addr == tc->readMiscRegNoEffect(IPR_PALtemp9))
return true;
- if (addr == xc->readMiscReg(AlphaISA::IPR_PALtemp2))
+ if (addr == tc->readMiscRegNoEffect(IPR_PALtemp2))
return true;
return false;
* which registers are stored where, and how large the stack frame is.
*/
bool
-StackTrace::decodePrologue(Addr sp, Addr callpc, Addr func,
- int &size, Addr &ra)
+StackTrace::decodePrologue(Addr sp, Addr callpc, Addr func, int &size,
+ Addr &ra)
{
size = 0;
ra = 0;
for (Addr pc = func; pc < callpc; pc += sizeof(MachInst)) {
MachInst inst;
- CopyOut(xc, (uint8_t *)&inst, pc, sizeof(MachInst));
+ CopyOut(tc, (uint8_t *)&inst, pc, sizeof(MachInst));
int reg, disp;
if (decodeStack(inst, disp)) {
size += disp;
} else if (decodeSave(inst, reg, disp)) {
if (!ra && reg == ReturnAddressReg) {
- CopyOut(xc, (uint8_t *)&ra, sp + disp, sizeof(Addr));
+ CopyOut(tc, (uint8_t *)&ra, sp + disp, sizeof(Addr));
if (!ra) {
// panic("no return address value pc=%#x\n", pc);
return false;
void
StackTrace::dump()
{
- StringWrap name(xc->getCpuPtr()->name());
- SymbolTable *symtab = xc->getSystemPtr()->kernelSymtab;
+ StringWrap name(tc->getCpuPtr()->name());
+ SymbolTable *symtab = tc->getSystemPtr()->kernelSymtab;
DPRINTFN("------ Stack ------\n");
}
}
#endif
+
+} // namespace AlphaISA