16 APP_CMD_READ_CONTROL_REG
,
17 APP_CMD_WRITE_CONTROL_REG
,
22 #define APP_MAX_DATA_SIZE 1024U
23 #define HTIF_DATA_ALIGN 8U
31 uint64_t data
[APP_MAX_DATA_SIZE
/8];
34 htif_t::htif_t(int _tohost_fd
, int _fromhost_fd
)
35 : sim(NULL
), tohost_fd(_tohost_fd
), fromhost_fd(_fromhost_fd
),
46 void htif_t::init(sim_t
* _sim
)
51 void htif_t::wait_for_start()
57 void htif_t::send_packet(packet
* p
)
59 size_t data_size
= p
->data_size
*HTIF_DATA_ALIGN
;
60 size_t bytes
= write(tohost_fd
, p
, offsetof(packet
,data
) + data_size
);
61 if(bytes
!= offsetof(packet
,data
) + data_size
)
63 const char* error
= (ssize_t
)bytes
== -1 ? strerror(errno
) : "not all bytes sent";
64 fprintf(stderr
,"HTIF error: %s\n", error
);
69 void htif_t::nack(uint8_t nack_seqno
)
71 packet p
= {APP_CMD_NACK
,0,nack_seqno
,0};
75 int htif_t::wait_for_packet()
80 ssize_t bytes
= read(fromhost_fd
,&p
,sizeof(p
));
81 if(bytes
< (ssize_t
)offsetof(packet
,data
))
83 const char* error
= bytes
== -1 ? strerror(errno
) : "too few bytes read";
84 fprintf(stderr
,"HTIF error: %s\n", error
);
94 packet ackpacket
= {APP_CMD_ACK
,0,seqno
,0};
95 reg_t pcr_coreid
= p
.addr
>> 20;
96 reg_t pcr_reg
= p
.addr
& ((1<<20)-1);
100 case APP_CMD_READ_MEM
:
101 assert(p
.data_size
<= APP_MAX_DATA_SIZE
/HTIF_DATA_ALIGN
);
102 assert(p
.addr
< sim
->memsz
/HTIF_DATA_ALIGN
);
103 assert(p
.addr
+p
.data_size
<= sim
->memsz
/HTIF_DATA_ALIGN
);
104 ackpacket
.data_size
= p
.data_size
;
106 assert(HTIF_DATA_ALIGN
== sizeof(uint64_t));
107 for(size_t i
= 0; i
< p
.data_size
; i
++)
108 ackpacket
.data
[i
] = sim
->mmu
->load_uint64((p
.addr
+i
)*HTIF_DATA_ALIGN
);
110 case APP_CMD_WRITE_MEM
:
111 assert(p
.data_size
*HTIF_DATA_ALIGN
<= bytes
- offsetof(packet
,data
));
112 assert(p
.addr
< sim
->memsz
/HTIF_DATA_ALIGN
);
113 assert(p
.addr
+p
.data_size
<= sim
->memsz
/HTIF_DATA_ALIGN
);
115 for(size_t i
= 0; i
< p
.data_size
; i
++)
116 sim
->mmu
->store_uint64((p
.addr
+i
)*HTIF_DATA_ALIGN
, p
.data
[i
]);
118 case APP_CMD_READ_CONTROL_REG
:
120 assert(pcr_coreid
< sim
->num_cores());
121 assert(p
.data_size
== 1);
122 ackpacket
.data_size
= 1;
123 reg_t pcr
= sim
->procs
[pcr_coreid
]->get_pcr(pcr_reg
);
124 memcpy(ackpacket
.data
, &pcr
, sizeof(pcr
));
127 case APP_CMD_WRITE_CONTROL_REG
:
128 assert(pcr_coreid
< sim
->num_cores());
129 assert(p
.data_size
== 1);
130 if (pcr_reg
== PCR_RESET
)
132 reset
= p
.data
[0] & 1;
133 sim
->procs
[pcr_coreid
]->reset(reset
);
138 memcpy(&pcr
, p
.data
, sizeof(pcr
));
139 sim
->procs
[pcr_coreid
]->set_pcr(pcr_reg
, pcr
);
144 send_packet(&ackpacket
);