#include "htif.h"
#include "sim.h"
+#include "mmu.h"
#include "encoding.h"
#include <unistd.h>
#include <stdexcept>
send(&ack, sizeof(ack));
uint64_t buf[hdr.data_size];
- for (size_t i = 0; i < hdr.data_size; i++)
- buf[i] = sim->debug_mmu->load_uint64((hdr.addr+i)*HTIF_DATA_ALIGN);
+ for (size_t i = 0; i < hdr.data_size; i++) {
+ reg_t addr = (hdr.addr + i) * HTIF_DATA_ALIGN;
+ try {
+ buf[i] = sim->debug_mmu->load_uint64(addr);
+ } catch (trap_load_access_fault& e) {
+ fprintf(stderr, "HTIF: attempt to read from illegal address 0x%" PRIx64 "\n", addr);
+ exit(-1);
+ }
+ }
send(buf, hdr.data_size * sizeof(buf[0]));
break;
}
case HTIF_CMD_WRITE_MEM:
{
const uint64_t* buf = (const uint64_t*)p.get_payload();
- for (size_t i = 0; i < hdr.data_size; i++)
- sim->debug_mmu->store_uint64((hdr.addr+i)*HTIF_DATA_ALIGN, buf[i]);
-
+ for (size_t i = 0; i < hdr.data_size; i++) {
+ reg_t addr = (hdr.addr + i) * HTIF_DATA_ALIGN;
+ try {
+ sim->debug_mmu->store_uint64(addr, buf[i]);
+ } catch (trap_load_access_fault& e) {
+ fprintf(stderr, "HTIF: attempt to write to illegal address 0x%" PRIx64 "\n", addr);
+ exit(-1);
+ }
+ }
packet_header_t ack(HTIF_CMD_ACK, seqno, 0, 0);
send(&ack, sizeof(ack));
break;