[xcc] cleaned up mmu code
[riscv-isa-sim.git] / riscv / applink.cc
index d8fddaded421420c9e11b67be094d16b86a4a5e7..e3e979d86cccded8a197312b3b04229b798a2792 100644 (file)
@@ -53,6 +53,16 @@ void appserver_link_t::wait_for_start()
   while(wait_for_packet() != APP_CMD_START);
 }
 
+void appserver_link_t::wait_for_tohost()
+{
+  while(wait_for_packet() != APP_CMD_READ_CONTROL_REG);
+}
+
+void appserver_link_t::wait_for_fromhost()
+{
+  while(wait_for_packet() != APP_CMD_WRITE_CONTROL_REG);
+}
+
 void appserver_link_t::send_packet(packet* p)
 {
   while(1) try
@@ -97,21 +107,26 @@ int appserver_link_t::wait_for_packet()
         break;
       case APP_CMD_STOP:
         send_packet(&ackpacket);
-        exit(0);
+        throw quit_sim();
       case APP_CMD_READ_MEM:
         demand(p.addr % APP_DATA_ALIGN == 0, "misaligned address");
         demand(p.data_size % APP_DATA_ALIGN == 0, "misaligned data");
         demand(p.data_size <= APP_MAX_DATA_SIZE, "long read data");
-        demand(p.addr <= sim->memsz && p.addr+p.data_size <= sim->memsz, "out of bounds");
-        memcpy(ackpacket.data,sim->mem+p.addr,p.data_size);
+        demand(p.addr <= sim->memsz && p.addr+p.data_size <= sim->memsz, "out of bounds: 0x%llx",(unsigned long long)p.addr);
         ackpacket.data_size = p.data_size;
+
+        static_assert(APP_DATA_ALIGN >= sizeof(uint64_t))
+        for(size_t i = 0; i < p.data_size/8; i++)
+          ((uint64_t*)ackpacket.data)[i] = sim->mmu->load_uint64(p.addr+i*8);
         break;
       case APP_CMD_WRITE_MEM:
         demand(p.addr % APP_DATA_ALIGN == 0, "misaligned address");
         demand(p.data_size % APP_DATA_ALIGN == 0, "misaligned data");
         demand(p.data_size <= bytes - offsetof(packet,data), "short packet");
-        demand(p.addr <= sim->memsz && p.addr+p.data_size <= sim->memsz, "out of bounds");
-        memcpy(sim->mem+p.addr,p.data,p.data_size);
+        demand(p.addr <= sim->memsz && p.addr+p.data_size <= sim->memsz, "out of bounds: 0x%llx",(unsigned long long)p.addr);
+
+        for(size_t i = 0; i < p.data_size/8; i++)
+          sim->mmu->store_uint64(p.addr+i*8, ((uint64_t*)p.data)[i]);
         break;
       case APP_CMD_READ_CONTROL_REG:
         demand(p.addr == 16,"bad control reg");