VirtualBox

Ignore:
Timestamp:
Aug 2, 2010 9:51:35 AM (14 years ago)
Author:
vboxsync
Message:

Audio/HDA: unaligned write access and aliases.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Audio/DevIchIntelHDA.cpp

    r31263 r31278  
    612612            return index;
    613613        }
     614    }
     615    /* Aliases HDA spec 3.3.45 */
     616    switch(u32Offset)
     617    {
     618        case 0x2084:
     619            return HDA_REG_IND_NAME(SD0LPIB);
     620        case 0x20A4:
     621            return HDA_REG_IND_NAME(SD1LPIB);
     622        case 0x20C4:
     623            return HDA_REG_IND_NAME(SD2LPIB);
     624        case 0x20E4:
     625            return HDA_REG_IND_NAME(SD3LPIB);
     626        case 0x2104:
     627            return HDA_REG_IND_NAME(SD4LPIB);
     628        case 0x2124:
     629            return HDA_REG_IND_NAME(SD5LPIB);
     630        case 0x2144:
     631            return HDA_REG_IND_NAME(SD6LPIB);
     632        case 0x2164:
     633            return HDA_REG_IND_NAME(SD7LPIB);
    614634    }
    615635    return -1;
     
    13281348    }
    13291349    Assert(   index != -1
    1330            && u32Offset == s_ichIntelHDRegMap[index].offset
    13311350           && cb <= 4);
    13321351    if (index != -1)
    13331352    {
    1334         Assert(u32Offset == s_ichIntelHDRegMap[index].offset);
    13351353        uint32_t v = pThis->hda.au32Regs[index];
    13361354        uint32_t mask = 0;
     1355        uint32_t shift = (u32Offset - s_ichIntelHDRegMap[index].offset) % sizeof(uint32_t) * 8;
    13371356        switch(cb)
    13381357        {
     
    13421361            case 4: mask = 0x00000000; break;
    13431362        }
    1344         *(uint32_t *)pv = (v & mask) | (*(uint32_t *)pv & ~mask);
     1363        mask <<= shift;
     1364        *(uint32_t *)pv = ((v & mask) | (*(uint32_t *)pv & ~mask)) >> shift;
    13451365        rc = s_ichIntelHDRegMap[index].pfnWrite(&pThis->hda, u32Offset, index, *(uint32_t *)pv);
    13461366        Log(("hda: write %s:(%x) %x => %x\n", s_ichIntelHDRegMap[index].abbrev, *(uint32_t *)pv, v, pThis->hda.au32Regs[index]));
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