small fixes for robustness and readability
This commit is contained in:
parent
51fbc34fb3
commit
b0bcb7febb
|
@ -272,6 +272,9 @@ vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool is_count_limit_enabled(finish_cond_e cond){
|
||||||
|
return (cond & finish_cond_e::COUNT_LIMIT) == finish_cond_e::COUNT_LIMIT;
|
||||||
|
}
|
||||||
template <typename ARCH>
|
template <typename ARCH>
|
||||||
typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e cond, virt_addr_t start, uint64_t icount_limit){
|
typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e cond, virt_addr_t start, uint64_t icount_limit){
|
||||||
// we fetch at max 4 byte, alignment is 2
|
// we fetch at max 4 byte, alignment is 2
|
||||||
|
@ -279,8 +282,8 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
|
||||||
code_word_t insn = 0;
|
code_word_t insn = 0;
|
||||||
auto *const data = (uint8_t *)&insn;
|
auto *const data = (uint8_t *)&insn;
|
||||||
auto pc=start;
|
auto pc=start;
|
||||||
while(!core.should_stop() &&
|
while(!this->core.should_stop() &&
|
||||||
!((cond & finish_cond_e::COUNT_LIMIT) && core.get_icount() < icount)){
|
!(is_count_limit_enabled(cond) && this->core.get_icount() >= icount_limit)){
|
||||||
auto res = fetch_ins(pc, data);
|
auto res = fetch_ins(pc, data);
|
||||||
if(res!=iss::Ok){
|
if(res!=iss::Ok){
|
||||||
auto new_pc = super::core.enter_trap(TRAP_ID, pc.val);
|
auto new_pc = super::core.enter_trap(TRAP_ID, pc.val);
|
||||||
|
|
|
@ -97,7 +97,7 @@ public:
|
||||||
|
|
||||||
cci::cci_param<uint64_t> reset_address{"reset_address", 0ULL};
|
cci::cci_param<uint64_t> reset_address{"reset_address", 0ULL};
|
||||||
|
|
||||||
cci::cci_param<std::string> backend{"backend", "tcc"};
|
cci::cci_param<std::string> backend{"backend", "interp"};
|
||||||
|
|
||||||
cci::cci_param<unsigned short> gdb_server_port{"gdb_server_port", 0};
|
cci::cci_param<unsigned short> gdb_server_port{"gdb_server_port", 0};
|
||||||
|
|
||||||
|
|
|
@ -290,6 +290,7 @@ void core_complex::before_end_of_elaboration() {
|
||||||
cpu->set_mhartid(mhartid.get_value());
|
cpu->set_mhartid(mhartid.get_value());
|
||||||
|
|
||||||
vm = create_cpu(cpu.get(), backend.get_value(), gdb_server_port.get_value());
|
vm = create_cpu(cpu.get(), backend.get_value(), gdb_server_port.get_value());
|
||||||
|
sc_assert(vm!=nullptr);
|
||||||
#ifdef WITH_SCV
|
#ifdef WITH_SCV
|
||||||
vm->setDisassEnabled(enable_disass.get_value() || m_db != nullptr);
|
vm->setDisassEnabled(enable_disass.get_value() || m_db != nullptr);
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -3435,6 +3435,9 @@ vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool is_count_limit_enabled(finish_cond_e cond){
|
||||||
|
return (cond & finish_cond_e::COUNT_LIMIT) == finish_cond_e::COUNT_LIMIT;
|
||||||
|
}
|
||||||
template <typename ARCH>
|
template <typename ARCH>
|
||||||
typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e cond, virt_addr_t start, uint64_t icount_limit){
|
typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e cond, virt_addr_t start, uint64_t icount_limit){
|
||||||
// we fetch at max 4 byte, alignment is 2
|
// we fetch at max 4 byte, alignment is 2
|
||||||
|
@ -3443,8 +3446,7 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
|
||||||
auto *const data = (uint8_t *)&insn;
|
auto *const data = (uint8_t *)&insn;
|
||||||
auto pc=start;
|
auto pc=start;
|
||||||
while(!this->core.should_stop() &&
|
while(!this->core.should_stop() &&
|
||||||
!((cond & finish_cond_e::COUNT_LIMIT) == finish_cond_e::COUNT_LIMIT &&
|
!(is_count_limit_enabled(cond) && this->core.get_icount() >= icount_limit)){
|
||||||
this->core.get_icount() < icount_limit)){
|
|
||||||
auto res = fetch_ins(pc, data);
|
auto res = fetch_ins(pc, data);
|
||||||
if(res!=iss::Ok){
|
if(res!=iss::Ok){
|
||||||
auto new_pc = super::core.enter_trap(TRAP_ID, pc.val);
|
auto new_pc = super::core.enter_trap(TRAP_ID, pc.val);
|
||||||
|
|
Loading…
Reference in New Issue