Compare commits
	
		
			2 Commits
		
	
	
		
			23842742a6
			...
			feature/pr
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 502f3e8df9 | |||
| 88475bfa55 | 
| @@ -394,11 +394,16 @@ template <typename BASE, typename LOGCAT = logging::disass> struct riscv_hart_co | |||||||
|             csr_wr_cb[minstreth] = MK_CSR_WR_CB(write_instret); |             csr_wr_cb[minstreth] = MK_CSR_WR_CB(write_instret); | ||||||
|         csr_rd_cb[mhartid] = MK_CSR_RD_CB(read_hartid); |         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<std::string, uint64_t> symbol_table; |     std::unordered_map<std::string, uint64_t> symbol_table; | ||||||
|     uint64_t entry_address{0}; |     uint64_t entry_address{0}; | ||||||
|     uint64_t tohost = std::numeric_limits<uint64_t>::max(); |     uint64_t tohost = std::numeric_limits<uint64_t>::max(); | ||||||
|     uint64_t fromhost = std::numeric_limits<uint64_t>::max(); |     uint64_t fromhost = std::numeric_limits<uint64_t>::max(); | ||||||
|  |     std::stringstream io_buf; | ||||||
|  |  | ||||||
|     void set_semihosting_callback(semihosting_cb_t<reg_t> cb) { semihosting_cb = cb; }; |     void set_semihosting_callback(semihosting_cb_t<reg_t> cb) { semihosting_cb = cb; }; | ||||||
|  |  | ||||||
| @@ -465,7 +470,6 @@ template <typename BASE, typename LOGCAT = logging::disass> struct riscv_hart_co | |||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     iss::status execute_sys_write(arch_if* aif, const std::array<uint64_t, 8>& loaded_payload, unsigned mem_type) { |     iss::status execute_sys_write(arch_if* aif, const std::array<uint64_t, 8>& loaded_payload, unsigned mem_type) { | ||||||
|         std::stringstream io_buf; |  | ||||||
|         uint64_t fd = loaded_payload[1]; |         uint64_t fd = loaded_payload[1]; | ||||||
|         uint64_t buf_ptr = loaded_payload[2]; |         uint64_t buf_ptr = loaded_payload[2]; | ||||||
|         uint64_t len = loaded_payload[3]; |         uint64_t len = loaded_payload[3]; | ||||||
| @@ -476,15 +480,13 @@ template <typename BASE, typename LOGCAT = logging::disass> struct riscv_hart_co | |||||||
|         } |         } | ||||||
|         // we disregard the fd and just log to stdout |         // we disregard the fd and just log to stdout | ||||||
|         for(size_t i = 0; i < len; i++) { |         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() << "'"; |                 CPPLOG(INFO) << "tohost send '" << io_buf.str() << "'"; | ||||||
|                 io_buf.str(""); |                 io_buf.str(""); | ||||||
|             } else |             } else | ||||||
|                 io_buf << buf[i]; |                 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 |         // Not sure what the correct return value should be | ||||||
|         uint8_t ret_val = 1; |         uint8_t ret_val = 1; | ||||||
|         if(fromhost != std::numeric_limits<uint64_t>::max()) |         if(fromhost != std::numeric_limits<uint64_t>::max()) | ||||||
| @@ -726,9 +728,9 @@ template <typename BASE, typename LOGCAT = logging::disass> struct riscv_hart_co | |||||||
|     iss::status execute_htif(uint8_t const* data) { |     iss::status execute_htif(uint8_t const* data) { | ||||||
|         reg_t cur_data = *reinterpret_cast<const reg_t*>(data); |         reg_t cur_data = *reinterpret_cast<const reg_t*>(data); | ||||||
|         // Extract Device (bits 63:56) |         // Extract Device (bits 63:56) | ||||||
|         uint8_t device = traits<BASE>::XLEN == 32 ? *reinterpret_cast<uint32_t const*>(data) >> 24 : (cur_data >> 56) & 0xFF; |         uint8_t device = traits<BASE>::XLEN == 32 ? 0 : (cur_data >> 56) & 0xFF; | ||||||
|         // Extract Command (bits 55:48) |         // Extract Command (bits 55:48) | ||||||
|         uint8_t command = traits<BASE>::XLEN == 32 ? *reinterpret_cast<uint32_t const*>(data) >> 16 : (cur_data >> 48) & 0xFF; |         uint8_t command = traits<BASE>::XLEN == 32 ? 0 : (cur_data >> 48) & 0xFF; | ||||||
|         // Extract payload (bits 47:0) |         // Extract payload (bits 47:0) | ||||||
|         uint64_t payload_addr = cur_data & 0xFFFFFFFFFFFFULL; |         uint64_t payload_addr = cur_data & 0xFFFFFFFFFFFFULL; | ||||||
|         if(payload_addr & 1) { |         if(payload_addr & 1) { | ||||||
| @@ -826,6 +828,8 @@ protected: | |||||||
|     friend struct riscv_instrumentation_if; |     friend struct riscv_instrumentation_if; | ||||||
|     riscv_instrumentation_if instr_if; |     riscv_instrumentation_if instr_if; | ||||||
|  |  | ||||||
|  |     instrumentation_if* get_instrumentation_if() override { return &instr_if; }; | ||||||
|  |  | ||||||
|     using csr_type = util::sparse_array<typename traits<BASE>::reg_t, 1ULL << 12, 12>; |     using csr_type = util::sparse_array<typename traits<BASE>::reg_t, 1ULL << 12, 12>; | ||||||
|     using csr_page_type = typename csr_type::page_type; |     using csr_page_type = typename csr_type::page_type; | ||||||
|     csr_type csr; |     csr_type csr; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user