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] - Blame information for rev 3

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 sergeykhbr
/**
2
 * @file
3
 * @copyright  Copyright 2017 GNSS Sensor Ltd. All right reserved.
4
 * @author     Sergey Khabarov - sergeykhbr@gmail.com
5
 * @brief      Read CPU stack trace buffer.
6
 */
7
 
8
#include "cmd_stack.h"
9
#include "iservice.h"
10
#include "coreservices/ielfreader.h"
11
 
12
namespace debugger {
13
 
14
CmdStack::CmdStack(ITap *tap, ISocInfo *info)
15
    : ICommand ("stack", tap, info) {
16
 
17
    briefDescr_.make_string("Read CPU Stack Trace buffer");
18
    detailedDescr_.make_string(
19
        "Description:\n"
20
        "    Read CPU stack trace buffer. Buffer's size is defined\n"
21
        "    by VHDL configuration parameter:\n"
22
        "Usage:\n"
23
        "    stack <depth>\n"
24
        "Example:\n"
25
        "    stack\n"
26
        "    stack 3\n");
27
}
28
 
29
bool CmdStack::isValid(AttributeType *args) {
30
    if ((*args)[0u].is_equal(cmdName_.to_string()) && (args->size() == 1
31
       || (args->size() == 2 && (*args)[1].is_integer()))) {
32
        return CMD_VALID;
33
    }
34
    return CMD_INVALID;
35
}
36
 
37
void CmdStack::exec(AttributeType *args, AttributeType *res) {
38
    res->make_list(0);
39
    if (!isValid(args)) {
40
        generateError(res, "Wrong argument list");
41
        return;
42
    }
43
 
44
    Reg64Type t1;
45
    DsuMapType *pdsu = info_->getpDsu();
46
    uint64_t addr = reinterpret_cast<uint64_t>(&pdsu->ureg.v.stack_trace_cnt);
47
    t1.val = 0;
48
    tap_->read(addr, 8, t1.buf);
49
 
50
    addr = reinterpret_cast<uint64_t>(&pdsu->ureg.v.stack_trace_buf[0]);
51
    unsigned trace_sz = t1.buf32[0];
52
    if (args->size() == 2 && args[1].to_uint64() < trace_sz) {
53
        addr += 8 * (trace_sz - args[1].to_uint32());
54
        trace_sz = args[1].to_uint32();
55
    }
56
 
57
    if (trace_sz == 0) {
58
        return;
59
    }
60
 
61
    AttributeType tbuf, lstServ;
62
    uint64_t *p_data;
63
    IElfReader *elf = 0;
64
    uint64_t from_addr, to_addr;
65
    tbuf.make_data(16*trace_sz);
66
    tap_->read(addr, tbuf.size(), tbuf.data());
67
 
68
    RISCV_get_services_with_iface(IFACE_ELFREADER, &lstServ);
69
    if (lstServ.size() >= 0) {
70
        IService *iserv = static_cast<IService *>(lstServ[0u].to_iface());
71
        elf = static_cast<IElfReader *>(iserv->getInterface(IFACE_ELFREADER));
72
    }
73
 
74
    res->make_list(t1.buf32[0]);
75
    p_data = reinterpret_cast<uint64_t *>(tbuf.data());
76
    for (unsigned i = 0; i < trace_sz; i++) {
77
        AttributeType &item = (*res)[i];
78
        from_addr = p_data[2*(trace_sz - i) - 2];
79
        to_addr = p_data[2*(trace_sz - i) - 1];
80
        // [from, ['symb_name',symb_offset], to, ['symb_name',symb_offset]]
81
        item.make_list(4);
82
        item[0u].make_uint64(from_addr);
83
        item[2].make_uint64(to_addr);
84
        if (elf) {
85
            elf->addressToSymbol(from_addr, &item[1]);
86
            elf->addressToSymbol(to_addr, &item[3]);
87
        }
88
    }
89
}
90
 
91
}  // namespace debugger

powered by: WebSVN 2.1.0

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