43d42
< using namespace AlphaISA;
45,46c44
< ProcessInfo::ProcessInfo(ThreadContext *_tc)
< : tc(_tc)
---
> namespace AlphaISA
48c46,49
< Addr addr = 0;
---
> ProcessInfo::ProcessInfo(ThreadContext *_tc)
> : tc(_tc)
> {
> Addr addr = 0;
50c51
< VirtualPort *vp;
---
> VirtualPort *vp;
52c53
< vp = tc->getVirtPort();
---
> vp = tc->getVirtPort();
54,56c55,57
< if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_size", addr))
< panic("thread info not compiled into kernel\n");
< thread_info_size = vp->readGtoH<int32_t>(addr);
---
> if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_size", addr))
> panic("thread info not compiled into kernel\n");
> thread_info_size = vp->readGtoH<int32_t>(addr);
58,60c59,61
< if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_size", addr))
< panic("thread info not compiled into kernel\n");
< task_struct_size = vp->readGtoH<int32_t>(addr);
---
> if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_size", addr))
> panic("thread info not compiled into kernel\n");
> task_struct_size = vp->readGtoH<int32_t>(addr);
62,64c63,65
< if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_task", addr))
< panic("thread info not compiled into kernel\n");
< task_off = vp->readGtoH<int32_t>(addr);
---
> if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_task", addr))
> panic("thread info not compiled into kernel\n");
> task_off = vp->readGtoH<int32_t>(addr);
66,68c67,69
< if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_pid", addr))
< panic("thread info not compiled into kernel\n");
< pid_off = vp->readGtoH<int32_t>(addr);
---
> if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_pid", addr))
> panic("thread info not compiled into kernel\n");
> pid_off = vp->readGtoH<int32_t>(addr);
70,72c71,73
< if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_comm", addr))
< panic("thread info not compiled into kernel\n");
< name_off = vp->readGtoH<int32_t>(addr);
---
> if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_comm", addr))
> panic("thread info not compiled into kernel\n");
> name_off = vp->readGtoH<int32_t>(addr);
74,75c75,76
< tc->delVirtPort(vp);
< }
---
> tc->delVirtPort(vp);
> }
77,82c78,83
< Addr
< ProcessInfo::task(Addr ksp) const
< {
< Addr base = ksp & ~0x3fff;
< if (base == ULL(0xfffffc0000000000))
< return 0;
---
> Addr
> ProcessInfo::task(Addr ksp) const
> {
> Addr base = ksp & ~0x3fff;
> if (base == ULL(0xfffffc0000000000))
> return 0;
84c85
< Addr tsk;
---
> Addr tsk;
86c87
< VirtualPort *vp;
---
> VirtualPort *vp;
88,90c89,91
< vp = tc->getVirtPort();
< tsk = vp->readGtoH<Addr>(base + task_off);
< tc->delVirtPort(vp);
---
> vp = tc->getVirtPort();
> tsk = vp->readGtoH<Addr>(base + task_off);
> tc->delVirtPort(vp);
92,93c93,94
< return tsk;
< }
---
> return tsk;
> }
95,100c96,101
< int
< ProcessInfo::pid(Addr ksp) const
< {
< Addr task = this->task(ksp);
< if (!task)
< return -1;
---
> int
> ProcessInfo::pid(Addr ksp) const
> {
> Addr task = this->task(ksp);
> if (!task)
> return -1;
102c103
< uint16_t pd;
---
> uint16_t pd;
104c105
< VirtualPort *vp;
---
> VirtualPort *vp;
106,108c107,109
< vp = tc->getVirtPort();
< pd = vp->readGtoH<uint16_t>(task + pid_off);
< tc->delVirtPort(vp);
---
> vp = tc->getVirtPort();
> pd = vp->readGtoH<uint16_t>(task + pid_off);
> tc->delVirtPort(vp);
110,111c111,112
< return pd;
< }
---
> return pd;
> }
113,118c114,119
< string
< ProcessInfo::name(Addr ksp) const
< {
< Addr task = this->task(ksp);
< if (!task)
< return "console";
---
> string
> ProcessInfo::name(Addr ksp) const
> {
> Addr task = this->task(ksp);
> if (!task)
> return "console";
120,123c121,124
< char comm[256];
< CopyStringOut(tc, comm, task + name_off, sizeof(comm));
< if (!comm[0])
< return "startup";
---
> char comm[256];
> CopyStringOut(tc, comm, task + name_off, sizeof(comm));
> if (!comm[0])
> return "startup";
125,126c126,127
< return comm;
< }
---
> return comm;
> }
128,131c129,132
< StackTrace::StackTrace()
< : tc(0), stack(64)
< {
< }
---
> StackTrace::StackTrace()
> : tc(0), stack(64)
> {
> }
133,137c134,138
< StackTrace::StackTrace(ThreadContext *_tc, StaticInstPtr inst)
< : tc(0), stack(64)
< {
< trace(_tc, inst);
< }
---
> StackTrace::StackTrace(ThreadContext *_tc, StaticInstPtr inst)
> : tc(0), stack(64)
> {
> trace(_tc, inst);
> }
139,141c140,142
< StackTrace::~StackTrace()
< {
< }
---
> StackTrace::~StackTrace()
> {
> }
143,146c144,147
< void
< StackTrace::trace(ThreadContext *_tc, bool is_call)
< {
< tc = _tc;
---
> void
> StackTrace::trace(ThreadContext *_tc, bool is_call)
> {
> tc = _tc;
148c149
< bool usermode = (tc->readMiscReg(AlphaISA::IPR_DTB_CM) & 0x18) != 0;
---
> bool usermode = (tc->readMiscReg(AlphaISA::IPR_DTB_CM) & 0x18) != 0;
150,152c151,153
< Addr pc = tc->readNextPC();
< bool kernel = tc->getSystemPtr()->kernelStart <= pc &&
< pc <= tc->getSystemPtr()->kernelEnd;
---
> Addr pc = tc->readNextPC();
> bool kernel = tc->getSystemPtr()->kernelStart <= pc &&
> pc <= tc->getSystemPtr()->kernelEnd;
154,157c155,158
< if (usermode) {
< stack.push_back(user);
< return;
< }
---
> if (usermode) {
> stack.push_back(user);
> return;
> }
159,162c160,163
< if (!kernel) {
< stack.push_back(console);
< return;
< }
---
> if (!kernel) {
> stack.push_back(console);
> return;
> }
164,167c165,168
< SymbolTable *symtab = tc->getSystemPtr()->kernelSymtab;
< Addr ksp = tc->readIntReg(TheISA::StackPointerReg);
< Addr bottom = ksp & ~0x3fff;
< Addr addr;
---
> SymbolTable *symtab = tc->getSystemPtr()->kernelSymtab;
> Addr ksp = tc->readIntReg(TheISA::StackPointerReg);
> Addr bottom = ksp & ~0x3fff;
> Addr addr;
169,171c170,172
< if (is_call) {
< if (!symtab->findNearestAddr(pc, addr))
< panic("could not find address %#x", pc);
---
> if (is_call) {
> if (!symtab->findNearestAddr(pc, addr))
> panic("could not find address %#x", pc);
173,175c174,176
< stack.push_back(addr);
< pc = tc->readPC();
< }
---
> stack.push_back(addr);
> pc = tc->readPC();
> }
177,178c178,179
< Addr ra;
< int size;
---
> Addr ra;
> int size;
180,183c181,184
< while (ksp > bottom) {
< if (!symtab->findNearestAddr(pc, addr))
< panic("could not find symbol for pc=%#x", pc);
< assert(pc >= addr && "symbol botch: callpc < func");
---
> while (ksp > bottom) {
> if (!symtab->findNearestAddr(pc, addr))
> panic("could not find symbol for pc=%#x", pc);
> assert(pc >= addr && "symbol botch: callpc < func");
185c186
< stack.push_back(addr);
---
> stack.push_back(addr);
187,191c188
< if (isEntry(addr))
< return;
<
< if (decodePrologue(ksp, pc, addr, size, ra)) {
< if (!ra)
---
> if (isEntry(addr))
194c191,202
< if (size <= 0) {
---
> if (decodePrologue(ksp, pc, addr, size, ra)) {
> if (!ra)
> return;
>
> if (size <= 0) {
> stack.push_back(unknown);
> return;
> }
>
> pc = ra;
> ksp += size;
> } else {
199,203c207,213
< pc = ra;
< ksp += size;
< } else {
< stack.push_back(unknown);
< return;
---
> bool kernel = tc->getSystemPtr()->kernelStart <= pc &&
> pc <= tc->getSystemPtr()->kernelEnd;
> if (!kernel)
> return;
>
> if (stack.size() >= 1000)
> panic("unwinding too far");
206,212c216
< bool kernel = tc->getSystemPtr()->kernelStart <= pc &&
< pc <= tc->getSystemPtr()->kernelEnd;
< if (!kernel)
< return;
<
< if (stack.size() >= 1000)
< panic("unwinding too far");
---
> panic("unwinding too far");
215,216c219,223
< panic("unwinding too far");
< }
---
> bool
> StackTrace::isEntry(Addr addr)
> {
> if (addr == tc->readMiscReg(AlphaISA::IPR_PALtemp12))
> return true;
218,222c225,226
< bool
< StackTrace::isEntry(Addr addr)
< {
< if (addr == tc->readMiscReg(AlphaISA::IPR_PALtemp12))
< return true;
---
> if (addr == tc->readMiscReg(AlphaISA::IPR_PALtemp7))
> return true;
224,225c228,229
< if (addr == tc->readMiscReg(AlphaISA::IPR_PALtemp7))
< return true;
---
> if (addr == tc->readMiscReg(AlphaISA::IPR_PALtemp11))
> return true;
227,228c231,232
< if (addr == tc->readMiscReg(AlphaISA::IPR_PALtemp11))
< return true;
---
> if (addr == tc->readMiscReg(AlphaISA::IPR_PALtemp21))
> return true;
230,231c234,235
< if (addr == tc->readMiscReg(AlphaISA::IPR_PALtemp21))
< return true;
---
> if (addr == tc->readMiscReg(AlphaISA::IPR_PALtemp9))
> return true;
233,234c237,238
< if (addr == tc->readMiscReg(AlphaISA::IPR_PALtemp9))
< return true;
---
> if (addr == tc->readMiscReg(AlphaISA::IPR_PALtemp2))
> return true;
236,237c240,241
< if (addr == tc->readMiscReg(AlphaISA::IPR_PALtemp2))
< return true;
---
> return false;
> }
239,240c243,254
< return false;
< }
---
> bool
> StackTrace::decodeStack(MachInst inst, int &disp)
> {
> // lda $sp, -disp($sp)
> //
> // Opcode<31:26> == 0x08
> // RA<25:21> == 30
> // RB<20:16> == 30
> // Disp<15:0>
> const MachInst mem_mask = 0xffff0000;
> const MachInst lda_pattern = 0x23de0000;
> const MachInst lda_disp_mask = 0x0000ffff;
242,253c256,270
< bool
< StackTrace::decodeStack(MachInst inst, int &disp)
< {
< // lda $sp, -disp($sp)
< //
< // Opcode<31:26> == 0x08
< // RA<25:21> == 30
< // RB<20:16> == 30
< // Disp<15:0>
< const MachInst mem_mask = 0xffff0000;
< const MachInst lda_pattern = 0x23de0000;
< const MachInst lda_disp_mask = 0x0000ffff;
---
> // subq $sp, disp, $sp
> // addq $sp, disp, $sp
> //
> // Opcode<31:26> == 0x10
> // RA<25:21> == 30
> // Lit<20:13>
> // One<12> = 1
> // Func<11:5> == 0x20 (addq)
> // Func<11:5> == 0x29 (subq)
> // RC<4:0> == 30
> const MachInst intop_mask = 0xffe01fff;
> const MachInst addq_pattern = 0x43c0141e;
> const MachInst subq_pattern = 0x43c0153e;
> const MachInst intop_disp_mask = 0x001fe000;
> const int intop_disp_shift = 13;
255,269c272,279
< // subq $sp, disp, $sp
< // addq $sp, disp, $sp
< //
< // Opcode<31:26> == 0x10
< // RA<25:21> == 30
< // Lit<20:13>
< // One<12> = 1
< // Func<11:5> == 0x20 (addq)
< // Func<11:5> == 0x29 (subq)
< // RC<4:0> == 30
< const MachInst intop_mask = 0xffe01fff;
< const MachInst addq_pattern = 0x43c0141e;
< const MachInst subq_pattern = 0x43c0153e;
< const MachInst intop_disp_mask = 0x001fe000;
< const int intop_disp_shift = 13;
---
> if ((inst & mem_mask) == lda_pattern)
> disp = -sext<16>(inst & lda_disp_mask);
> else if ((inst & intop_mask) == addq_pattern)
> disp = -int((inst & intop_disp_mask) >> intop_disp_shift);
> else if ((inst & intop_mask) == subq_pattern)
> disp = int((inst & intop_disp_mask) >> intop_disp_shift);
> else
> return false;
271,278c281,282
< if ((inst & mem_mask) == lda_pattern)
< disp = -sext<16>(inst & lda_disp_mask);
< else if ((inst & intop_mask) == addq_pattern)
< disp = -int((inst & intop_disp_mask) >> intop_disp_shift);
< else if ((inst & intop_mask) == subq_pattern)
< disp = int((inst & intop_disp_mask) >> intop_disp_shift);
< else
< return false;
---
> return true;
> }
280,281c284,297
< return true;
< }
---
> bool
> StackTrace::decodeSave(MachInst inst, int &reg, int &disp)
> {
> // lda $stq, disp($sp)
> //
> // Opcode<31:26> == 0x08
> // RA<25:21> == ?
> // RB<20:16> == 30
> // Disp<15:0>
> const MachInst stq_mask = 0xfc1f0000;
> const MachInst stq_pattern = 0xb41e0000;
> const MachInst stq_disp_mask = 0x0000ffff;
> const MachInst reg_mask = 0x03e00000;
> const int reg_shift = 21;
283,296c299,304
< bool
< StackTrace::decodeSave(MachInst inst, int &reg, int &disp)
< {
< // lda $stq, disp($sp)
< //
< // Opcode<31:26> == 0x08
< // RA<25:21> == ?
< // RB<20:16> == 30
< // Disp<15:0>
< const MachInst stq_mask = 0xfc1f0000;
< const MachInst stq_pattern = 0xb41e0000;
< const MachInst stq_disp_mask = 0x0000ffff;
< const MachInst reg_mask = 0x03e00000;
< const int reg_shift = 21;
---
> if ((inst & stq_mask) == stq_pattern) {
> reg = (inst & reg_mask) >> reg_shift;
> disp = sext<16>(inst & stq_disp_mask);
> } else {
> return false;
> }
298,302c306
< if ((inst & stq_mask) == stq_pattern) {
< reg = (inst & reg_mask) >> reg_shift;
< disp = sext<16>(inst & stq_disp_mask);
< } else {
< return false;
---
> return true;
305,306c309,318
< return true;
< }
---
> /*
> * Decode the function prologue for the function we're in, and note
> * 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)
> {
> size = 0;
> ra = 0;
308,317c320,322
< /*
< * Decode the function prologue for the function we're in, and note
< * 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)
< {
< size = 0;
< ra = 0;
---
> for (Addr pc = func; pc < callpc; pc += sizeof(MachInst)) {
> MachInst inst;
> CopyOut(tc, (uint8_t *)&inst, pc, sizeof(MachInst));
319,335c324,328
< for (Addr pc = func; pc < callpc; pc += sizeof(MachInst)) {
< MachInst inst;
< CopyOut(tc, (uint8_t *)&inst, pc, sizeof(MachInst));
<
< int reg, disp;
< if (decodeStack(inst, disp)) {
< if (size) {
< // panic("decoding frame size again");
< return true;
< }
< size += disp;
< } else if (decodeSave(inst, reg, disp)) {
< if (!ra && reg == ReturnAddressReg) {
< CopyOut(tc, (uint8_t *)&ra, sp + disp, sizeof(Addr));
< if (!ra) {
< // panic("no return address value pc=%#x\n", pc);
< return false;
---
> int reg, disp;
> if (decodeStack(inst, disp)) {
> if (size) {
> // panic("decoding frame size again");
> return true;
336a330,338
> size += disp;
> } else if (decodeSave(inst, reg, disp)) {
> if (!ra && reg == ReturnAddressReg) {
> CopyOut(tc, (uint8_t *)&ra, sp + disp, sizeof(Addr));
> if (!ra) {
> // panic("no return address value pc=%#x\n", pc);
> return false;
> }
> }
338a341,342
>
> return true;
341,343d344
< return true;
< }
<
345,349c346,350
< void
< StackTrace::dump()
< {
< StringWrap name(tc->getCpuPtr()->name());
< SymbolTable *symtab = tc->getSystemPtr()->kernelSymtab;
---
> void
> StackTrace::dump()
> {
> StringWrap name(tc->getCpuPtr()->name());
> SymbolTable *symtab = tc->getSystemPtr()->kernelSymtab;
351c352
< DPRINTFN("------ Stack ------\n");
---
> DPRINTFN("------ Stack ------\n");
353,363c354,364
< string symbol;
< for (int i = 0, size = stack.size(); i < size; ++i) {
< Addr addr = stack[size - i - 1];
< if (addr == user)
< symbol = "user";
< else if (addr == console)
< symbol = "console";
< else if (addr == unknown)
< symbol = "unknown";
< else
< symtab->findSymbol(addr, symbol);
---
> string symbol;
> for (int i = 0, size = stack.size(); i < size; ++i) {
> Addr addr = stack[size - i - 1];
> if (addr == user)
> symbol = "user";
> else if (addr == console)
> symbol = "console";
> else if (addr == unknown)
> symbol = "unknown";
> else
> symtab->findSymbol(addr, symbol);
365c366,367
< DPRINTFN("%#x: %s\n", addr, symbol);
---
> DPRINTFN("%#x: %s\n", addr, symbol);
> }
367d368
< }
368a370
> }