Browse Source

Load symbols even when no binary is given

pull/1923/head
Friedrich Hunstock 1 year ago
parent
commit
81d92f3c26
  1. 50
      fesvr/htif.cc
  2. 1
      fesvr/htif.h

50
fesvr/htif.cc

@ -84,12 +84,17 @@ htif_t::~htif_t()
void htif_t::start() void htif_t::start()
{ {
if (!targs.empty() && targs[0] != "none") { if (!targs.empty()) {
try { if (targs[0] != "none") {
load_program(); try {
} catch (const incompat_xlen & err) { load_program();
fprintf(stderr, "Error: cannot execute %d-bit program on RV%d hart\n", err.actual_xlen, err.expected_xlen); } catch (const incompat_xlen & err) {
exit(1); fprintf(stderr, "Error: cannot execute %d-bit program on RV%d hart\n", err.actual_xlen, err.expected_xlen);
exit(1);
}
} else {
auto empty_symbols = std::map<std::string, uint64_t>();
load_symbols(empty_symbols);
} }
} }
@ -150,21 +155,8 @@ std::map<std::string, uint64_t> htif_t::load_payload(const std::string& payload,
} }
} }
void htif_t::load_program() void htif_t::load_symbols(std::map<std::string, uint64_t>& symbols)
{ {
std::map<std::string, uint64_t> symbols = load_payload(targs[0], &entry, load_offset);
// detect torture tests so we can print the memory signature at the end
if (symbols.count("begin_signature") && symbols.count("end_signature")) {
sig_addr = symbols["begin_signature"];
sig_len = symbols["end_signature"] - sig_addr;
}
for (auto payload : payloads) {
reg_t dummy_entry;
load_payload(payload, &dummy_entry, 0);
}
class nop_memif_t : public memif_t { class nop_memif_t : public memif_t {
public: public:
nop_memif_t(htif_t* htif) : memif_t(htif), htif(htif) {} nop_memif_t(htif_t* htif) : memif_t(htif), htif(htif) {}
@ -181,6 +173,12 @@ void htif_t::load_program()
symbols.merge(other_symbols); symbols.merge(other_symbols);
} }
// detect torture tests so we can print the memory signature at the end
if (symbols.count("begin_signature") && symbols.count("end_signature")) {
sig_addr = symbols["begin_signature"];
sig_len = symbols["end_signature"] - sig_addr;
}
if (symbols.count("tohost") && symbols.count("fromhost")) { if (symbols.count("tohost") && symbols.count("fromhost")) {
tohost_addr = symbols["tohost"]; tohost_addr = symbols["tohost"];
fromhost_addr = symbols["fromhost"]; fromhost_addr = symbols["fromhost"];
@ -193,6 +191,18 @@ void htif_t::load_program()
if ( it == addr2symbol.end()) if ( it == addr2symbol.end())
addr2symbol[i.second] = i.first; addr2symbol[i.second] = i.first;
} }
}
void htif_t::load_program()
{
std::map<std::string, uint64_t> symbols = load_payload(targs[0], &entry, load_offset);
load_symbols(symbols);
for (auto payload : payloads) {
reg_t dummy_entry;
load_payload(payload, &dummy_entry, 0);
}
return; return;
} }

1
fesvr/htif.h

@ -65,6 +65,7 @@ class htif_t : public chunked_memif_t
virtual std::map<std::string, uint64_t> load_payload(const std::string& payload, reg_t* entry, virtual std::map<std::string, uint64_t> load_payload(const std::string& payload, reg_t* entry,
reg_t load_addr); reg_t load_addr);
virtual void load_program(); virtual void load_program();
virtual void load_symbols(std::map<std::string, uint64_t>&);
virtual void idle() {} virtual void idle() {}
const std::vector<std::string>& host_args() { return hargs; } const std::vector<std::string>& host_args() { return hargs; }

Loading…
Cancel
Save