Compare commits
	
		
			1 Commits
		
	
	
		
			9f5326c110
			...
			feature/ht
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| aaebeaf023 | 
| @@ -314,11 +314,16 @@ inline void write_reg_uint32(uint64_t offs, uint32_t& reg, const uint8_t* const | |||||||
| } | } | ||||||
| struct riscv_hart_common { | struct riscv_hart_common { | ||||||
|     riscv_hart_common(){}; |     riscv_hart_common(){}; | ||||||
|     ~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; | ||||||
|  |  | ||||||
|     bool read_elf_file(std::string name, uint8_t expected_elf_class, |     bool read_elf_file(std::string name, uint8_t expected_elf_class, | ||||||
|                        std::function<iss::status(uint64_t, uint64_t, const uint8_t* const)> cb) { |                        std::function<iss::status(uint64_t, uint64_t, const uint8_t* const)> cb) { | ||||||
| @@ -378,7 +383,6 @@ struct riscv_hart_common { | |||||||
|         return false; |         return false; | ||||||
|     }; |     }; | ||||||
|     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]; | ||||||
| @@ -389,15 +393,13 @@ struct riscv_hart_common { | |||||||
|         } |         } | ||||||
|         // 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()) | ||||||
|   | |||||||
| @@ -1072,11 +1072,9 @@ iss::status riscv_hart_m_p<BASE, FEAT, LOGCAT>::write_mem(phys_addr_t paddr, uns | |||||||
|         if(paddr.val == tohost) { |         if(paddr.val == tohost) { | ||||||
|             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*>(p.data() + ((tohost + 4) & mem.page_addr_mask)) >> 24 |             uint8_t device = traits<BASE>::XLEN == 32 ? 0 : (cur_data >> 56) & 0xFF; | ||||||
|                                                       : (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*>(p.data() + ((tohost + 4) & mem.page_addr_mask)) >> 16 |             uint8_t command = traits<BASE>::XLEN == 32 ? 0 : (cur_data >> 48) & 0xFF; | ||||||
|                                                        : (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) { | ||||||
|   | |||||||
| @@ -1001,11 +1001,9 @@ template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_mem(phys_add | |||||||
|         if(paddr.val == tohost) { |         if(paddr.val == tohost) { | ||||||
|             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*>(p.data() + ((tohost + 4) & mem.page_addr_mask)) >> 24 |             uint8_t device = traits<BASE>::XLEN == 32 ? 0 : (cur_data >> 56) & 0xFF; | ||||||
|                                                       : (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*>(p.data() + ((tohost + 4) & mem.page_addr_mask)) >> 16 |             uint8_t command = traits<BASE>::XLEN == 32 ? 0 : (cur_data >> 48) & 0xFF; | ||||||
|                                                        : (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) { | ||||||
|   | |||||||
| @@ -1293,11 +1293,9 @@ iss::status riscv_hart_mu_p<BASE, FEAT, LOGCAT>::write_mem(phys_addr_t paddr, un | |||||||
|         if(paddr.val == tohost) { |         if(paddr.val == tohost) { | ||||||
|             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*>(p.data() + ((tohost + 4) & mem.page_addr_mask)) >> 24 |             uint8_t device = traits<BASE>::XLEN == 32 ? 0 : (cur_data >> 56) & 0xFF; | ||||||
|                                                       : (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*>(p.data() + ((tohost + 4) & mem.page_addr_mask)) >> 16 |             uint8_t command = traits<BASE>::XLEN == 32 ? 0 : (cur_data >> 48) & 0xFF; | ||||||
|                                                        : (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) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user