From d41e1d816a176fadfeb757b197ae0d5efeed9389 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 16 May 2021 16:44:14 +0200 Subject: [PATCH] add factory for ISS and use it in main.cpp --- incl/iss/factory.h | 62 +++++++++++++++++++++++++++++++++++++++ src/sysc/core_complex.cpp | 16 ++++------ 2 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 incl/iss/factory.h diff --git a/incl/iss/factory.h b/incl/iss/factory.h new file mode 100644 index 0000000..266ff31 --- /dev/null +++ b/incl/iss/factory.h @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (C) 2021 MINRES Technologies GmbH + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 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 + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * 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 + * POSSIBILITY OF SUCH DAMAGE. + * + *******************************************************************************/ + +#ifndef _ISS_FACTORY_H_ +#define _ISS_FACTORY_H_ + +#include + +namespace iss { + +using cpu_ptr = std::unique_ptr; +using vm_ptr= std::unique_ptr; + +template +std::tuple create_cpu(std::string const& backend, unsigned gdb_port){ + using core_type = typename PLAT::super; + core_type* lcpu = new PLAT(); + if(backend == "interp") + return {cpu_ptr{lcpu}, vm_ptr{iss::interp::create(lcpu, gdb_port)}}; +#ifdef WITH_LLVM + if(backend == "llvm") + return {cpu_ptr{lcpu}, vm_ptr{iss::llvm::create(lcpu, gdb_port)}}; +#endif +#ifdef WITH_LLVM + if(backend == "tcc") + return {cpu_ptr{lcpu}, vm_ptr{iss::tcc::create(lcpu, gdb_port)}}; +#endif + return {nullptr, nullptr}; +} + +} + +#endif /* _ISS_FACTORY_H_ */ diff --git a/src/sysc/core_complex.cpp b/src/sysc/core_complex.cpp index 03a0733..c2bea42 100644 --- a/src/sysc/core_complex.cpp +++ b/src/sysc/core_complex.cpp @@ -58,7 +58,7 @@ using tgc_d_plat_type = iss::arch::riscv_hart_mu_p; #define STR(X) #X #define CREATE_CORE(CN) \ -else if (type == STR(CN)) { std::tie(cpu, vm) = create_core(backend, gdb_port, hart_id); } +if (type == STR(CN)) { std::tie(cpu, vm) = create_core(backend, gdb_port, hart_id); } else #ifdef WITH_SCV #include @@ -261,19 +261,14 @@ public: } void create_cpu(std::string const& type, std::string const& backend, unsigned gdb_port, uint32_t hart_id){ - if (type == "") { - LOG(ERROR) << "Illegal argument value for core type: " << type << std::endl; - } + CREATE_CORE(tgc_c) #ifdef CORE_TGC_B - CREATE_CORE(tgc_c) -#endif -#ifdef CORE_TGC_C - CREATE_CORE(tgc_c) + CREATE_CORE(tgc_c) #endif #ifdef CORE_TGC_D - CREATE_CORE(tgc_d) + CREATE_CORE(tgc_d) #endif - else { + { LOG(ERROR) << "Illegal argument value for core type: " << type << std::endl; } auto *srv = debugger::server::get(); @@ -286,7 +281,6 @@ public: } - core_complex * const owner; vm_ptr vm{nullptr}; cpu_ptr cpu{nullptr};