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) {