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_loadelf.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      Elf-file loader command.
6
 */
7
 
8
#include "iservice.h"
9
#include "cmd_loadelf.h"
10
#include "coreservices/ielfreader.h"
11
 
12
namespace debugger {
13
 
14
CmdLoadElf::CmdLoadElf(ITap *tap, ISocInfo *info)
15
    : ICommand ("loadelf", tap, info) {
16
 
17
    briefDescr_.make_string("Load ELF-file");
18
    detailedDescr_.make_string(
19
        "Description:\n"
20
        "    Load ELF-file to SOC target memory. Optional key 'nocode'\n"
21
        "    allows to read debug information from the elf-file without\n"
22
        "    target programming.\n"
23
        "Usage:\n"
24
        "    loadelf filename [nocode]\n"
25
        "Example:\n"
26
        "    loadelf /home/riscv/image.elf\n"
27
        "    loadelf /home/riscv/image.elf nocode\n");
28
}
29
 
30
bool CmdLoadElf::isValid(AttributeType *args) {
31
    if ((*args)[0u].is_equal("loadelf")
32
        && (args->size() == 2 || args->size() == 3)) {
33
        return CMD_VALID;
34
    }
35
    return CMD_INVALID;
36
}
37
 
38
void CmdLoadElf::exec(AttributeType *args, AttributeType *res) {
39
    res->make_nil();
40
    if (!isValid(args)) {
41
        generateError(res, "Wrong argument list");
42
        return;
43
    }
44
    bool program = true;
45
    if (args->size() == 3
46
        && (*args)[2].is_string() && (*args)[2].is_equal("nocode")) {
47
        program = false;
48
    }
49
 
50
    /**
51
     *  @todo Elf Loader service change on elf-reader
52
     */
53
    AttributeType lstServ;
54
    RISCV_get_services_with_iface(IFACE_ELFREADER, &lstServ);
55
    if (lstServ.size() == 0) {
56
        generateError(res, "Elf-service not found");
57
        return;
58
    }
59
 
60
    IService *iserv = static_cast<IService *>(lstServ[0u].to_iface());
61
    IElfReader *elf = static_cast<IElfReader *>(
62
                        iserv->getInterface(IFACE_ELFREADER));
63
    elf->readFile((*args)[1].to_string());
64
 
65
    if (!program) {
66
        return;
67
    }
68
 
69
    DsuMapType *dsu = info_->getpDsu();
70
    uint64_t soft_reset = 1;
71
    uint64_t addr = reinterpret_cast<uint64_t>(&dsu->ulocal.v.soft_reset);
72
    tap_->write(addr, 8, reinterpret_cast<uint8_t *>(&soft_reset));
73
 
74 4 sergeykhbr
    uint64_t sec_addr;
75
    int sec_sz;
76 3 sergeykhbr
    for (unsigned i = 0; i < elf->loadableSectionTotal(); i++) {
77 4 sergeykhbr
        sec_addr = elf->sectionAddress(i);
78
        sec_sz = static_cast<int>(elf->sectionSize(i));
79
        tap_->write(sec_addr, sec_sz, elf->sectionData(i));
80 3 sergeykhbr
    }
81
 
82
    soft_reset = 0;
83
    tap_->write(addr, 8, reinterpret_cast<uint8_t *>(&soft_reset));
84
}
85
 
86
 
87
}  // namespace debugger

powered by: WebSVN 2.1.0

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