add TCC backend
This commit is contained in:
parent
264053a8d6
commit
0698b604fd
|
@ -260,13 +260,13 @@ vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, unsigned int &inst_cnt,
|
||||||
|
|
||||||
template <typename ARCH> void vm_impl<ARCH>::gen_raise_trap(tu_builder& tu, uint16_t trap_id, uint16_t cause) {
|
template <typename ARCH> void vm_impl<ARCH>::gen_raise_trap(tu_builder& tu, uint16_t trap_id, uint16_t cause) {
|
||||||
tu(" *trap_state = {:#x};", 0x80 << 24 | (cause << 16) | trap_id);
|
tu(" *trap_state = {:#x};", 0x80 << 24 | (cause << 16) | trap_id);
|
||||||
tu.create_store(tu.gen_const(32, std::numeric_limits<uint32_t>::max()),traits<ARCH>::LAST_BRANCH);
|
tu.store(tu.constant(std::numeric_limits<uint32_t>::max(), 32),traits<ARCH>::LAST_BRANCH);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename ARCH> void vm_impl<ARCH>::gen_leave_trap(tu_builder& tu, unsigned lvl) {
|
template <typename ARCH> void vm_impl<ARCH>::gen_leave_trap(tu_builder& tu, unsigned lvl) {
|
||||||
tu("leave_trap(core_ptr, {});", lvl);
|
tu("leave_trap(core_ptr, {});", lvl);
|
||||||
tu.create_store(tu.create_read_mem(traits<ARCH>::CSR, (lvl << 8) + 0x41, traits<ARCH>::XLEN / 8),traits<ARCH>::NEXT_PC);
|
tu.store(tu.read_mem(traits<ARCH>::CSR, (lvl << 8) + 0x41, traits<ARCH>::XLEN),traits<ARCH>::NEXT_PC);
|
||||||
tu.create_store(tu.gen_const(32, std::numeric_limits<uint32_t>::max()),traits<ARCH>::LAST_BRANCH);
|
tu.store(tu.constant(std::numeric_limits<uint32_t>::max(), 32),traits<ARCH>::LAST_BRANCH);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename ARCH> void vm_impl<ARCH>::gen_wait(tu_builder& tu, unsigned type) {
|
template <typename ARCH> void vm_impl<ARCH>::gen_wait(tu_builder& tu, unsigned type) {
|
||||||
|
@ -275,7 +275,7 @@ template <typename ARCH> void vm_impl<ARCH>::gen_wait(tu_builder& tu, unsigned t
|
||||||
template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(tu_builder& tu) {
|
template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(tu_builder& tu) {
|
||||||
tu("trap_entry:");
|
tu("trap_entry:");
|
||||||
tu("enter_trap(core_ptr, *trap_state, *pc);");
|
tu("enter_trap(core_ptr, *trap_state, *pc);");
|
||||||
tu.create_store(tu.gen_const(32, std::numeric_limits<uint32_t>::max()),traits<ARCH>::LAST_BRANCH);
|
tu.store(tu.constant(std::numeric_limits<uint32_t>::max(),32),traits<ARCH>::LAST_BRANCH);
|
||||||
tu("return *next_pc;");
|
tu("return *next_pc;");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -657,10 +657,12 @@ iss::status riscv_hart_msu_vp<BASE>::read(const address_type type, const access_
|
||||||
const uint64_t addr, const unsigned length, uint8_t *const data) {
|
const uint64_t addr, const unsigned length, uint8_t *const data) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
if (access && iss::access_type::DEBUG) {
|
if (access && iss::access_type::DEBUG) {
|
||||||
LOG(TRACE) << "debug read of " << length << " bytes @addr 0x" << std::hex << addr;
|
LOG(TRACEALL) << "debug read of " << length << " bytes @addr 0x" << std::hex << addr;
|
||||||
|
} else if(access && iss::access_type::FETCH){
|
||||||
|
LOG(TRACEALL) << "fetch of " << length << " bytes @addr 0x" << std::hex << addr;
|
||||||
} else {
|
} else {
|
||||||
LOG(TRACE) << "read of " << length << " bytes @addr 0x" << std::hex << addr;
|
LOG(TRACE) << "read of " << length << " bytes @addr 0x" << std::hex << addr;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
try {
|
try {
|
||||||
switch (space) {
|
switch (space) {
|
||||||
|
@ -1318,7 +1320,7 @@ template <typename BASE> uint64_t riscv_hart_msu_vp<BASE>::enter_trap(uint64_t f
|
||||||
sprintf(buffer.data(), "0x%016lx", addr);
|
sprintf(buffer.data(), "0x%016lx", addr);
|
||||||
if((flags&0xffffffff) != 0xffffffff)
|
if((flags&0xffffffff) != 0xffffffff)
|
||||||
CLOG(INFO, disass) << (trap_id ? "Interrupt" : "Trap") << " with cause '"
|
CLOG(INFO, disass) << (trap_id ? "Interrupt" : "Trap") << " with cause '"
|
||||||
<< (trap_id ? irq_str[cause] : trap_str[cause]) << "' (" << trap_id << ")"
|
<< (trap_id ? irq_str[cause] : trap_str[cause]) << "' (" << cause << ")"
|
||||||
<< " at address " << buffer.data() << " occurred, changing privilege level from "
|
<< " at address " << buffer.data() << " occurred, changing privilege level from "
|
||||||
<< lvl[cur_priv] << " to " << lvl[new_priv];
|
<< lvl[cur_priv] << " to " << lvl[new_priv];
|
||||||
update_vm_info();
|
update_vm_info();
|
||||||
|
|
14
src/main.cpp
14
src/main.cpp
|
@ -63,6 +63,7 @@ int main(int argc, char *argv[]) {
|
||||||
("elf", po::value<std::vector<std::string>>(), "ELF file(s) to load")
|
("elf", po::value<std::vector<std::string>>(), "ELF file(s) to load")
|
||||||
("mem,m", po::value<std::string>(), "the memory input file")
|
("mem,m", po::value<std::string>(), "the memory input file")
|
||||||
("plugin,p", po::value<std::vector<std::string>>(), "plugin to activate")
|
("plugin,p", po::value<std::vector<std::string>>(), "plugin to activate")
|
||||||
|
("backend", po::value<std::string>()->default_value("tcc"), "the memory input file")
|
||||||
("isa", po::value<std::string>()->default_value("rv32gc"), "isa to use for simulation");
|
("isa", po::value<std::string>()->default_value("rv32gc"), "isa to use for simulation");
|
||||||
// clang-format on
|
// clang-format on
|
||||||
auto parsed = po::command_line_parser(argc, argv).options(desc).allow_unregistered().run();
|
auto parsed = po::command_line_parser(argc, argv).options(desc).allow_unregistered().run();
|
||||||
|
@ -82,6 +83,8 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
std::vector<std::string> args = collect_unrecognized(parsed.options, po::include_positional);
|
std::vector<std::string> args = collect_unrecognized(parsed.options, po::include_positional);
|
||||||
|
|
||||||
|
LOGGER(DEFAULT)::print_time() = false;
|
||||||
|
LOGGER(connection)::print_time() = false;
|
||||||
if (clim.count("verbose")) {
|
if (clim.count("verbose")) {
|
||||||
auto l = logging::as_log_level(clim["verbose"].as<int>());
|
auto l = logging::as_log_level(clim["verbose"].as<int>());
|
||||||
LOGGER(DEFAULT)::reporting_level() = l;
|
LOGGER(DEFAULT)::reporting_level() = l;
|
||||||
|
@ -105,9 +108,12 @@ int main(int argc, char *argv[]) {
|
||||||
std::unique_ptr<iss::arch_if> cpu{nullptr};
|
std::unique_ptr<iss::arch_if> cpu{nullptr};
|
||||||
std::string isa_opt(clim["isa"].as<std::string>());
|
std::string isa_opt(clim["isa"].as<std::string>());
|
||||||
iss::arch::mnrv32* lcpu = new iss::arch::riscv_hart_msu_vp<iss::arch::mnrv32>();
|
iss::arch::mnrv32* lcpu = new iss::arch::riscv_hart_msu_vp<iss::arch::mnrv32>();
|
||||||
//vm = iss::interp::create(lcpu, clim["gdb-port"].as<unsigned>());
|
if(clim["backend"].as<std::string>() == "interp")
|
||||||
//vm = iss::llvm::create(lcpu, clim["gdb-port"].as<unsigned>());
|
vm = iss::interp::create(lcpu, clim["gdb-port"].as<unsigned>());
|
||||||
vm = iss::tcc::create(lcpu, clim["gdb-port"].as<unsigned>());
|
if(clim["backend"].as<std::string>() == "llvm")
|
||||||
|
vm = iss::llvm::create(lcpu, clim["gdb-port"].as<unsigned>());
|
||||||
|
if(clim["backend"].as<std::string>() == "tcc")
|
||||||
|
vm = iss::tcc::create(lcpu, clim["gdb-port"].as<unsigned>());
|
||||||
cpu.reset(lcpu);
|
cpu.reset(lcpu);
|
||||||
if (clim.count("plugin")) {
|
if (clim.count("plugin")) {
|
||||||
for (std::string opt_val : clim["plugin"].as<std::vector<std::string>>()) {
|
for (std::string opt_val : clim["plugin"].as<std::vector<std::string>>()) {
|
||||||
|
@ -135,10 +141,10 @@ int main(int argc, char *argv[]) {
|
||||||
if (clim.count("disass")) {
|
if (clim.count("disass")) {
|
||||||
vm->setDisassEnabled(true);
|
vm->setDisassEnabled(true);
|
||||||
LOGGER(disass)::reporting_level() = logging::INFO;
|
LOGGER(disass)::reporting_level() = logging::INFO;
|
||||||
|
LOGGER(disass)::print_time() = false;
|
||||||
auto file_name = clim["disass"].as<std::string>();
|
auto file_name = clim["disass"].as<std::string>();
|
||||||
if (file_name.length() > 0) {
|
if (file_name.length() > 0) {
|
||||||
LOG_OUTPUT(disass)::stream() = fopen(file_name.c_str(), "w");
|
LOG_OUTPUT(disass)::stream() = fopen(file_name.c_str(), "w");
|
||||||
LOGGER(disass)::print_time() = false;
|
|
||||||
LOGGER(disass)::print_severity() = false;
|
LOGGER(disass)::print_severity() = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue