OpenCores
URL https://opencores.org/ocsvn/riscv_vhdl/riscv_vhdl/trunk

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [libdbg64g/] [services/] [exec/] [cmd/] [cmd_stack.cpp] - Diff between revs 3 and 4

Show entire file | Details | Blame | View Log

Rev 3 Rev 4
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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.