diff --git a/src/iss/arch/riscv_hart_m_p.h b/src/iss/arch/riscv_hart_m_p.h index 7476c7c..8d13bf5 100644 --- a/src/iss/arch/riscv_hart_m_p.h +++ b/src/iss/arch/riscv_hart_m_p.h @@ -1072,9 +1072,11 @@ iss::status riscv_hart_m_p::write_mem(phys_addr_t paddr, uns if(paddr.val == tohost) { reg_t cur_data = *reinterpret_cast(data); // Extract Device (bits 63:56) - uint8_t device = traits::XLEN == 32 ? 0 : (cur_data >> 56) & 0xFF; + uint8_t device = traits::XLEN == 32 ? *reinterpret_cast(p.data() + ((tohost + 4) & mem.page_addr_mask)) >> 24 + : (cur_data >> 56) & 0xFF; // Extract Command (bits 55:48) - uint8_t command = traits::XLEN == 32 ? 0 : (cur_data >> 48) & 0xFF; + uint8_t command = traits::XLEN == 32 ? *reinterpret_cast(p.data() + ((tohost + 4) & mem.page_addr_mask)) >> 16 + : (cur_data >> 48) & 0xFF; // Extract payload (bits 47:0) uint64_t payload_addr = cur_data & 0xFFFFFFFFFFFFULL; if(payload_addr & 1) { diff --git a/src/iss/arch/riscv_hart_msu_vp.h b/src/iss/arch/riscv_hart_msu_vp.h index a6b23ac..302f8ce 100644 --- a/src/iss/arch/riscv_hart_msu_vp.h +++ b/src/iss/arch/riscv_hart_msu_vp.h @@ -1001,9 +1001,11 @@ template iss::status riscv_hart_msu_vp::write_mem(phys_add if(paddr.val == tohost) { reg_t cur_data = *reinterpret_cast(data); // Extract Device (bits 63:56) - uint8_t device = traits::XLEN == 32 ? 0 : (cur_data >> 56) & 0xFF; + uint8_t device = traits::XLEN == 32 ? *reinterpret_cast(p.data() + ((tohost + 4) & mem.page_addr_mask)) >> 24 + : (cur_data >> 56) & 0xFF; // Extract Command (bits 55:48) - uint8_t command = traits::XLEN == 32 ? 0 : (cur_data >> 48) & 0xFF; + uint8_t command = traits::XLEN == 32 ? *reinterpret_cast(p.data() + ((tohost + 4) & mem.page_addr_mask)) >> 16 + : (cur_data >> 48) & 0xFF; // Extract payload (bits 47:0) uint64_t payload_addr = cur_data & 0xFFFFFFFFFFFFULL; if(payload_addr & 1) { diff --git a/src/iss/arch/riscv_hart_mu_p.h b/src/iss/arch/riscv_hart_mu_p.h index 4eece12..644750d 100644 --- a/src/iss/arch/riscv_hart_mu_p.h +++ b/src/iss/arch/riscv_hart_mu_p.h @@ -1293,9 +1293,11 @@ iss::status riscv_hart_mu_p::write_mem(phys_addr_t paddr, un if(paddr.val == tohost) { reg_t cur_data = *reinterpret_cast(data); // Extract Device (bits 63:56) - uint8_t device = traits::XLEN == 32 ? 0 : (cur_data >> 56) & 0xFF; + uint8_t device = traits::XLEN == 32 ? *reinterpret_cast(p.data() + ((tohost + 4) & mem.page_addr_mask)) >> 24 + : (cur_data >> 56) & 0xFF; // Extract Command (bits 55:48) - uint8_t command = traits::XLEN == 32 ? 0 : (cur_data >> 48) & 0xFF; + uint8_t command = traits::XLEN == 32 ? *reinterpret_cast(p.data() + ((tohost + 4) & mem.page_addr_mask)) >> 16 + : (cur_data >> 48) & 0xFF; // Extract payload (bits 47:0) uint64_t payload_addr = cur_data & 0xFFFFFFFFFFFFULL; if(payload_addr & 1) {