VirtualBox

Changeset 78549 in vbox for trunk/src


Ignore:
Timestamp:
May 16, 2019 2:38:19 PM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
130596
Message:

OHCI: Interpret the OHCI spec a bit more literally when processing a general TD (see bugref:9429).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/USB/DevOHCI.cpp

    r78530 r78549  
    20952095 * Sets up a OHCI transport buffer.
    20962096 *
    2097  * @returns Flags whether the buffer could be initialised successfully.
    2098  * @param   pThis   The OHCI instance.
    2099  * @param   pBuf    Ohci buffer.
     2097 * @param   pBuf    OHCI buffer.
    21002098 * @param   cbp     Current buffer pointer. 32-bit physical address.
    21012099 * @param   be      Last byte in buffer (BufferEnd). 32-bit physical address.
    21022100 */
    2103 static bool ohciR3BufInit(POHCI pThis, POHCIBUF pBuf, uint32_t cbp, uint32_t be)
    2104 {
    2105     if (RT_UNLIKELY(be < cbp))
    2106     {
    2107         LogRelMax(10, ("OHCI#%d: cbp=%#010x be=%#010x\n", pThis->pDevInsR3->iInstance, cbp, be));
    2108         return false;
    2109     }
    2110 
     2101static void ohciR3BufInit(POHCIBUF pBuf, uint32_t cbp, uint32_t be)
     2102{
    21112103    if (!cbp || !be)
    21122104    {
     
    21152107        Log2(("ohci: cbp=%#010x be=%#010x cbTotal=0 EMPTY\n", cbp, be));
    21162108    }
    2117     else if ((cbp & ~0xfff) == (be & ~0xfff))
     2109    else if ((cbp & ~0xfff) == (be & ~0xfff) && (cbp <= be))
    21182110    {
    21192111        pBuf->aVecs[0].Addr = cbp;
     
    21332125        Log2(("ohci: cbp=%#010x be=%#010x cbTotal=%u PAGE FLIP\n", cbp, be, pBuf->cbTotal));
    21342126    }
    2135 
    2136     return true;
    21372127}
    21382128
     
    26842674         */
    26852675        OHCIBUF Buf;
    2686         if (!ohciR3BufInit(pThis, &Buf, pTd->cbp, pTd->be))
    2687         {
    2688             ohciR3RaiseUnrecoverableError(pThis, 1);
    2689             return;
    2690         }
     2676        ohciR3BufInit(&Buf, pTd->cbp, pTd->be);
    26912677        uint32_t NewCbp;
    26922678        if (cbLeft >= Buf.cbTotal)
     
    27172703                    && Buf.aVecs[1].cb > (cbLeft - Buf.aVecs[0].cb)))
    27182704            {
    2719                 ohciR3RaiseUnrecoverableError(pThis, 2);
     2705                ohciR3RaiseUnrecoverableError(pThis, 1);
    27202706                return;
    27212707            }
     
    29792965    ohciR3ReadTd(pThis, TdAddr, &Td);
    29802966    OHCIBUF Buf;
    2981     if (!ohciR3BufInit(pThis, &Buf, Td.cbp, Td.be))
    2982     {
    2983         ohciR3RaiseUnrecoverableError(pThis, 3);
    2984         return false;
    2985     }
     2967    ohciR3BufInit(&Buf, Td.cbp, Td.be);
    29862968
    29872969    *pNextTdAddr = Td.NextTD & ED_PTR_MASK;
     
    30032985                default:
    30042986                    Log(("ohciR3ServiceTd: Invalid direction!!!! Td.hwinfo=%#x Ed.hwdinfo=%#x\n", Td.hwinfo, pEd->hwinfo));
    3005                     ohciR3RaiseUnrecoverableError(pThis, 4);
     2987                    ohciR3RaiseUnrecoverableError(pThis, 2);
    30062988                    return false;
    30072989            }
     
    30413023                && Buf.aVecs[1].cb > (pUrb->cbData - Buf.aVecs[0].cb)))
    30423024        {
    3043             ohciR3RaiseUnrecoverableError(pThis, 5);
     3025            ohciR3RaiseUnrecoverableError(pThis, 3);
    30443026            VUSBIRhFreeUrb(pThis->RootHub.pIRhConn, pUrb);
    30453027            return false;
     
    31203102    /* read the head */
    31213103    ohciR3ReadTd(pThis, TdAddr, &Head.Td);
    3122     if (!ohciR3BufInit(pThis, &Head.Buf, Head.Td.cbp, Head.Td.be))
    3123     {
    3124         ohciR3RaiseUnrecoverableError(pThis, 6);
    3125         return false;
    3126     }
     3104    ohciR3BufInit(&Head.Buf, Head.Td.cbp, Head.Td.be);
    31273105    Head.TdAddr = TdAddr;
    31283106    Head.pNext = NULL;
     
    31423120        pCur->TdAddr = pTail->Td.NextTD & ED_PTR_MASK;
    31433121        ohciR3ReadTd(pThis, pCur->TdAddr, &pCur->Td);
    3144         if (!ohciR3BufInit(pThis, &pCur->Buf, pCur->Td.cbp, pCur->Td.be))
    3145         {
    3146             ohciR3RaiseUnrecoverableError(pThis, 7);
    3147             return false;
    3148         }
     3122        ohciR3BufInit(&pCur->Buf, pCur->Td.cbp, pCur->Td.be);
    31493123
    31503124        /* Don't combine if the direction doesn't match up. There can't actually be
     
    31803154                default:
    31813155                    Log(("ohciR3ServiceTdMultiple: Invalid direction!!!! Head.Td.hwinfo=%#x Ed.hwdinfo=%#x\n", Head.Td.hwinfo, pEd->hwinfo));
    3182                     ohciR3RaiseUnrecoverableError(pThis, 8);
     3156                    ohciR3RaiseUnrecoverableError(pThis, 4);
    31833157                    return false;
    31843158            }
     
    33593333        default:
    33603334            Log(("ohciR3ServiceIsochronousTd: Invalid direction!!!! Ed.hwdinfo=%#x\n", pEd->hwinfo));
    3361             ohciR3RaiseUnrecoverableError(pThis, 9);
     3335            ohciR3RaiseUnrecoverableError(pThis, 5);
    33623336            return false;
    33633337    }
     
    33923366        {
    33933367            Log(("ITdAddr=%RX32 PSW%d.offset=%#x < offPrev=%#x!\n", ITdAddr, iR, off, offPrev)); /* => Unrecoverable Error*/
    3394             ohciR3RaiseUnrecoverableError(pThis, 10);
     3368            ohciR3RaiseUnrecoverableError(pThis, 6);
    33953369            return false;
    33963370        }
     
    33983372        {
    33993373            Log(("ITdAddr=%RX32 PSW%d.CC=%#x < 'Not Accessed'!\n", ITdAddr, iR, PSW >> ITD_PSW_CC_SHIFT)); /* => Unrecoverable Error*/
    3400             ohciR3RaiseUnrecoverableError(pThis, 11);
     3374            ohciR3RaiseUnrecoverableError(pThis, 7);
    34013375            return false;
    34023376        }
     
    34113385    {
    34123386        Log(("ITdAddr=%RX32 offEnd=%#x < offPrev=%#x!\n", ITdAddr, offEnd, offPrev)); /* => Unrecoverable Error*/
    3413         ohciR3RaiseUnrecoverableError(pThis, 12);
     3387        ohciR3RaiseUnrecoverableError(pThis, 8);
    34143388        return false;
    34153389    }
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette