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

Reply via email to