diff options
author | Clément Léger <cleger@rivosinc.com> | 2024-05-15 17:15:40 +0200 |
---|---|---|
committer | Clément Léger <cleger@rivosinc.com> | 2024-05-29 14:20:20 +0200 |
commit | a316a37331aaaa4c8905ba37a86bde42a2c75343 (patch) | |
tree | 2bac0c1b3e4c2cdc65183ea1b97ce3433f767b8d /fesvr/htif.cc | |
parent | c81d8e73daf1875d79a54f28f67df150fba0e44c (diff) | |
download | spike-a316a37331aaaa4c8905ba37a86bde42a2c75343.zip spike-a316a37331aaaa4c8905ba37a86bde42a2c75343.tar.gz spike-a316a37331aaaa4c8905ba37a86bde42a2c75343.tar.bz2 |
add support to load ET_DYN elf
When compiled as PIE, executable can be loaded at any memory address.
Lately, OpenSBI switched to such behavior and spike was not able to load
it anymore. This patch add an additional load_offset parameter for
load_elf(). This load_offset value is passed as DRAM_BASE and used only
for ET_DYN elfs.
Signed-off-by: Clément Léger <cleger@rivosinc.com>
Diffstat (limited to 'fesvr/htif.cc')
-rw-r--r-- | fesvr/htif.cc | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/fesvr/htif.cc b/fesvr/htif.cc index 8b5eb8d..46f15d3 100644 --- a/fesvr/htif.cc +++ b/fesvr/htif.cc @@ -103,7 +103,7 @@ static void bad_address(const std::string& situation, reg_t addr) exit(-1); } -std::map<std::string, uint64_t> htif_t::load_payload(const std::string& payload, reg_t* entry) +std::map<std::string, uint64_t> htif_t::load_payload(const std::string& payload, reg_t* entry, reg_t load_offset) { std::string path; if (access(payload.c_str(), F_OK) == 0) @@ -143,7 +143,7 @@ std::map<std::string, uint64_t> htif_t::load_payload(const std::string& payload, } preload_aware_memif(this); try { - return load_elf(path.c_str(), &preload_aware_memif, entry, expected_xlen); + return load_elf(path.c_str(), &preload_aware_memif, entry, load_offset, expected_xlen); } catch (mem_trap_t& t) { bad_address("loading payload " + payload, t.get_tval()); abort(); @@ -152,7 +152,7 @@ std::map<std::string, uint64_t> htif_t::load_payload(const std::string& payload, void htif_t::load_program() { - std::map<std::string, uint64_t> symbols = load_payload(targs[0], &entry); + std::map<std::string, uint64_t> symbols = load_payload(targs[0], &entry, load_offset); if (symbols.count("tohost") && symbols.count("fromhost")) { tohost_addr = symbols["tohost"]; @@ -169,7 +169,7 @@ void htif_t::load_program() for (auto payload : payloads) { reg_t dummy_entry; - load_payload(payload, &dummy_entry); + load_payload(payload, &dummy_entry, 0); } class nop_memif_t : public memif_t { |