From 877a8069db245018b8c2449cb44e76a48d216c5e Mon Sep 17 00:00:00 2001 From: Chih-Min Chao Date: Tue, 31 Mar 2020 00:41:33 -0700 Subject: fdt: option: add --dtb option to specify dtb binary file Signed-off-by: Chih-Min Chao --- riscv/sim.cc | 19 +++++++++++++++++-- riscv/sim.h | 5 +++++ spike_main/spike.cc | 3 +++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/riscv/sim.cc b/riscv/sim.cc index 0b29720..ac527a8 100644 --- a/riscv/sim.cc +++ b/riscv/sim.cc @@ -5,6 +5,7 @@ #include "dts.h" #include "remote_bitbang.h" #include "byteorder.h" +#include #include #include #include @@ -211,8 +212,22 @@ void sim_t::make_dtb() std::vector rom((char*)reset_vec, (char*)reset_vec + sizeof(reset_vec)); - dts = make_dts(INSNS_PER_RTC_TICK, CPU_HZ, initrd_start, initrd_end, procs, mems); - std::string dtb = dts_compile(dts); + std::string dtb; + if (!dtb_file.empty()) { + std::ifstream fin(dtb_file.c_str(), std::ios::binary); + if (!fin.good()) { + std::cerr << "can't find dtb file: " << dtb_file << std::endl; + exit(-1); + } + + std::stringstream strstream; + strstream << fin.rdbuf(); + + dtb = strstream.str(); + } else { + dts = make_dts(INSNS_PER_RTC_TICK, CPU_HZ, initrd_start, initrd_end, procs, mems); + dtb = dts_compile(dts); + } rom.insert(rom.end(), dtb.begin(), dtb.end()); const int align = 0x1000; diff --git a/riscv/sim.h b/riscv/sim.h index 91aedab..0cf518d 100644 --- a/riscv/sim.h +++ b/riscv/sim.h @@ -49,6 +49,10 @@ public: void set_dtb_enabled(bool value) { this->dtb_enabled = value; } + void set_dtb_file(const char* value) { + if (value) + this->dtb_file = value; + } void set_remote_bitbang(remote_bitbang_t* remote_bitbang) { this->remote_bitbang = remote_bitbang; } @@ -68,6 +72,7 @@ private: reg_t initrd_end; reg_t start_pc; std::string dts; + std::string dtb_file; std::unique_ptr boot_rom; std::unique_ptr clint; bus_t bus; diff --git a/spike_main/spike.cc b/spike_main/spike.cc index 9056f31..d88f5b8 100644 --- a/spike_main/spike.cc +++ b/spike_main/spike.cc @@ -165,6 +165,7 @@ int main(int argc, char** argv) const char* isa = DEFAULT_ISA; const char* priv = DEFAULT_PRIV; const char* varch = DEFAULT_VARCH; + const char* dtb_file = NULL; uint16_t rbb_port = 0; bool use_rbb = false; unsigned dmi_rti = 0; @@ -258,6 +259,7 @@ int main(int argc, char** argv) parser.option(0, "extension", 1, [&](const char* s){extension = find_extension(s);}); parser.option(0, "dump-dts", 0, [&](const char *s){dump_dts = true;}); parser.option(0, "disable-dtb", 0, [&](const char *s){dtb_enabled = false;}); + parser.option(0, "dtb", 1, [&](const char *s){dtb_file = s;}); parser.option(0, "initrd", 1, [&](const char* s){initrd = s;}); parser.option(0, "real-time-clint", 0, [&](const char *s){real_time_clint = true;}); parser.option(0, "extlib", 1, [&](const char *s){ @@ -319,6 +321,7 @@ int main(int argc, char** argv) s.set_remote_bitbang(&(*remote_bitbang)); } s.set_dtb_enabled(dtb_enabled); + s.set_dtb_file(dtb_file); if (dump_dts) { printf("%s", s.get_dts()); -- cgit v1.1