11 APP_CMD_READ_CONTROL_REG
,
12 APP_CMD_WRITE_CONTROL_REG
,
19 #define APP_DATA_ALIGN 8
20 #define APP_MAX_DATA_SIZE 1024
27 uint8_t data
[APP_MAX_DATA_SIZE
];
30 class packet_error
: public std::runtime_error
33 packet_error(const std::string
& s
) : std::runtime_error(s
) {}
35 class io_error
: public packet_error
38 io_error(const std::string
& s
) : packet_error(s
) {}
41 appserver_link_t::appserver_link_t(int _tohost_fd
, int _fromhost_fd
)
42 : sim(NULL
), tohost_fd(_tohost_fd
), fromhost_fd(_fromhost_fd
), seqno(1)
46 void appserver_link_t::init(sim_t
* _sim
)
51 void appserver_link_t::wait_for_start()
53 while(wait_for_packet() != APP_CMD_START
);
56 void appserver_link_t::wait_for_tohost()
58 while(wait_for_packet() != APP_CMD_READ_CONTROL_REG
);
61 void appserver_link_t::wait_for_fromhost()
63 while(wait_for_packet() != APP_CMD_WRITE_CONTROL_REG
);
66 void appserver_link_t::send_packet(packet
* p
)
70 int bytes
= write(tohost_fd
,p
,offsetof(packet
,data
)+p
->data_size
);
71 if(bytes
== -1 || (size_t)bytes
!= offsetof(packet
,data
)+p
->data_size
)
72 throw io_error("write failed");
77 fprintf(stderr
,"warning: %s\n",e
.what());
81 void appserver_link_t::nack(uint16_t nack_seqno
)
83 packet p
= {APP_CMD_NACK
,nack_seqno
,0,0};
87 int appserver_link_t::wait_for_packet()
92 int bytes
= read(fromhost_fd
,&p
,sizeof(p
));
93 if(bytes
< (signed)offsetof(packet
,data
))
94 throw io_error("read failed");
102 packet ackpacket
= {APP_CMD_ACK
,seqno
,0,0};
109 send_packet(&ackpacket
);
111 case APP_CMD_READ_MEM
:
112 demand(p
.addr
% APP_DATA_ALIGN
== 0, "misaligned address");
113 demand(p
.data_size
% APP_DATA_ALIGN
== 0, "misaligned data");
114 demand(p
.data_size
<= APP_MAX_DATA_SIZE
, "long read data");
115 demand(p
.addr
<= sim
->memsz
&& p
.addr
+p
.data_size
<= sim
->memsz
, "out of bounds");
116 memcpy(ackpacket
.data
,sim
->mem
+p
.addr
,p
.data_size
);
117 ackpacket
.data_size
= p
.data_size
;
119 case APP_CMD_WRITE_MEM
:
120 demand(p
.addr
% APP_DATA_ALIGN
== 0, "misaligned address");
121 demand(p
.data_size
% APP_DATA_ALIGN
== 0, "misaligned data");
122 demand(p
.data_size
<= bytes
- offsetof(packet
,data
), "short packet");
123 demand(p
.addr
<= sim
->memsz
&& p
.addr
+p
.data_size
<= sim
->memsz
, "out of bounds");
124 memcpy(sim
->mem
+p
.addr
,p
.data
,p
.data_size
);
126 case APP_CMD_READ_CONTROL_REG
:
127 demand(p
.addr
== 16,"bad control reg");
128 demand(p
.data_size
== sizeof(reg_t
),"bad control reg size");
129 ackpacket
.data_size
= sizeof(reg_t
);
130 memcpy(ackpacket
.data
,&sim
->tohost
,sizeof(reg_t
));
132 case APP_CMD_WRITE_CONTROL_REG
:
133 demand(p
.addr
== 17,"bad control reg");
134 demand(p
.data_size
== sizeof(reg_t
),"bad control reg size");
136 memcpy(&sim
->fromhost
,p
.data
,sizeof(reg_t
));
140 send_packet(&ackpacket
);
146 fprintf(stderr
,"warning: %s\n",e
.what());