Commit 0db2a90d authored by Antoine Kaufmann's avatar Antoine Kaufmann
Browse files

corundum: fix large memory reads and writes

parent 41afddff
...@@ -61,7 +61,7 @@ void MemWriter::step() ...@@ -61,7 +61,7 @@ void MemWriter::step()
data_byte_width - data_offset : cur->len - cur_off); data_byte_width - data_offset : cur->len - cur_off);
for (size_t i = 0; i < cur_len; i++, off++) { for (size_t i = 0; i < cur_len; i++, off++) {
size_t byte_off = off % 4; size_t byte_off = off % 4;
p.mem_data[off / 4] |= (((uint32_t) cur->data[i]) << (byte_off * 8)); p.mem_data[off / 4] |= (((uint32_t) cur->data[cur_off + i]) << (byte_off * 8));
p.mem_be[off / 32] |= (1 << (off % 32)); p.mem_be[off / 32] |= (1 << (off % 32));
p.mem_valid |= (1 << (off / (SEG_WIDTH / 8))); p.mem_valid |= (1 << (off / (SEG_WIDTH / 8)));
} }
...@@ -109,11 +109,15 @@ void MemReader::step() ...@@ -109,11 +109,15 @@ void MemReader::step()
for (size_t i = 0; i < 32; i++) for (size_t i = 0; i < 32; i++)
std::cerr << " val = " << p.mem_data[i] << std::endl; std::cerr << " val = " << p.mem_data[i] << std::endl;
#endif #endif
size_t off = cur->ram_addr % data_byte_width;
for (size_t i = 0; i < cur->len; i++, off++) { size_t off = (cur->ram_addr + cur_off) % data_byte_width;
size_t cur_len = (cur->len - cur_off > data_byte_width - off ?
data_byte_width - off : cur->len - cur_off);
for (size_t i = 0; i < cur_len; i++, off++) {
size_t byte_off = (off % 4); size_t byte_off = (off % 4);
cur->data[i] = (p.mem_data[off / 4] >> (byte_off * 8)) & 0xff; cur->data[cur_off + i] = (p.mem_data[off / 4] >> (byte_off * 8)) & 0xff;
} }
cur_off += cur_len;
if (cur_off == cur->len) { if (cur_off == cur->len) {
/* operation is done */ /* operation is done */
...@@ -145,7 +149,6 @@ void MemReader::step() ...@@ -145,7 +149,6 @@ void MemReader::step()
size_t cur_len = (cur->len - cur_off > data_byte_width - data_offset ? size_t cur_len = (cur->len - cur_off > data_byte_width - data_offset ?
data_byte_width - data_offset : cur->len - cur_off); data_byte_width - data_offset : cur->len - cur_off);
for (size_t i = 0; i < cur_len; i++, off++) { for (size_t i = 0; i < cur_len; i++, off++) {
size_t byte_off = off % 4;
p.mem_valid |= (1 << (off / (SEG_WIDTH / 8))); p.mem_valid |= (1 << (off / (SEG_WIDTH / 8)));
} }
//p.mem_resready = p.mem_valid; //p.mem_resready = p.mem_valid;
...@@ -170,7 +173,6 @@ void MemReader::step() ...@@ -170,7 +173,6 @@ void MemReader::step()
std::cerr << " mem_valid = " << (unsigned) p.mem_valid << std::endl; std::cerr << " mem_valid = " << (unsigned) p.mem_valid << std::endl;
#endif #endif
cur_off += cur_len;
} }
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment