aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerry Zhao <jerryz123@berkeley.edu>2023-03-07 23:01:29 -0800
committerGitHub <noreply@github.com>2023-03-07 23:01:29 -0800
commit34bebfe31183289b5428b9a363a4596750030d3f (patch)
tree710f797e104f07d2b40d4d4a1ac29251fed90a05
parent5f3dffe915c329501b3fb7765d664e49740ea038 (diff)
parentca2b1000db77646c58b335de9230bf4e6af27e31 (diff)
downloadspike-34bebfe31183289b5428b9a363a4596750030d3f.zip
spike-34bebfe31183289b5428b9a363a4596750030d3f.tar.gz
spike-34bebfe31183289b5428b9a363a4596750030d3f.tar.bz2
Merge pull request #1274 from riscv-software-src/more-symbols
Add +symbol_elf flag to fesvr to support loading in symbols from other elf files
-rw-r--r--fesvr/htif.cc43
-rw-r--r--fesvr/htif.h4
2 files changed, 36 insertions, 11 deletions
diff --git a/fesvr/htif.cc b/fesvr/htif.cc
index 46dfaac..3f93f7b 100644
--- a/fesvr/htif.cc
+++ b/fesvr/htif.cc
@@ -7,6 +7,7 @@
#include "platform.h"
#include "byteorder.h"
#include "trap.h"
+#include "../riscv/common.h"
#include <algorithm>
#include <assert.h>
#include <vector>
@@ -161,26 +162,39 @@ void htif_t::load_program()
}
// detect torture tests so we can print the memory signature at the end
- if (symbols.count("begin_signature") && symbols.count("end_signature"))
- {
+ 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)
- {
+ for (auto payload : payloads) {
reg_t dummy_entry;
load_payload(payload, &dummy_entry);
}
- for (auto i : symbols)
- {
- auto it = addr2symbol.find(i.second);
- if ( it == addr2symbol.end())
- addr2symbol[i.second] = i.first;
- }
+ class nop_memif_t : public memif_t {
+ public:
+ nop_memif_t(htif_t* htif) : memif_t(htif), htif(htif) {}
+ void read(addr_t UNUSED addr, size_t UNUSED len, void UNUSED *bytes) override {}
+ void write(addr_t UNUSED taddr, size_t UNUSED len, const void UNUSED *src) override {}
+ private:
+ htif_t* htif;
+ } nop_memif(this);
- return;
+ reg_t nop_entry;
+ for (auto &s : symbol_elfs) {
+ std::map<std::string, uint64_t> other_symbols = load_elf(s.c_str(), &nop_memif, &nop_entry,
+ expected_xlen);
+ symbols.merge(other_symbols);
+ }
+
+ for (auto i : symbols) {
+ auto it = addr2symbol.find(i.second);
+ if ( it == addr2symbol.end())
+ addr2symbol[i.second] = i.first;
+ }
+
+ return;
}
const char* htif_t::get_symbol(uint64_t addr)
@@ -331,6 +345,9 @@ void htif_t::parse_arguments(int argc, char ** argv)
case HTIF_LONG_OPTIONS_OPTIND + 6:
targs.push_back(optarg);
break;
+ case HTIF_LONG_OPTIONS_OPTIND + 7:
+ symbol_elfs.push_back(optarg);
+ break;
case '?':
if (!opterr)
break;
@@ -373,6 +390,10 @@ void htif_t::parse_arguments(int argc, char ** argv)
c = HTIF_LONG_OPTIONS_OPTIND + 6;
optarg = optarg + 17;
}
+ else if (arg.find("+symbol-elf=") == 0) {
+ c = HTIF_LONG_OPTIONS_OPTIND + 7;
+ optarg = optarg + 12;
+ }
else if (arg.find("+permissive-off") == 0) {
if (opterr)
throw std::invalid_argument("Found +permissive-off when not parsing permissively");
diff --git a/fesvr/htif.h b/fesvr/htif.h
index 18ba766..dd7c060 100644
--- a/fesvr/htif.h
+++ b/fesvr/htif.h
@@ -99,6 +99,7 @@ class htif_t : public chunked_memif_t
std::vector<device_t*> dynamic_devices;
std::vector<std::string> payloads;
+ std::vector<std::string> symbol_elfs;
std::map<uint64_t, std::string> addr2symbol;
friend class memif_t;
@@ -127,6 +128,8 @@ class htif_t : public chunked_memif_t
+chroot=PATH\n\
--payload=PATH Load PATH memory as an additional ELF payload\n\
+payload=PATH\n\
+ --symbol-elf=PATH Populate the symbol table with the ELF file at PATH\n\
+ +symbol-elf=PATH\n\
\n\
HOST OPTIONS (currently unsupported)\n\
--disk=DISK Add DISK device. Use a ramdisk since this isn't\n\
@@ -146,6 +149,7 @@ TARGET (RISC-V BINARY) OPTIONS\n\
{"payload", required_argument, 0, HTIF_LONG_OPTIONS_OPTIND + 4 }, \
{"signature-granularity", required_argument, 0, HTIF_LONG_OPTIONS_OPTIND + 5 }, \
{"target-argument", required_argument, 0, HTIF_LONG_OPTIONS_OPTIND + 6 }, \
+{"symbol-elf", required_argument, 0, HTIF_LONG_OPTIONS_OPTIND + 7 }, \
{0, 0, 0, 0}
#endif // __HTIF_H