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_br.cpp] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 sergeykhbr
/**
2
 * @file
3
 * @copyright  Copyright 2016 GNSS Sensor Ltd. All right reserved.
4
 * @author     Sergey Khabarov - sergeykhbr@gmail.com
5
 * @brief      Add or remove memory breakpoint.
6
 */
7
 
8
#include "cmd_br.h"
9
 
10
namespace debugger {
11
 
12
CmdBr::CmdBr(ITap *tap, ISocInfo *info)
13
    : ICommand ("br", tap, info) {
14
 
15
    briefDescr_.make_string("Add or remove breakpoint.");
16
    detailedDescr_.make_string(
17
        "Description:\n"
18
        "    Get breakpoints list or add/remove breakpoint with specified\n"
19
        "    flags.\n"
20
        "Response:\n"
21
        "    List of lists [[iii]*] if breakpoint list was requested, where:\n"
22 4 sergeykhbr
        "        i|s  - uint64_t address value or 'string' symbol name\n"
23 3 sergeykhbr
        "        i    - uint32_t instruction value\n"
24
        "        i    - uint64_t Breakpoint flags: hardware,...\n"
25
        "    Nil in a case of add/rm breakpoint\n"
26
        "Usage:\n"
27
        "    br"
28
        "    br add <addr>\n"
29
        "    br rm <addr>\n"
30 4 sergeykhbr
        "    br rm 'symbol_name'\n"
31 3 sergeykhbr
        "    br add <addr> hw\n"
32
        "Example:\n"
33
        "    br add 0x10000000\n"
34
        "    br add 0x00020040 hw\n"
35 4 sergeykhbr
        "    br add 'func1'\n"
36
        "    br rm 0x10000000\n"
37
        "    br rm 'func1'\n");
38 3 sergeykhbr
 
39
    AttributeType lstServ;
40
    RISCV_get_services_with_iface(IFACE_SOURCE_CODE, &lstServ);
41
    isrc_ = 0;
42
    if (lstServ.size() != 0) {
43
        IService *iserv = static_cast<IService *>(lstServ[0u].to_iface());
44
        isrc_ = static_cast<ISourceCode *>(
45
                            iserv->getInterface(IFACE_SOURCE_CODE));
46
    }
47
}
48
 
49
bool CmdBr::isValid(AttributeType *args) {
50
    if ((*args)[0u].is_equal(cmdName_.to_string())
51
        && (args->size() == 1 || (args->size() >= 3 && (*args)[1].is_string()))
52
        ) {
53
        return CMD_VALID;
54
    }
55
    return CMD_INVALID;
56
}
57
 
58
void CmdBr::exec(AttributeType *args, AttributeType *res) {
59
    res->make_nil();
60
    if (!isrc_ || !isValid(args)) {
61
        generateError(res, "Wrong argument list");
62
        return;
63
    }
64
    if (args->size() == 1) {
65
        isrc_->getBreakpointList(res);
66
        return;
67
    }
68
 
69
    uint64_t flags = 0;
70
    if (args->size() == 4 && (*args)[3].is_equal("hw")) {
71
        flags |= BreakFlag_HW;
72
    }
73
 
74 4 sergeykhbr
    DsuMapType *pdsu = info_->getpDsu();
75 3 sergeykhbr
 
76 4 sergeykhbr
    Reg64Type braddr;
77
    Reg64Type brinstr;
78
    AttributeType &bpadr = (*args)[2];
79
    if (bpadr.is_integer()) {
80
        braddr.val = bpadr.to_uint64();
81
    } else if (bpadr.is_string()) {
82
        if (isrc_->symbol2Address(bpadr.to_string(), &braddr.val) < 0) {
83
            generateError(res, "Symbol not found");
84
            return;
85
        }
86
    } else {
87
        generateError(res, "Wrong command format");
88
        return;
89
    }
90
 
91
    if ((*args)[1].is_equal("add")) {
92
        brinstr.val = 0;
93
        tap_->read(braddr.val, 4, brinstr.buf);
94 3 sergeykhbr
 
95 4 sergeykhbr
        isrc_->registerBreakpoint(braddr.val, flags, brinstr.val);
96
        if (flags & BreakFlag_HW) {
97
            uint64_t dsuaddr =
98
                reinterpret_cast<uint64_t>(&pdsu->udbg.v.add_breakpoint);
99
            tap_->write(dsuaddr, 8, braddr.buf);
100
        } else {
101
            if ((brinstr.val & 0x3) == 0x3) {
102
                brinstr.buf32[0] = 0x00100073;  // EBREAK instruction
103
            } else {
104
                brinstr.buf16[0] = 0x9002;      // C.EBREAK instruction
105
            }
106
            tap_->write(braddr.val, 4, brinstr.buf);
107
        }
108 3 sergeykhbr
        return;
109
    }
110
 
111
    if ((*args)[1].is_equal("rm")) {
112 4 sergeykhbr
        isrc_->unregisterBreakpoint(braddr.val, &flags, &brinstr.val);
113
        if (flags & BreakFlag_HW) {
114
            uint64_t dsuaddr =
115
                reinterpret_cast<uint64_t>(&pdsu->udbg.v.remove_breakpoint);
116
            tap_->write(dsuaddr, 8, braddr.buf);
117
        } else {
118
            tap_->write(braddr.val, 4, brinstr.buf);
119 3 sergeykhbr
        }
120
    }
121
}
122
 
123
}  // namespace debugger

powered by: WebSVN 2.1.0

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