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_disas.cpp] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 sergeykhbr
/**
2
 * @file
3
 * @copyright  Copyright 2016 GNSS Sensor Ltd. All right reserved.
4
 * @author     Sergey Khabarov - sergeykhbr@gmail.com
5
 * @brief      Disassemble data block command.
6
 */
7
 
8
#include <string>
9
#include "cmd_disas.h"
10
 
11
namespace debugger {
12
 
13
CmdDisas::CmdDisas(ITap *tap, ISocInfo *info)
14
    : ICommand ("disas", tap, info) {
15
 
16
    briefDescr_.make_string("Disassemble block of data.");
17
    detailedDescr_.make_string(
18
        "Description:\n"
19
        "    Disassemble memory range or a block of data. Convert result\n"
20
        "    to a list of assembler items where each of them has\n"
21
        "    ASM_Total sub-items. You can add 'str' flag to receive\n"
22
        "    formatted text output.\n"
23
        "Usage:\n"
24
        "    disas <addr> <byte> [str]\n"
25
        "    disas <addr> <data> [str]\n"
26
        "Example:\n"
27
        "    data 0x40000000 100\n"
28
        "    data 0x40000000 100 str\n"
29
        "    data 0x1000 (73,00,10,00)\n"
30
        "    ['data',0x1000,(73,00,10,00)]\n");
31
 
32
    AttributeType lstServ;
33
    RISCV_get_services_with_iface(IFACE_SOURCE_CODE, &lstServ);
34
    isrc_ = 0;
35
    if (lstServ.size() != 0) {
36
        IService *iserv = static_cast<IService *>(lstServ[0u].to_iface());
37
        isrc_ = static_cast<ISourceCode *>(
38
                            iserv->getInterface(IFACE_SOURCE_CODE));
39
    }
40
}
41
 
42
bool CmdDisas::isValid(AttributeType *args) {
43
    if ((*args)[0u].is_equal(cmdName_.to_string())
44
        && args->size() >= 3 && (*args)[1].is_integer()
45
        && ((*args)[2].is_data() || (*args)[2].is_integer())
46
        ) {
47
        return CMD_VALID;
48
    }
49
    return CMD_INVALID;
50
}
51
 
52
void CmdDisas::exec(AttributeType *args, AttributeType *res) {
53
    res->make_nil();
54
    if (!isrc_ || !isValid(args)) {
55
        generateError(res, "Wrong argument list");
56
        return;
57
    }
58
    res->make_list(0);
59
 
60
    uint64_t addr = (*args)[1].to_uint64();
61
    AttributeType *mem_data, *asm_data;
62
    AttributeType membuf, asmbuf;
63
    if ((*args)[2].is_integer()) {
64
        // 4-bytes alignment
65
        uint32_t sz = ((*args)[2].to_uint32() + 3) & ~0x3;
66
        membuf.make_data(sz);
67
        mem_data = &membuf;
68
        if (tap_->read(addr, sz, membuf.data()) == TAP_ERROR) {
69
            res->make_nil();
70
            return;
71
        }
72
    } else {
73
        mem_data = &(*args)[2];
74
    }
75
 
76
    asm_data = res;
77
    bool do_format = false;
78
    if (args->size() == 4 && (*args)[3].is_equal("str")) {
79
        asm_data = &asmbuf;
80
        do_format = true;
81
    }
82
 
83
    isrc_->disasm(addr, mem_data, asm_data);
84
 
85
    if (do_format) {
86
        format(asm_data, res);
87
    }
88
}
89
 
90
void CmdDisas::format(AttributeType *asmbuf, AttributeType *fmtstr) {
91
    char tstr[128];
92
    std::string tout;
93
    for (unsigned i = 0; i < asmbuf->size(); i++) {
94
        const AttributeType &line = (*asmbuf)[i];
95
        if (line[ASM_list_type].to_int() != AsmList_disasm) {
96
            continue;
97
        }
98
        RISCV_sprintf(tstr, sizeof(tstr), "%016" RV_PRI64 "x: %08x    %s\n",
99
                line[ASM_addrline].to_uint64(),
100
                line[ASM_code].to_uint32(),
101
                line[ASM_mnemonic].to_string()
102
                );
103
        tout += tstr;
104
    }
105
    fmtstr->make_string(tout.c_str());
106
}
107
 
108
}  // namespace debugger

powered by: WebSVN 2.1.0

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