adds windows compatibility fixes

This commit is contained in:
Eyck Jentzsch 2022-07-18 11:02:17 +02:00
parent a53ee42e13
commit 4876f18ba9
5 changed files with 262 additions and 254 deletions

View File

@ -30,10 +30,10 @@
* *
*******************************************************************************/ *******************************************************************************/
#include <iss/arch/${coreDef.name.toLowerCase()}.h>
#include <iss/arch/riscv_hart_m_p.h>
#include <iss/debugger/gdb_session.h> #include <iss/debugger/gdb_session.h>
#include <iss/debugger/server.h> #include <iss/debugger/server.h>
#include <iss/arch/${coreDef.name.toLowerCase()}.h>
#include <iss/arch/riscv_hart_m_p.h>
#include <iss/iss.h> #include <iss/iss.h>
#include <iss/llvm/vm_base.h> #include <iss/llvm/vm_base.h>
#include <util/logging.h> #include <util/logging.h>

View File

@ -45,7 +45,7 @@ namespace iss {
namespace plugin { namespace plugin {
class cycle_estimate: public iss::vm_plugin { class cycle_estimate: public vm_plugin {
BEGIN_BF_DECL(instr_desc, uint32_t) BEGIN_BF_DECL(instr_desc, uint32_t)
BF_FIELD(taken, 24, 8) BF_FIELD(taken, 24, 8)
BF_FIELD(not_taken, 16, 8) BF_FIELD(not_taken, 16, 8)

View File

@ -1,236 +1,241 @@
/******************************************************************************* /*******************************************************************************
* Copyright (C) 2017, 2018 MINRES Technologies GmbH * Copyright (C) 2017, 2018 MINRES Technologies GmbH
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* *
* 1. Redistributions of source code must retain the above copyright notice, * 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer. * this list of conditions and the following disclaimer.
* *
* 2. Redistributions in binary form must reproduce the above copyright notice, * 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation * this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution. * and/or other materials provided with the distribution.
* *
* 3. Neither the name of the copyright holder nor the names of its contributors * 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
* *
*******************************************************************************/ *******************************************************************************/
#include <iostream> #include <iostream>
#include <iss/factory.h> #include "iss/factory.h"
#include <boost/lexical_cast.hpp> #include <boost/lexical_cast.hpp>
#include <boost/program_options.hpp> #include <boost/program_options.hpp>
#include "iss/arch/tgc_mapper.h" #include "iss/arch/tgc_mapper.h"
#ifdef WITH_LLVM #ifdef WITH_LLVM
#include <iss/llvm/jit_helper.h> #include <iss/llvm/jit_helper.h>
#endif #endif
#include <iss/log_categories.h> #include <iss/log_categories.h>
#include "iss/plugin/cycle_estimate.h" #include "iss/plugin/cycle_estimate.h"
#include "iss/plugin/instruction_count.h" #include "iss/plugin/instruction_count.h"
#include "iss/plugin/pctrace.h" #include "iss/plugin/pctrace.h"
#include <iss/plugin/loader.h> #ifndef WIN32
#if defined(HAS_LUA) #include <iss/plugin/loader.h>
#include <iss/plugin/lua.h> #endif
#endif #if defined(HAS_LUA)
#include <iss/plugin/lua.h>
namespace po = boost::program_options; #endif
int main(int argc, char *argv[]) { namespace po = boost::program_options;
/*
* Define and parse the program options int main(int argc, char *argv[]) {
*/ /*
po::variables_map clim; * Define and parse the program options
po::options_description desc("Options"); */
// clang-format off po::variables_map clim;
desc.add_options() po::options_description desc("Options");
("help,h", "Print help message") // clang-format off
("verbose,v", po::value<int>()->implicit_value(0), "Sets logging verbosity") desc.add_options()
("logfile,l", po::value<std::string>(), "Sets default log file.") ("help,h", "Print help message")
("disass,d", po::value<std::string>()->implicit_value(""), "Enables disassembly") ("verbose,v", po::value<int>()->implicit_value(0), "Sets logging verbosity")
("gdb-port,g", po::value<unsigned>()->default_value(0), "enable gdb server and specify port to use") ("logfile,l", po::value<std::string>(), "Sets default log file.")
("instructions,i", po::value<uint64_t>()->default_value(std::numeric_limits<uint64_t>::max()), "max. number of instructions to simulate") ("disass,d", po::value<std::string>()->implicit_value(""), "Enables disassembly")
("reset,r", po::value<std::string>(), "reset address") ("gdb-port,g", po::value<unsigned>()->default_value(0), "enable gdb server and specify port to use")
("dump-ir", "dump the intermediate representation") ("instructions,i", po::value<uint64_t>()->default_value(std::numeric_limits<uint64_t>::max()), "max. number of instructions to simulate")
("elf,f", po::value<std::vector<std::string>>(), "ELF file(s) to load") ("reset,r", po::value<std::string>(), "reset address")
("mem,m", po::value<std::string>(), "the memory input file") ("dump-ir", "dump the intermediate representation")
("plugin,p", po::value<std::vector<std::string>>(), "plugin to activate") ("elf,f", po::value<std::vector<std::string>>(), "ELF file(s) to load")
("backend", po::value<std::string>()->default_value("interp"), "the memory input file") ("mem,m", po::value<std::string>(), "the memory input file")
("isa", po::value<std::string>()->default_value("tgc_c"), "isa to use for simulation"); ("plugin,p", po::value<std::vector<std::string>>(), "plugin to activate")
// clang-format on ("backend", po::value<std::string>()->default_value("interp"), "the memory input file")
auto parsed = po::command_line_parser(argc, argv).options(desc).allow_unregistered().run(); ("isa", po::value<std::string>()->default_value("tgc_c"), "isa to use for simulation");
try { // clang-format on
po::store(parsed, clim); // can throw auto parsed = po::command_line_parser(argc, argv).options(desc).allow_unregistered().run();
// --help option try {
if (clim.count("help")) { po::store(parsed, clim); // can throw
std::cout << "DBT-RISE-RiscV simulator for RISC-V" << std::endl << desc << std::endl; // --help option
return 0; if (clim.count("help")) {
} std::cout << "DBT-RISE-RiscV simulator for RISC-V" << std::endl << desc << std::endl;
po::notify(clim); // throws on error, so do after help in case return 0;
} catch (po::error &e) { }
// there are problems po::notify(clim); // throws on error, so do after help in case
std::cerr << "ERROR: " << e.what() << std::endl << std::endl; } catch (po::error &e) {
std::cerr << desc << std::endl; // there are problems
return 1; std::cerr << "ERROR: " << e.what() << std::endl << std::endl;
} std::cerr << desc << std::endl;
std::vector<std::string> args = collect_unrecognized(parsed.options, po::include_positional); return 1;
}
LOGGER(DEFAULT)::print_time() = false; std::vector<std::string> args = collect_unrecognized(parsed.options, po::include_positional);
LOGGER(connection)::print_time() = false;
if (clim.count("verbose")) { LOGGER(DEFAULT)::print_time() = false;
auto l = logging::as_log_level(clim["verbose"].as<int>()); LOGGER(connection)::print_time() = false;
LOGGER(DEFAULT)::reporting_level() = l; if (clim.count("verbose")) {
LOGGER(connection)::reporting_level() = l; auto l = logging::as_log_level(clim["verbose"].as<int>());
} LOGGER(DEFAULT)::reporting_level() = l;
if (clim.count("logfile")) { LOGGER(connection)::reporting_level() = l;
// configure the connection logger }
auto f = fopen(clim["logfile"].as<std::string>().c_str(), "w"); if (clim.count("logfile")) {
LOG_OUTPUT(DEFAULT)::stream() = f; // configure the connection logger
LOG_OUTPUT(connection)::stream() = f; auto f = fopen(clim["logfile"].as<std::string>().c_str(), "w");
} LOG_OUTPUT(DEFAULT)::stream() = f;
LOG_OUTPUT(connection)::stream() = f;
std::vector<iss::vm_plugin *> plugin_list; }
auto res = 0;
try { std::vector<iss::vm_plugin *> plugin_list;
#ifdef WITH_LLVM auto res = 0;
// application code comes here // try {
iss::init_jit_debug(argc, argv); #ifdef WITH_LLVM
#endif // application code comes here //
bool dump = clim.count("dump-ir"); iss::init_jit_debug(argc, argv);
// instantiate the simulator #endif
iss::vm_ptr vm{nullptr}; bool dump = clim.count("dump-ir");
iss::cpu_ptr cpu{nullptr}; // instantiate the simulator
std::string isa_opt(clim["isa"].as<std::string>()); iss::vm_ptr vm{nullptr};
if (isa_opt == "tgc_c") { iss::cpu_ptr cpu{nullptr};
std::tie(cpu, vm) = std::string isa_opt(clim["isa"].as<std::string>());
iss::create_cpu<tgc_c_plat_type>(clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>()); if (isa_opt == "tgc_c") {
} else std::tie(cpu, vm) =
#ifdef CORE_TGC_B iss::create_cpu<tgc_c_plat_type>(clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>());
if (isa_opt == "tgc_b") { } else
std::tie(cpu, vm) = #ifdef CORE_TGC_B
iss::create_cpu<tgc_b_plat_type>(clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>()); if (isa_opt == "tgc_b") {
} else std::tie(cpu, vm) =
#endif iss::create_cpu<tgc_b_plat_type>(clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>());
#ifdef CORE_TGC_C_XRB_NN } else
if (isa_opt == "tgc_c_xrb_nn") { #endif
std::tie(cpu, vm) = #ifdef CORE_TGC_C_XRB_NN
iss::create_cpu<tgc_c_xrb_nn_plat_type>(clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>()); if (isa_opt == "tgc_c_xrb_nn") {
} else std::tie(cpu, vm) =
#endif iss::create_cpu<tgc_c_xrb_nn_plat_type>(clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>());
#ifdef CORE_TGC_D } else
if (isa_opt == "tgc_d") { #endif
std::tie(cpu, vm) = #ifdef CORE_TGC_D
iss::create_cpu<tgc_d_plat_type>(clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>()); if (isa_opt == "tgc_d") {
} else std::tie(cpu, vm) =
#endif iss::create_cpu<tgc_d_plat_type>(clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>());
#ifdef CORE_TGC_D_XRB_MAC } else
if (isa_opt == "tgc_d_xrb_mac") { #endif
std::tie(cpu, vm) = #ifdef CORE_TGC_D_XRB_MAC
iss::create_cpu<tgc_d_xrb_mac_plat_type>(clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>()); if (isa_opt == "tgc_d_xrb_mac") {
} else std::tie(cpu, vm) =
#endif iss::create_cpu<tgc_d_xrb_mac_plat_type>(clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>());
#ifdef CORE_TGC_D_XRB_NN } else
if (isa_opt == "tgc_d_xrb_nn") { #endif
std::tie(cpu, vm) = #ifdef CORE_TGC_D_XRB_NN
iss::create_cpu<tgc_d_xrb_nn_plat_type>(clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>()); if (isa_opt == "tgc_d_xrb_nn") {
} else std::tie(cpu, vm) =
#endif iss::create_cpu<tgc_d_xrb_nn_plat_type>(clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>());
#ifdef CORE_TGC_E } else
if (isa_opt == "tgc_e") { #endif
std::tie(cpu, vm) = #ifdef CORE_TGC_E
iss::create_cpu<tgc_e_plat_type>(clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>()); if (isa_opt == "tgc_e") {
} else std::tie(cpu, vm) =
#endif iss::create_cpu<tgc_e_plat_type>(clim["backend"].as<std::string>(), clim["gdb-port"].as<unsigned>());
{ } else
#endif
{
LOG(ERR) << "Illegal argument value for '--isa': " << isa_opt << std::endl; LOG(ERR) << "Illegal argument value for '--isa': " << isa_opt << std::endl;
return 127; return 127;
} }
if (clim.count("plugin")) { if (clim.count("plugin")) {
for (std::string const& opt_val : clim["plugin"].as<std::vector<std::string>>()) { for (std::string const& opt_val : clim["plugin"].as<std::vector<std::string>>()) {
std::string plugin_name=opt_val; std::string plugin_name=opt_val;
std::string filename{"cycles.txt"}; std::string filename{"cycles.txt"};
std::size_t found = opt_val.find('='); std::size_t found = opt_val.find('=');
if (found != std::string::npos) { if (found != std::string::npos) {
plugin_name = opt_val.substr(0, found); plugin_name = opt_val.substr(0, found);
filename = opt_val.substr(found + 1, opt_val.size()); filename = opt_val.substr(found + 1, opt_val.size());
} }
if (plugin_name == "ic") { if (plugin_name == "ic") {
auto *ic_plugin = new iss::plugin::instruction_count(filename); auto *ic_plugin = new iss::plugin::instruction_count(filename);
vm->register_plugin(*ic_plugin); vm->register_plugin(*ic_plugin);
plugin_list.push_back(ic_plugin); plugin_list.push_back(ic_plugin);
} else if (plugin_name == "ce") { } else if (plugin_name == "ce") {
auto *ce_plugin = new iss::plugin::cycle_estimate(filename); auto *ce_plugin = new iss::plugin::cycle_estimate(filename);
vm->register_plugin(*ce_plugin); vm->register_plugin(*ce_plugin);
plugin_list.push_back(ce_plugin); plugin_list.push_back(ce_plugin);
} else if (plugin_name == "pctrace") { } else if (plugin_name == "pctrace") {
auto *plugin = new iss::plugin::pctrace(filename); auto *plugin = new iss::plugin::pctrace(filename);
vm->register_plugin(*plugin); vm->register_plugin(*plugin);
plugin_list.push_back(plugin); plugin_list.push_back(plugin);
} else { } else {
std::array<char const*, 1> a{{filename.c_str()}}; #ifndef WIN32
iss::plugin::loader l(plugin_name, {{"initPlugin"}}); std::array<char const*, 1> a{{filename.c_str()}};
auto* plugin = l.call_function<iss::vm_plugin*>("initPlugin", a.size(), a.data()); iss::plugin::loader l(plugin_name, {{"initPlugin"}});
if(plugin){ auto* plugin = l.call_function<iss::vm_plugin*>("initPlugin", a.size(), a.data());
vm->register_plugin(*plugin); if(plugin){
plugin_list.push_back(plugin); vm->register_plugin(*plugin);
} else { plugin_list.push_back(plugin);
} else
#endif
{
LOG(ERR) << "Unknown plugin name: " << plugin_name << ", valid names are 'ce', 'ic'" << std::endl; LOG(ERR) << "Unknown plugin name: " << plugin_name << ", valid names are 'ce', 'ic'" << std::endl;
return 127; return 127;
} }
} }
} }
} }
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; 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_severity() = false; LOGGER(disass)::print_severity() = false;
} }
} }
uint64_t start_address = 0; uint64_t start_address = 0;
if (clim.count("mem")) if (clim.count("mem"))
vm->get_arch()->load_file(clim["mem"].as<std::string>()); vm->get_arch()->load_file(clim["mem"].as<std::string>());
if (clim.count("elf")) if (clim.count("elf"))
for (std::string input : clim["elf"].as<std::vector<std::string>>()) { for (std::string input : clim["elf"].as<std::vector<std::string>>()) {
auto start_addr = vm->get_arch()->load_file(input); auto start_addr = vm->get_arch()->load_file(input);
if (start_addr.second) start_address = start_addr.first; if (start_addr.second) start_address = start_addr.first;
} }
for (std::string input : args) { for (std::string input : args) {
auto start_addr = vm->get_arch()->load_file(input); // treat remaining arguments as elf files auto start_addr = vm->get_arch()->load_file(input); // treat remaining arguments as elf files
if (start_addr.second) start_address = start_addr.first; if (start_addr.second) start_address = start_addr.first;
} }
if (clim.count("reset")) { if (clim.count("reset")) {
auto str = clim["reset"].as<std::string>(); auto str = clim["reset"].as<std::string>();
start_address = str.find("0x") == 0 ? std::stoull(str.substr(2), nullptr, 16) : std::stoull(str, nullptr, 10); start_address = str.find("0x") == 0 ? std::stoull(str.substr(2), nullptr, 16) : std::stoull(str, nullptr, 10);
} }
vm->reset(start_address); vm->reset(start_address);
auto cycles = clim["instructions"].as<uint64_t>(); auto cycles = clim["instructions"].as<uint64_t>();
res = vm->start(cycles, dump); res = vm->start(cycles, dump);
} catch (std::exception &e) { } catch (std::exception &e) {
LOG(ERR) << "Unhandled Exception reached the top of main: " << e.what() << ", application will now exit" LOG(ERR) << "Unhandled Exception reached the top of main: " << e.what() << ", application will now exit"
<< std::endl; << std::endl;
res = 2; res = 2;
} }
// cleanup to let plugins report of needed // cleanup to let plugins report of needed
for (auto *p : plugin_list) { for (auto *p : plugin_list) {
delete p; delete p;
} }
return res; return res;
} }

View File

@ -30,14 +30,16 @@
* *
*******************************************************************************/ *******************************************************************************/
// clang-format off // clang-format off
#include <iss/debugger/gdb_session.h> #include <iss/debugger/gdb_session.h>
#include <iss/debugger/encoderdecoder.h> #include <iss/debugger/encoderdecoder.h>
#include <iss/debugger/server.h> #include <iss/debugger/server.h>
#include <iss/debugger/target_adapter_if.h> #include <iss/debugger/target_adapter_if.h>
#include <iss/iss.h> #include <iss/iss.h>
#include <iss/vm_types.h> #include <iss/vm_types.h>
#include <iss/plugin/loader.h> #ifndef WIN32
#include <iss/plugin/loader.h>
#endif
#include "core_complex.h" #include "core_complex.h"
#include <iss/arch/tgc_mapper.h> #include <iss/arch/tgc_mapper.h>
#include <scc/report.h> #include <scc/report.h>
@ -49,7 +51,7 @@
#include <iss/plugin/instruction_count.h> #include <iss/plugin/instruction_count.h>
#include <iss/plugin/pctrace.h> #include <iss/plugin/pctrace.h>
// clang-format on // clang-format on
#define STR(X) #X #define STR(X) #X
#define CREATE_CORE(CN) \ #define CREATE_CORE(CN) \
@ -68,12 +70,12 @@ using namespace scv_tr;
#define GET_PROP_VALUE(P) P.getValue() #define GET_PROP_VALUE(P) P.getValue()
#endif #endif
#ifdef _MSC_VER #ifdef _MSC_VER
// not #if defined(_WIN32) || defined(_WIN64) because we have strncasecmp in mingw // not #if defined(_WIN32) || defined(_WIN64) because we have strncasecmp in mingw
#define strncasecmp _strnicmp #define strncasecmp _strnicmp
#define strcasecmp _stricmp #define strcasecmp _stricmp
#endif #endif
namespace sysc { namespace sysc {
namespace tgfs { namespace tgfs {
using namespace std; using namespace std;
@ -296,7 +298,7 @@ public:
CREATE_CORE(tgc_d_xrb_nn) CREATE_CORE(tgc_d_xrb_nn)
#endif #endif
{ {
LOG(ERR) << "Illegal argument value for core type: " << type << std::endl; LOG(ERR) << "Illegal argument value for core type: " << type << std::endl;
} }
auto *srv = debugger::server<debugger::gdb_session>::get(); auto *srv = debugger::server<debugger::gdb_session>::get();
if (srv) tgt_adapter = srv->get_target(); if (srv) tgt_adapter = srv->get_target();
@ -409,6 +411,7 @@ void core_complex::before_end_of_elaboration() {
cpu->vm->register_plugin(*plugin); cpu->vm->register_plugin(*plugin);
plugin_list.push_back(plugin); plugin_list.push_back(plugin);
} else { } else {
#ifndef WIN32
std::array<char const*, 1> a{{filename.c_str()}}; std::array<char const*, 1> a{{filename.c_str()}};
iss::plugin::loader l(plugin_name, {{"initPlugin"}}); iss::plugin::loader l(plugin_name, {{"initPlugin"}});
auto* plugin = l.call_function<iss::vm_plugin*>("initPlugin", a.size(), a.data()); auto* plugin = l.call_function<iss::vm_plugin*>("initPlugin", a.size(), a.data());
@ -416,6 +419,7 @@ void core_complex::before_end_of_elaboration() {
cpu->vm->register_plugin(*plugin); cpu->vm->register_plugin(*plugin);
plugin_list.push_back(plugin); plugin_list.push_back(plugin);
} else } else
#endif
SCCERR(SCMOD) << "Unknown plugin '" << plugin_name << "' or plugin not found"; SCCERR(SCMOD) << "Unknown plugin '" << plugin_name << "' or plugin not found";
} }
} }

View File

@ -30,11 +30,10 @@
* *
*******************************************************************************/ *******************************************************************************/
#include <vm/fp_functions.h>
#include <iss/arch/tgc_c.h>
#include <iss/arch/riscv_hart_m_p.h>
#include <iss/debugger/gdb_session.h> #include <iss/debugger/gdb_session.h>
#include <iss/debugger/server.h> #include <iss/debugger/server.h>
#include <iss/arch/tgc_c.h>
#include <iss/arch/riscv_hart_m_p.h>
#include <iss/iss.h> #include <iss/iss.h>
#include <iss/interp/vm_base.h> #include <iss/interp/vm_base.h>
#include <util/logging.h> #include <util/logging.h>