adds riscv_hart_common and signature output
This commit is contained in:
39
src/main.cpp
39
src/main.cpp
@@ -35,6 +35,8 @@
|
||||
#include <iostream>
|
||||
#include <iss/factory.h>
|
||||
#include <iss/semihosting/semihosting.h>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
#include "iss/arch/tgc_mapper.h"
|
||||
@@ -199,12 +201,12 @@ int main(int argc, char* argv[]) {
|
||||
if(clim.count("elf"))
|
||||
for(std::string input : clim["elf"].as<std::vector<std::string>>()) {
|
||||
auto start_addr = vm->get_arch()->load_file(input);
|
||||
if(start_addr.second)
|
||||
if(start_addr.second) // FIXME: this always evaluates to true as load file always returns <sth, true>
|
||||
start_address = start_addr.first;
|
||||
}
|
||||
for(std::string input : args) {
|
||||
auto start_addr = vm->get_arch()->load_file(input); // treat remaining arguments as elf files
|
||||
if(start_addr.second)
|
||||
if(start_addr.second) // FIXME: this always evaluates to true as load file always returns <sth, true>
|
||||
start_address = start_addr.first;
|
||||
}
|
||||
if(clim.count("reset")) {
|
||||
@@ -214,11 +216,42 @@ int main(int argc, char* argv[]) {
|
||||
vm->reset(start_address);
|
||||
auto cycles = clim["instructions"].as<uint64_t>();
|
||||
res = vm->start(cycles, dump);
|
||||
|
||||
auto instr_if = vm->get_arch()->get_instrumentation_if();
|
||||
// this assumes a single input file
|
||||
std::unordered_map<std::string, uint64_t> sym_table;
|
||||
if(args.empty())
|
||||
sym_table = instr_if->get_symbol_table(clim["elf"].as<std::vector<std::string>>()[0]);
|
||||
else
|
||||
sym_table = instr_if->get_symbol_table(args[0]);
|
||||
if(sym_table.find("begin_signature") != std::end(sym_table) && sym_table.find("end_signature") != std::end(sym_table)) {
|
||||
auto start_addr = sym_table["begin_signature"];
|
||||
auto end_addr = sym_table["end_signature"];
|
||||
std::array<uint8_t, 4> data;
|
||||
std::ofstream file;
|
||||
std::string filename = fmt::format("{}.signature", isa_opt);
|
||||
std::replace(std::begin(filename), std::end(filename), '|', '_');
|
||||
// default riscof requires this filename
|
||||
filename = "DUT-tgc.signature";
|
||||
file.open(filename, std::ios::out);
|
||||
if(!file.is_open()) {
|
||||
LOG(ERR) << "Error opening file " << filename << std::endl;
|
||||
return 1;
|
||||
}
|
||||
for(auto addr = start_addr; addr < end_addr; addr += data.size()) {
|
||||
vm->get_arch()->read(iss::address_type::PHYSICAL, iss::access_type::DEBUG_READ, 0 /*MEM*/, addr, data.size(),
|
||||
data.data()); // FIXME: get space from iss::arch::traits<ARCH>::mem_type_e::MEM
|
||||
|
||||
// TODO : obey Target endianess
|
||||
uint32_t to_print = (data[3] << 24) + (data[2] << 16) + (data[1] << 8) + data[0];
|
||||
file << std::hex << fmt::format("{:08x}", to_print) << std::dec << std::endl;
|
||||
}
|
||||
}
|
||||
} catch(std::exception& e) {
|
||||
LOG(ERR) << "Unhandled Exception reached the top of main: " << e.what() << ", application will now exit" << std::endl;
|
||||
res = 2;
|
||||
}
|
||||
// cleanup to let plugins report of needed
|
||||
// cleanup to let plugins report if needed
|
||||
for(auto* p : plugin_list) {
|
||||
delete p;
|
||||
}
|
||||
|
Reference in New Issue
Block a user