Browse Source

Merge pull request #920 from rswarbrick/dtb-checks

Add simple error checking to DTB parsing code
pull/921/head
Andrew Waterman 4 years ago
committed by GitHub
parent
commit
f224b15add
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 30
      riscv/sim.cc

30
riscv/sim.cc

@ -6,6 +6,7 @@
#include "remote_bitbang.h"
#include "byteorder.h"
#include "platform.h"
#include "libfdt.h"
#include <fstream>
#include <map>
#include <iostream>
@ -296,6 +297,18 @@ void sim_t::make_dtb()
dts = make_dts(INSNS_PER_RTC_TICK, CPU_HZ, initrd_start, initrd_end, bootargs, procs, mems);
dtb = dts_compile(dts);
}
int fdt_code = fdt_check_header(dtb.c_str());
if (fdt_code) {
std::cerr << "Failed to read DTB from ";
if (dtb_file.empty()) {
std::cerr << "auto-generated DTS string";
} else {
std::cerr << "`" << dtb_file << "'";
}
std::cerr << ": " << fdt_strerror(fdt_code) << ".\n";
exit(-1);
}
}
void sim_t::set_rom()
@ -335,23 +348,6 @@ void sim_t::set_rom()
std::vector<char> rom((char*)reset_vec, (char*)reset_vec + sizeof(reset_vec));
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, bootargs, procs, mems);
dtb = dts_compile(dts);
}
rom.insert(rom.end(), dtb.begin(), dtb.end());
const int align = 0x1000;
rom.resize((rom.size() + align - 1) / align * align);

Loading…
Cancel
Save