Line 5... |
Line 5... |
* @brief Read CPU stack trace buffer.
|
* @brief Read CPU stack trace buffer.
|
*/
|
*/
|
|
|
#include "cmd_stack.h"
|
#include "cmd_stack.h"
|
#include "iservice.h"
|
#include "iservice.h"
|
#include "coreservices/ielfreader.h"
|
#include "coreservices/isrccode.h"
|
|
|
namespace debugger {
|
namespace debugger {
|
|
|
CmdStack::CmdStack(ITap *tap, ISocInfo *info)
|
CmdStack::CmdStack(ITap *tap, ISocInfo *info)
|
: ICommand ("stack", tap, info) {
|
: ICommand ("stack", tap, info) {
|
Line 58... |
Line 58... |
return;
|
return;
|
}
|
}
|
|
|
AttributeType tbuf, lstServ;
|
AttributeType tbuf, lstServ;
|
uint64_t *p_data;
|
uint64_t *p_data;
|
IElfReader *elf = 0;
|
ISourceCode *isrc = 0;
|
uint64_t from_addr, to_addr;
|
uint64_t from_addr, to_addr;
|
tbuf.make_data(16*trace_sz);
|
tbuf.make_data(16*trace_sz);
|
tap_->read(addr, tbuf.size(), tbuf.data());
|
tap_->read(addr, tbuf.size(), tbuf.data());
|
|
|
RISCV_get_services_with_iface(IFACE_ELFREADER, &lstServ);
|
RISCV_get_services_with_iface(IFACE_SOURCE_CODE, &lstServ);
|
if (lstServ.size() >= 0) {
|
if (lstServ.size() >= 0) {
|
IService *iserv = static_cast<IService *>(lstServ[0u].to_iface());
|
IService *iserv = static_cast<IService *>(lstServ[0u].to_iface());
|
elf = static_cast<IElfReader *>(iserv->getInterface(IFACE_ELFREADER));
|
isrc = static_cast<ISourceCode *>(
|
|
iserv->getInterface(IFACE_SOURCE_CODE));
|
}
|
}
|
|
|
res->make_list(t1.buf32[0]);
|
res->make_list(t1.buf32[0]);
|
p_data = reinterpret_cast<uint64_t *>(tbuf.data());
|
p_data = reinterpret_cast<uint64_t *>(tbuf.data());
|
for (unsigned i = 0; i < trace_sz; i++) {
|
for (unsigned i = 0; i < trace_sz; i++) {
|
Line 79... |
Line 80... |
to_addr = p_data[2*(trace_sz - i) - 1];
|
to_addr = p_data[2*(trace_sz - i) - 1];
|
// [from, ['symb_name',symb_offset], to, ['symb_name',symb_offset]]
|
// [from, ['symb_name',symb_offset], to, ['symb_name',symb_offset]]
|
item.make_list(4);
|
item.make_list(4);
|
item[0u].make_uint64(from_addr);
|
item[0u].make_uint64(from_addr);
|
item[2].make_uint64(to_addr);
|
item[2].make_uint64(to_addr);
|
if (elf) {
|
if (isrc) {
|
elf->addressToSymbol(from_addr, &item[1]);
|
isrc->addressToSymbol(from_addr, &item[1]);
|
elf->addressToSymbol(to_addr, &item[3]);
|
isrc->addressToSymbol(to_addr, &item[3]);
|
}
|
}
|
}
|
}
|
}
|
}
|
|
|
} // namespace debugger
|
} // namespace debugger
|