Compare commits
2 Commits
23842742a6
...
502f3e8df9
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