Blame 0018-usb-ohci-td.cbp-incorrectly-updated-near-page-end.patch

Justin M. Forbes 45e84a
From 23201c64a789cf948fedcea221a4b6e197fcd628 Mon Sep 17 00:00:00 2001
Justin M. Forbes 45e84a
From: Andriy Gapon <avg@FreeBSD.org>
Justin M. Forbes 45e84a
Date: Thu, 22 Dec 2011 11:34:30 +0200
Justin M. Forbes 45e84a
Subject: [PATCH 18/25] usb-ohci: td.cbp incorrectly updated near page end
Justin M. Forbes 45e84a
Justin M. Forbes 45e84a
The current code that updates the cbp value after a transfer looks like this:
Justin M. Forbes 45e84a
td.cbp += ret;
Justin M. Forbes 45e84a
if ((td.cbp & 0xfff) + ret > 0xfff) {
Justin M. Forbes 45e84a
	<handle page overflow>
Justin M. Forbes 45e84a
because the 'ret' value is effectively added twice the check may fire too early
Justin M. Forbes 45e84a
when the overflow hasn't happened yet.
Justin M. Forbes 45e84a
Justin M. Forbes 45e84a
Below is one of the possible changes that correct the behavior:
Justin M. Forbes 45e84a
Justin M. Forbes 45e84a
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Justin M. Forbes 45e84a
---
Justin M. Forbes 45e84a
 hw/usb-ohci.c |    6 +++---
Justin M. Forbes 45e84a
 1 files changed, 3 insertions(+), 3 deletions(-)
Justin M. Forbes 45e84a
Justin M. Forbes 45e84a
diff --git a/hw/usb-ohci.c b/hw/usb-ohci.c
Justin M. Forbes 45e84a
index c2981c5..c27014a 100644
Justin M. Forbes 45e84a
--- a/hw/usb-ohci.c
Justin M. Forbes 45e84a
+++ b/hw/usb-ohci.c
Justin M. Forbes 45e84a
@@ -1025,10 +1025,10 @@ static int ohci_service_td(OHCIState *ohci, struct ohci_ed *ed)
Justin M. Forbes 45e84a
         if (ret == len) {
Justin M. Forbes 45e84a
             td.cbp = 0;
Justin M. Forbes 45e84a
         } else {
Justin M. Forbes 45e84a
-            td.cbp += ret;
Justin M. Forbes 45e84a
             if ((td.cbp & 0xfff) + ret > 0xfff) {
Justin M. Forbes 45e84a
-                td.cbp &= 0xfff;
Justin M. Forbes 45e84a
-                td.cbp |= td.be & ~0xfff;
Justin M. Forbes 45e84a
+                td.cbp = (td.be & ~0xfff) + ((td.cbp + ret) & 0xfff);
Justin M. Forbes 45e84a
+            } else {
Justin M. Forbes 45e84a
+                td.cbp += ret;
Justin M. Forbes 45e84a
             }
Justin M. Forbes 45e84a
         }
Justin M. Forbes 45e84a
         td.flags |= OHCI_TD_T1;
Justin M. Forbes 45e84a
-- 
Justin M. Forbes 45e84a
1.7.7.5
Justin M. Forbes 45e84a