diff --git a/src/iss/arch/riscv_hart_common.h b/src/iss/arch/riscv_hart_common.h index e445e62..40ec5d5 100644 --- a/src/iss/arch/riscv_hart_common.h +++ b/src/iss/arch/riscv_hart_common.h @@ -394,11 +394,16 @@ template struct riscv_hart_co csr_wr_cb[minstreth] = MK_CSR_WR_CB(write_instret); csr_rd_cb[mhartid] = MK_CSR_RD_CB(read_hartid); }; - ~riscv_hart_common() {}; + ~riscv_hart_common() { + if(io_buf.str().length()) { + CPPLOG(INFO) << "tohost send '" << io_buf.str() << "'"; + } + } std::unordered_map symbol_table; uint64_t entry_address{0}; uint64_t tohost = std::numeric_limits::max(); uint64_t fromhost = std::numeric_limits::max(); + std::stringstream io_buf; void set_semihosting_callback(semihosting_cb_t cb) { semihosting_cb = cb; }; @@ -465,7 +470,6 @@ template struct riscv_hart_co }; iss::status execute_sys_write(arch_if* aif, const std::array& loaded_payload, unsigned mem_type) { - std::stringstream io_buf; uint64_t fd = loaded_payload[1]; uint64_t buf_ptr = loaded_payload[2]; uint64_t len = loaded_payload[3]; @@ -476,15 +480,13 @@ template struct riscv_hart_co } // we disregard the fd and just log to stdout for(size_t i = 0; i < len; i++) { - if(buf[i] == '\n') { + if(buf[i] == '\n' || buf[i] == '\0') { CPPLOG(INFO) << "tohost send '" << io_buf.str() << "'"; io_buf.str(""); } else io_buf << buf[i]; } - if(io_buf.str().length()) { - CPPLOG(INFO) << "tohost send '" << io_buf.str() << "'"; - } + // Not sure what the correct return value should be uint8_t ret_val = 1; if(fromhost != std::numeric_limits::max())