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
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");