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 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 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
        "        i    - uint64_t address value\n"
23
        "        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
        "    br add <addr> hw\n"
31
        "Example:\n"
32
        "    br add 0x10000000\n"
33
        "    br add 0x00020040 hw\n"
34
        "    br rm 0x10000000\n");
35
 
36
    AttributeType lstServ;
37
    RISCV_get_services_with_iface(IFACE_SOURCE_CODE, &lstServ);
38
    isrc_ = 0;
39
    if (lstServ.size() != 0) {
40
        IService *iserv = static_cast<IService *>(lstServ[0u].to_iface());
41
        isrc_ = static_cast<ISourceCode *>(
42
                            iserv->getInterface(IFACE_SOURCE_CODE));
43
    }
44
}
45
 
46
bool CmdBr::isValid(AttributeType *args) {
47
    if ((*args)[0u].is_equal(cmdName_.to_string())
48
        && (args->size() == 1 || (args->size() >= 3 && (*args)[1].is_string()))
49
        ) {
50
        return CMD_VALID;
51
    }
52
    return CMD_INVALID;
53
}
54
 
55
void CmdBr::exec(AttributeType *args, AttributeType *res) {
56
    res->make_nil();
57
    if (!isrc_ || !isValid(args)) {
58
        generateError(res, "Wrong argument list");
59
        return;
60
    }
61
    if (args->size() == 1) {
62
        isrc_->getBreakpointList(res);
63
        return;
64
    }
65
 
66
    uint64_t flags = 0;
67
    if (args->size() == 4 && (*args)[3].is_equal("hw")) {
68
        flags |= BreakFlag_HW;
69
    }
70
 
71
    Reg64Type instr;
72
    uint64_t addr = (*args)[2].to_uint64();
73
    tap_->read(addr, 4, instr.buf);
74
    isrc_->registerBreakpoint(addr, instr.buf32[0], flags);
75
 
76
    instr.buf32[0] = 0x00100073;   // EBREAK instruction
77
 
78
    if ((*args)[1].is_equal("add")) {
79
        tap_->write(addr, 4, instr.buf);
80
        return;
81
    }
82
 
83
    if ((*args)[1].is_equal("rm")) {
84
        if (!isrc_->unregisterBreakpoint(addr, instr.buf32, &flags)) {
85
            tap_->write(addr, 4, instr.buf);
86
        }
87
    }
88
}
89
 
90
}  // namespace debugger

powered by: WebSVN 2.1.0

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