qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Finn Thain <fthain@telegraphics.com.au>
To: Jason Wang <jasowang@redhat.com>, qemu-devel@nongnu.org
Cc: Aleksandar Rikalo <aleksandar.rikalo@rt-rk.com>,
	Herve Poussineau <hpoussin@reactos.org>,
	Laurent Vivier <laurent@vivier.eu>,
	qemu-stable@nongnu.org
Subject: [PATCH 07/10] dp8393x: Implement TBWC0 and TBWC1 registers to restore buffer state
Date: Sat, 14 Dec 2019 12:25:57 +1100	[thread overview]
Message-ID: <c37c8c085be7b484fb68a34f0e39851bdd1e48ca.1576286757.git.fthain@telegraphics.com.au> (raw)
In-Reply-To: <cover.1576286757.git.fthain@telegraphics.com.au>

Restore the receive buffer state when the SONIC runs out of receive
descriptors. Otherwise it may write the next packet past the end of the
buffer and corrupt guest memory. This implements behaviour described
in section 3.4.6.2 in the datasheet.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
---
 hw/net/dp8393x.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
index 3fdc6cc6f9..5e4494a945 100644
--- a/hw/net/dp8393x.c
+++ b/hw/net/dp8393x.c
@@ -39,7 +39,7 @@ static const char* reg_names[] = {
     "CR", "DCR", "RCR", "TCR", "IMR", "ISR", "UTDA", "CTDA",
     "TPS", "TFC", "TSA0", "TSA1", "TFS", "URDA", "CRDA", "CRBA0",
     "CRBA1", "RBWC0", "RBWC1", "EOBC", "URRA", "RSA", "REA", "RRP",
-    "RWP", "TRBA0", "TRBA1", "0x1b", "0x1c", "0x1d", "0x1e", "LLFA",
+    "RWP", "TRBA0", "TRBA1", "TBWC0", "TBWC1", "0x1d", "0x1e", "LLFA",
     "TTDA", "CEP", "CAP2", "CAP1", "CAP0", "CE", "CDP", "CDC",
     "SR", "WT0", "WT1", "RSC", "CRCT", "FAET", "MPT", "MDT",
     "0x30", "0x31", "0x32", "0x33", "0x34", "0x35", "0x36", "0x37",
@@ -78,6 +78,8 @@ do { printf("sonic ERROR: %s: " fmt, __func__ , ## __VA_ARGS__); } while (0)
 #define SONIC_RWP    0x18
 #define SONIC_TRBA0  0x19
 #define SONIC_TRBA1  0x1a
+#define SONIC_TBWC0  0x1b
+#define SONIC_TBWC1  0x1c
 #define SONIC_LLFA   0x1f
 #define SONIC_TTDA   0x20
 #define SONIC_CEP    0x21
@@ -777,6 +779,8 @@ static ssize_t dp8393x_receive(NetClientState *nc, const uint8_t * buf,
     /* Save current position */
     s->regs[SONIC_TRBA1] = s->regs[SONIC_CRBA1];
     s->regs[SONIC_TRBA0] = s->regs[SONIC_CRBA0];
+    s->regs[SONIC_TBWC1] = s->regs[SONIC_RBWC1];
+    s->regs[SONIC_TBWC0] = s->regs[SONIC_RBWC0];
 
     /* Calculate the ethernet checksum */
     checksum = cpu_to_le32(crc32(0, buf, rx_len));
@@ -827,6 +831,12 @@ static ssize_t dp8393x_receive(NetClientState *nc, const uint8_t * buf,
     if (s->regs[SONIC_LLFA] & 0x1) {
         /* EOL detected */
         s->regs[SONIC_ISR] |= SONIC_ISR_RDE;
+
+        /* Restore buffer state */
+        s->regs[SONIC_CRBA1] = s->regs[SONIC_TRBA1];
+        s->regs[SONIC_CRBA0] = s->regs[SONIC_TRBA0];
+        s->regs[SONIC_RBWC1] = s->regs[SONIC_TBWC1];
+        s->regs[SONIC_RBWC0] = s->regs[SONIC_TBWC0];
     } else {
         /* Clear in_use */
         int offset = dp8393x_crda(s) + sizeof(uint16_t) * 6 * width;
-- 
2.23.0



  parent reply	other threads:[~2019-12-14  1:35 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-14  1:25 [PATCH 00/10] Fixes for DP8393X SONIC device emulation Finn Thain
2019-12-14  1:25 ` [PATCH 08/10] dp8393x: Implement packet size limit and RBAE interrupt Finn Thain
2019-12-14  1:25 ` [PATCH 09/10] dp8393x: Don't stop reception upon RBE interrupt assertion Finn Thain
2019-12-14  1:25 ` [PATCH 06/10] dp8393x: Clear RRRA command register bit only when appropriate Finn Thain
2019-12-14 13:31   ` Philippe Mathieu-Daudé
2019-12-14  1:25 ` [PATCH 02/10] dp8393x: Clean up endianness hacks Finn Thain
2019-12-14  1:25 ` [PATCH 05/10] dp8393x: Update LLFA register Finn Thain
2019-12-14  1:25 ` [PATCH 10/10] dp8393x: Don't clobber packet checksum Finn Thain
2019-12-14 13:21   ` Philippe Mathieu-Daudé
2019-12-14  1:25 ` Finn Thain [this message]
2019-12-14  1:25 ` [PATCH 01/10] dp8393x: Mask EOL bit from descriptor addresses Finn Thain
2019-12-14 13:35   ` Philippe Mathieu-Daudé
2019-12-14 23:21     ` Finn Thain
2019-12-14  1:25 ` [PATCH 04/10] dp8393x: Don't advance RX descriptor twice Finn Thain
2019-12-14  1:25 ` [PATCH 03/10] dp8393x: Have dp8393x_receive() return the packet size Finn Thain
2019-12-14 13:26   ` Philippe Mathieu-Daudé
2019-12-14  1:43 ` [PATCH 00/10] Fixes for DP8393X SONIC device emulation no-reply
2019-12-14  2:52   ` Finn Thain
2019-12-14 13:38     ` Philippe Mathieu-Daudé
2019-12-14 13:45       ` Eric Blake
2019-12-14 17:17 ` Aleksandar Markovic
2019-12-14 23:16   ` Finn Thain
2019-12-14 23:32     ` Aleksandar Markovic
2019-12-14 23:35       ` Aleksandar Markovic
2019-12-20  4:24         ` Finn Thain
2019-12-23 17:17           ` Philippe Mathieu-Daudé
2019-12-24  0:12             ` NetBSD/arc on MIPS Magnum, was " Finn Thain
2019-12-24  4:33               ` Finn Thain
2019-12-24  6:53                 ` Hervé Poussineau
2020-01-06 22:15                   ` Finn Thain
2019-12-16  0:36     ` Finn Thain
2019-12-20  4:21       ` Finn Thain
2019-12-20 11:38 ` Aleksandar Markovic
2019-12-20 12:03   ` Aleksandar Markovic
2019-12-20 12:54   ` Laurent Vivier
2019-12-20 23:22     ` Finn Thain
2019-12-21 12:03       ` Aleksandar Markovic

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c37c8c085be7b484fb68a34f0e39851bdd1e48ca.1576286757.git.fthain@telegraphics.com.au \
    --to=fthain@telegraphics.com.au \
    --cc=aleksandar.rikalo@rt-rk.com \
    --cc=hpoussin@reactos.org \
    --cc=jasowang@redhat.com \
    --cc=laurent@vivier.eu \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-stable@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).