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_csr.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      Read/write CSR register value.
6
 */
7
 
8
#include "cmd_csr.h"
9
 
10
namespace debugger {
11
 
12
CmdCsr::CmdCsr(ITap *tap, ISocInfo *info)
13
    : ICommand ("csr", tap, info) {
14
 
15
    briefDescr_.make_string("Access to CSR registers");
16
    detailedDescr_.make_string(
17
        "Description:\n"
18
        "    Access to CSRs registers of the CPU.\n"
19
        "Usage:\n"
20
        "    READ:  csr <addr|name>\n"
21
        "    WRITE: csr <addr|name> <value>\n"
22
        "Example:\n"
23
        "    csr MISA\n"
24
        "    csr 0xf10 1\n");
25
}
26
 
27
bool CmdCsr::isValid(AttributeType *args) {
28
    if ((*args)[0u].is_equal(cmdName_.to_string())
29
     && (args->size() == 2 || args->size() == 3)) {
30
        return CMD_VALID;
31
    }
32
    return CMD_INVALID;
33
}
34
 
35
void CmdCsr::exec(AttributeType *args, AttributeType *res) {
36
    res->make_nil();
37
    if (!isValid(args)) {
38
        generateError(res, "Wrong argument list");
39
        return;
40
    }
41
 
42
    AttributeType &arg1 = (*args)[1];
43
    uint64_t val;
44
    int bytes = 8;
45
    uint64_t addr;
46
    if (arg1.is_string()) {
47
        const char *csrname = arg1.to_string();
48
        addr = info_->csr2addr(csrname);
49
        if (addr == REG_ADDR_ERROR) {
50
            char tstr[128];
51
            RISCV_sprintf(tstr, sizeof(tstr), "%s not found", csrname);
52
            generateError(res, tstr);
53
            return;
54
        }
55
    } else {
56
        addr = arg1.to_uint64();
57
    }
58
 
59
    if (args->size() == 2) {
60
        tap_->read(addr, bytes, reinterpret_cast<uint8_t *>(&val));
61
        res->make_uint64(val);
62
    } else {
63
        val = (*args)[2].to_uint64();
64
        tap_->write(addr, bytes, reinterpret_cast<uint8_t *>(&val));
65
    }
66
}
67
 
68
void CmdCsr::to_string(AttributeType *args, AttributeType *res, AttributeType *out) {
69
    if (args->size() != 2) {
70
        out->make_nil();
71
        return;
72
    }
73
 
74
    char tstr[256];
75
    int tstrsz;
76
    uint64_t csr = res->to_uint64();
77
    uint64_t addr = info_->csr2addr((*args)[1].to_string());
78
 
79
    tstr[0] = '\0';
80
    if (addr == static_cast<uint64_t>(-1)) {
81
        RISCV_sprintf(tstr, sizeof(tstr),
82
            "Unknown CSR '%s'\n", (*args)[1].to_string());
83
        out->make_string(tstr);
84
        return;
85
    }
86
 
87
    tstrsz = RISCV_sprintf(tstr, sizeof(tstr),
88
        "CSR[%03x] => %016" RV_PRI64 "x\n",
89
        static_cast<uint32_t>((addr >> 4) & 0xfff), res->to_uint64());
90
 
91
    if (!(*args)[1].is_string()) {
92
        return;
93
    }
94
    if ((*args)[1].is_equal("MISA")) {
95
        static const char *MISA_BASE[4] = {
96
            "RV32I", "RV32E", "RV64I", "RV128I"
97
        };
98
        tstrsz += RISCV_sprintf(&tstr[tstrsz], sizeof(tstr) - tstrsz,
99
            "    Base: %s", MISA_BASE[(csr >> 62) & 0x3]);
100
        // total 26 extensions
101
        char extenstion[2] = {0};
102
        for (int i = 0; i < 26; i++) {
103
            if (csr & (1LL << i)) {
104
                extenstion[0] = 'A' + i;
105
                if (extenstion[0] == 'I') {
106
                    continue;
107
                }
108
                tstrsz += RISCV_sprintf(&tstr[tstrsz], sizeof(tstr) - tstrsz,
109
                                        "%s", extenstion);
110
            }
111
        }
112
        tstrsz += RISCV_sprintf(&tstr[tstrsz], sizeof(tstr) - tstrsz, "\n");
113
    } else if ((*args)[1].is_equal("MTIME")) {
114
        tstrsz += RISCV_sprintf(&tstr[tstrsz], sizeof(tstr) - tstrsz,
115
            "    Clock: %" RV_PRI64 "d; ms: %.1f\n",
116
            csr, static_cast<double>(csr)/60000.0);
117
    }
118
    out->make_string(tstr);
119
    return;
120
}
121
 
122
}  // namespace debugger

powered by: WebSVN 2.1.0

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