VirtualBox

Changeset 81985 in vbox for trunk/src


Ignore:
Timestamp:
Nov 19, 2019 11:07:48 AM (5 years ago)
Author:
vboxsync
Message:

DevDMA: Added some paranoia. bugref:9218

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/DevDMA.cpp

    r81984 r81985  
    4949#include <VBox/err.h>
    5050
     51#include <VBox/AssertGuest.h>
    5152#include <VBox/log.h>
    5253#include <iprt/assert.h>
     
    110111    uint8_t                             u8Mode;         /* Channel mode. */
    111112    uint8_t                             abPadding[7];
    112 } DMAChannel;
     113} DMAChannel, DMACHANNEL;
     114typedef DMACHANNEL *PDMACHANNEL;
    113115
    114116/* State information for a DMA controller (DMA8 or DMA16). */
     
    143145    PPDMDEVINSR3            pDevIns;    /* Device instance. */
    144146    R3PTRTYPE(PCPDMDMACHLP) pHlp;       /* PDM DMA helpers. */
     147    STAMPROFILE             StatRun;
    145148} DMAState, DMASTATE;
    146149/** Pointer to the shared DMA state information. */
     
    260263    if (cb == 1)
    261264    {
    262         DMAControl  *dc = (DMAControl *)pvUser;
    263         DMAChannel  *ch;
    264         int         chidx, reg, is_count;
    265 
     265        PDMACONTROLLER dc       = (PDMACONTROLLER)pvUser;
     266        unsigned const reg      = (offPort >> dc->is16bit) & 0x0f;
     267        unsigned const chidx    = reg >> 1;
     268        unsigned const is_count = reg & 1;
     269        PDMACHANNEL    ch       = &RT_SAFE_SUBSCRIPT(dc->ChState, chidx);
    266270        Assert(!(u32 & ~0xff)); /* Check for garbage in high bits. */
    267         reg      = (offPort >> dc->is16bit) & 0x0f;
    268         chidx    = reg >> 1;
    269         is_count = reg & 1;
    270         ch       = &dc->ChState[chidx];
     271
    271272        if (dmaReadBytePtr(dc))
    272273        {
     
    307308    if (cb == 1)
    308309    {
    309         DMAControl  *dc = (DMAControl *)pvUser;
    310         DMAChannel  *ch;
    311         int         chidx, reg, val, dir;
    312         int         bptr;
    313 
    314         reg   = (offPort >> dc->is16bit) & 0x0f;
    315         chidx = reg >> 1;
    316         ch    = &dc->ChState[chidx];
    317 
    318         dir = IS_MODE_DEC(ch->u8Mode) ? -1 : 1;
     310        PDMACONTROLLER dc    = (PDMACONTROLLER)pvUser;
     311        unsigned const reg   = (offPort >> dc->is16bit) & 0x0f;
     312        unsigned const chidx = reg >> 1;
     313        PDMACHANNEL    ch    = &RT_SAFE_SUBSCRIPT(dc->ChState, chidx);
     314        int const      dir   = IS_MODE_DEC(ch->u8Mode) ? -1 : 1;
     315        int            val;
     316        int            bptr;
     317
    319318        if (reg & 1)
    320319            val = ch->u16BaseCount - ch->u16CurCount;
     
    341340    if (cb == 1)
    342341    {
    343         DMAControl  *dc = (DMAControl *)pvUser;
    344         unsigned     chidx = 0;
     342        PDMACONTROLLER dc = (PDMACONTROLLER)pvUser;
     343        unsigned       chidx = 0;
    345344
    346345        unsigned const reg = (offPort >> dc->is16bit) & 0x0f;
     
    374373            break;
    375374        case CTL_W_MODE:
    376             {
    377                 int op, opmode;
    378 
    379                 chidx = u32 & 3;
    380                 op = (u32 >> 2) & 3;
    381                 opmode = (u32 >> 6) & 3;
    382                 Log2(("chidx %d, op %d, %sauto-init, %screment, opmode %d\n",
    383                       chidx, op, IS_MODE_AI(u32) ? "" : "no ",
    384                       IS_MODE_DEC(u32) ? "de" : "in", opmode));
    385 
    386                 dc->ChState[chidx].u8Mode = u32;
    387                 break;
    388             }
     375            chidx = u32 & 3;
     376            dc->ChState[chidx].u8Mode = u32;
     377            Log2(("chidx %d, op %d, %sauto-init, %screment, opmode %d\n",
     378                  chidx, (u32 >> 2) & 3, IS_MODE_AI(u32) ? "" : "no ", IS_MODE_DEC(u32) ? "de" : "in", (u32 >> 6) & 3));
     379            break;
    389380        case CTL_W_CLRBPTR:
    390381            dc->fHiByte = false;
     
    400391            break;
    401392        default:
    402             Assert(0);
     393            ASSERT_GUEST_MSG_FAILED(("reg=%u\n", reg));
    403394            break;
    404395        }
     
    422413    if (cb == 1)
    423414    {
    424         DMAControl  *dc = (DMAControl *)pvUser;
    425         uint8_t     val = 0;
     415        PDMACONTROLLER dc = (PDMACONTROLLER)pvUser;
     416        uint8_t        val = 0;
    426417
    427418        unsigned const reg = (offPort >> dc->is16bit) & 0x0f;
     
    441432                break;
    442433            case CTL_R_MODE:
    443                 val = dc->ChState[dc->u8ModeCtr].u8Mode | 3;
     434                val = RT_SAFE_SUBSCRIPT(dc->ChState, dc->u8ModeCtr).u8Mode | 3;
    444435                dc->u8ModeCtr = (dc->u8ModeCtr + 1) & 3;
    445436                break;
     
    483474{
    484475    RT_NOREF(pDevIns);
    485     DMAControl  *dc = (DMAControl *)pvUser;
    486     int         reg;
     476    PDMACONTROLLER dc = (PDMACONTROLLER)pvUser;
     477    int            reg;
    487478
    488479    if (cb == 1)
     
    513504{
    514505    RT_NOREF(pDevIns);
    515     DMAControl  *dc = (DMAControl *)pvUser;
    516     int         reg;
     506    PDMACONTROLLER dc = (PDMACONTROLLER)pvUser;
     507    unsigned       reg;
    517508
    518509    if (cb == 1)
     
    553544    if (cb == 1)
    554545    {
    555         DMAControl  *dc = (DMAControl *)pvUser;
    556         int         reg;
    557 
    558         reg   = offPort & 7;
     546        PDMACONTROLLER dc = (PDMACONTROLLER)pvUser;
     547        unsigned const reg = offPort & 7;
     548
    559549        *pu32 = dc->au8PageHi[reg];
    560550        Log2(("Read %#x to from high page register %#x (channel %d)\n", *pu32, offPort, DMAPG2CX(reg)));
     
    573563    if (cb == 1)
    574564    {
    575         DMAControl  *dc = (DMAControl *)pvUser;
    576         int         reg;
     565        PDMACONTROLLER dc = (PDMACONTROLLER)pvUser;
     566        unsigned const reg = offPort & 7;
    577567
    578568        Assert(!(u32 & ~0xff)); /* Check for garbage in high bits. */
    579         reg = offPort & 7;
    580569        dc->au8PageHi[reg] = u32;
    581570        Log2(("Wrote %#x to high page register %#x (channel %d)\n", u32, offPort, DMAPG2CX(reg)));
     
    602591    opmode = (ch->u8Mode >> 6) & 3;
    603592
    604     Log3(("DMA address %screment, mode %d\n",
    605           IS_MODE_DEC(ch->u8Mode) ? "de" : "in",
    606           ch->u8Mode >> 6));
     593    Log3(("DMA address %screment, mode %d\n", IS_MODE_DEC(ch->u8Mode) ? "de" : "in", ch->u8Mode >> 6));
    607594
    608595    /* Addresses and counts are shifted for 16-bit channels. */
     
    638625    DMAControl  *dc;
    639626    int         ctlidx, chidx, mask;
     627    STAM_PROFILE_START(&pThis->StatRun, a);
    640628    PDMCritSectEnter(pDevIns->pCritSectRoR3, VERR_IGNORED);
    641629
    642630    /* Run all controllers and channels. */
    643     for (ctlidx = 0; ctlidx < 2; ++ctlidx)
     631    for (ctlidx = 0; ctlidx < RT_ELEMENTS(pThis->DMAC); ++ctlidx)
    644632    {
    645633        dc = &pThis->DMAC[ctlidx];
     
    658646
    659647    PDMCritSectLeave(pDevIns->pCritSectRoR3);
     648    STAM_PROFILE_STOP(&pThis->StatRun, a);
    660649    return 0;
    661650}
     
    10431032    AssertRCReturn(rc, rc);
    10441033
     1034    /*
     1035     * Statistics.
     1036     */
     1037    PDMDevHlpSTAMRegister(pDevIns, &pThis->StatRun, STAMTYPE_PROFILE, "DmaRun", STAMUNIT_TICKS_PER_CALL, "Profiling dmaRun().");
     1038
    10451039    return VINF_SUCCESS;
    10461040}
     
    10901084    /* .uReserved0 = */             0,
    10911085    /* .szName = */                 "8237A",
    1092     /* .fFlags = */                 PDM_DEVREG_FLAGS_DEFAULT_BITS | PDM_DEVREG_FLAGS_RZ,
     1086    /* .fFlags = */                 PDM_DEVREG_FLAGS_DEFAULT_BITS | PDM_DEVREG_FLAGS_RZ | PDM_DEVREG_FLAGS_NEW_STYLE,
    10931087    /* .fClass = */                 PDM_DEVREG_CLASS_DMA,
    10941088    /* .cMaxInstances = */          1,
Note: See TracChangeset for help on using the changeset viewer.

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