VirtualBox

Changeset 38188 in vbox


Ignore:
Timestamp:
Jul 26, 2011 2:41:26 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
73146
Message:

DMA: Handle word access to page registers.

File:
1 edited

Legend:

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

    r37423 r38188  
    430430                                     uint32_t *pu32, unsigned cb)
    431431{
     432    DMAControl  *dc = (DMAControl *)pvUser;
     433    int         reg;
     434
    432435    if (cb == 1)
    433436    {
    434         DMAControl  *dc = (DMAControl *)pvUser;
    435         int         reg;
    436 
    437437        reg   = port & 7;
    438438        *pu32 = dc->au8Page[reg];
    439         Log2(("Read %#x to from page register %#x (channel %d)\n",
     439        Log2(("Read %#x (byte) from page register %#x (channel %d)\n",
    440440              *pu32, port, DMAPG2CX(reg)));
    441441        return VINF_SUCCESS;
     442    }
     443    else if (cb == 2)
     444    {
     445        reg   = port & 7;
     446        *pu32 = dc->au8Page[reg] | (dc->au8Page[(reg + 1) & 7] << 8);
     447        Log2(("Read %#x (word) from page register %#x (channel %d)\n",
     448              *pu32, port, DMAPG2CX(reg)));
     449        return VINF_SUCCESS;
    442450    }
    443451    else
     
    448456                                      uint32_t u32, unsigned cb)
    449457{
     458    DMAControl  *dc = (DMAControl *)pvUser;
     459    int         reg;
     460
     461    Assert(!(u32 & ~0xff)); /* Check for garbage in high bits. */
    450462    if (cb == 1)
    451463    {
    452         DMAControl  *dc = (DMAControl *)pvUser;
    453         int         reg;
    454 
    455         Assert(!(u32 & ~0xff)); /* Check for garbage in high bits. */
    456464        reg = port & 7;
    457465        dc->au8Page[reg]   = u32;
     
    459467        Log2(("Wrote %#x to page register %#x (channel %d)\n",
    460468              u32, port, DMAPG2CX(reg)));
     469    }
     470    else if (cb == 2)
     471    {
     472        reg = port & 7;
     473        dc->au8Page[reg]   = u32;
     474        dc->au8PageHi[reg] = 0;  /* Corresponding high page cleared. */
     475        reg = (port + 1) & 7;
     476        dc->au8Page[reg]   = u32 >> 8;
     477        dc->au8PageHi[reg] = 0;  /* Corresponding high page cleared. */
    461478    }
    462479    else
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