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] - Rev 4

Compare with Previous | Blame | View Log

/**
 * @file
 * @copyright  Copyright 2016 GNSS Sensor Ltd. All right reserved.
 * @author     Sergey Khabarov - sergeykhbr@gmail.com
 * @brief      Elf-file loader command.
 */
 
#include "iservice.h"
#include "cmd_loadelf.h"
#include "coreservices/ielfreader.h"
 
namespace debugger {
 
CmdLoadElf::CmdLoadElf(ITap *tap, ISocInfo *info) 
    : ICommand ("loadelf", tap, info) {
 
    briefDescr_.make_string("Load ELF-file");
    detailedDescr_.make_string(
        "Description:\n"
        "    Load ELF-file to SOC target memory. Optional key 'nocode'\n"
        "    allows to read debug information from the elf-file without\n"
        "    target programming.\n"
        "Usage:\n"
        "    loadelf filename [nocode]\n"
        "Example:\n"
        "    loadelf /home/riscv/image.elf\n"
        "    loadelf /home/riscv/image.elf nocode\n");
}
 
bool CmdLoadElf::isValid(AttributeType *args) {
    if ((*args)[0u].is_equal("loadelf") 
        && (args->size() == 2 || args->size() == 3)) {
        return CMD_VALID;
    }
    return CMD_INVALID;
}
 
void CmdLoadElf::exec(AttributeType *args, AttributeType *res) {
    res->make_nil();
    if (!isValid(args)) {
        generateError(res, "Wrong argument list");
        return;
    }
    bool program = true;
    if (args->size() == 3 
        && (*args)[2].is_string() && (*args)[2].is_equal("nocode")) {
        program = false;
    }
 
    /**
     *  @todo Elf Loader service change on elf-reader
     */
    AttributeType lstServ;
    RISCV_get_services_with_iface(IFACE_ELFREADER, &lstServ);
    if (lstServ.size() == 0) {
        generateError(res, "Elf-service not found");
        return;
    }
 
    IService *iserv = static_cast<IService *>(lstServ[0u].to_iface());
    IElfReader *elf = static_cast<IElfReader *>(
                        iserv->getInterface(IFACE_ELFREADER));
    elf->readFile((*args)[1].to_string());
 
    if (!program) {
        return;
    }
 
    DsuMapType *dsu = info_->getpDsu();
    uint64_t soft_reset = 1;
    uint64_t addr = reinterpret_cast<uint64_t>(&dsu->ulocal.v.soft_reset);
    tap_->write(addr, 8, reinterpret_cast<uint8_t *>(&soft_reset));
 
    uint64_t sec_addr;
    int sec_sz;
    for (unsigned i = 0; i < elf->loadableSectionTotal(); i++) {
        sec_addr = elf->sectionAddress(i);
        sec_sz = static_cast<int>(elf->sectionSize(i));
        tap_->write(sec_addr, sec_sz, elf->sectionData(i));
    }
 
    soft_reset = 0;
    tap_->write(addr, 8, reinterpret_cast<uint8_t *>(&soft_reset));
}
 
 
}  // namespace debugger
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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