changeset b49763e919c8 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=b49763e919c8
description:
dev: Fix incorrect terminal backlog handling
The Terminal device currently uses the peek functionality in gem5's
circular buffer implementation to send existing buffered content on
the terminal when a new client attaches. This functionallity is
however not implemented correctly and re-sends the same block multiple
time.
Add the required functionality to peek with an offset into the
circular buffer and change the Terminal::accept() implementation to
send the buffered contents.
Signed-off-by: Andreas Sandberg <[email protected]>
Reviewed-by: Radhika Jagtap <[email protected]>
Reviewed-by: Nikos Nikoleris <[email protected]>
diffstat:
src/base/circlebuf.hh | 26 +++++++++++++++++++-------
src/dev/terminal.cc | 2 +-
2 files changed, 20 insertions(+), 8 deletions(-)
diffs (59 lines):
diff -r e41eca4aecbb -r b49763e919c8 src/base/circlebuf.hh
--- a/src/base/circlebuf.hh Tue Apr 26 12:07:51 2016 -0400
+++ b/src/base/circlebuf.hh Wed Apr 27 15:33:58 2016 +0100
@@ -103,24 +103,36 @@
*/
template <class OutputIterator>
void peek(OutputIterator out, size_t len) const {
- panic_if(len > size(),
+ peek(out, 0, len);
+ }
+
+ /**
+ * Copy buffer contents without advancing the read pointer
+ *
+ * @param out Output iterator/pointer
+ * @param offset Offset into the ring buffer
+ * @param len Number of elements to copy
+ */
+ template <class OutputIterator>
+ void peek(OutputIterator out, off_t offset, size_t len) const {
+ panic_if(offset + len > size(),
"Trying to read past end of circular buffer.\n");
- if (_start + len <= buf.size()) {
- std::copy(buf.begin() + _start,
- buf.begin() + _start + len,
+ const off_t real_start((offset + _start) % buf.size());
+ if (real_start + len <= buf.size()) {
+ std::copy(buf.begin() + real_start,
+ buf.begin() + real_start + len,
out);
} else {
- const size_t head_size(buf.size() - _start);
+ const size_t head_size(buf.size() - real_start);
const size_t tail_size(len - head_size);
- std::copy(buf.begin() + _start, buf.end(),
+ std::copy(buf.begin() + real_start, buf.end(),
out);
std::copy(buf.begin(), buf.begin() + tail_size,
out + head_size);
}
}
-
/**
* Copy buffer contents and advance the read pointer
*
diff -r e41eca4aecbb -r b49763e919c8 src/dev/terminal.cc
--- a/src/dev/terminal.cc Tue Apr 26 12:07:51 2016 -0400
+++ b/src/dev/terminal.cc Wed Apr 27 15:33:58 2016 +0100
@@ -204,7 +204,7 @@
char buf[1024];
for (size_t i = 0; i < txbuf.size(); i += sizeof(buf)) {
const size_t chunk_len(std::min(txbuf.size() - i, sizeof(buf)));
- txbuf.peek(buf, chunk_len);
+ txbuf.peek(buf, i, chunk_len);
write((const uint8_t *)buf, chunk_len);
}
}
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev