MsiCommon.cpp revision b742a29c8c5a06fb5f362e5e6c09cbcaf8087ff6
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsync * MSI support routines
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsync * Copyright (C) 2010 Oracle Corporation
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsync * available from http://www.virtualbox.org. This file is free software;
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsync * you can redistribute it and/or modify it under the terms of the GNU
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsync * General Public License (GPL) as published by the Free Software
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsync/* Hack to get PCIDEVICEINT declare at the right point - include "PCIInternal.h". */
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsyncDECLINLINE(uint16_t) msiGetMessageControl(PPCIDEVICE pDev)
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsync return PCIDevGetWord(pDev, pDev->Int.s.u8MsiCapOffset + VBOX_MSI_CAP_MESSAGE_CONTROL);
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsync return (msiGetMessageControl(pDev) & VBOX_PCI_MSI_FLAGS_64BIT) != 0;
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsyncDECLINLINE(uint32_t*) msiGetMaskBits(PPCIDEVICE pDev)
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsync uint8_t iOff = msiIs64Bit(pDev) ? VBOX_MSI_CAP_MASK_BITS_64 : VBOX_MSI_CAP_MASK_BITS_32;
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsyncDECLINLINE(uint32_t*) msiGetPendingBits(PPCIDEVICE pDev)
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsync uint8_t iOff = msiIs64Bit(pDev) ? VBOX_MSI_CAP_PENDING_BITS_64 : VBOX_MSI_CAP_PENDING_BITS_32;
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsync return (msiGetMessageControl(pDev) & VBOX_PCI_MSI_FLAGS_ENABLE) != 0;
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsync return (msiGetMessageControl(pDev) & VBOX_PCI_MSI_FLAGS_QSIZE) != 0;
17ef1920962b3df57bf6d2704ced1586396d96f0vboxsyncDECLINLINE(RTGCPHYS) msiGetMsiAddress(PPCIDEVICE pDev)
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsync uint32_t lo = PCIDevGetDWord(pDev, pDev->Int.s.u8MsiCapOffset + VBOX_MSI_CAP_MESSAGE_ADDRESS_LO);
b6b07507d11e2bea02bbba193ba367ea479a2fcfvboxsync uint32_t hi = PCIDevGetDWord(pDev, pDev->Int.s.u8MsiCapOffset + VBOX_MSI_CAP_MESSAGE_ADDRESS_HI);
void MSIPciConfigWrite(PPDMDEVINS pDevIns, PPCIDEVICE pDev, uint32_t u32Address, uint32_t val, unsigned len)
switch (reg)
if ( !f64Bit
if ( f64Bit
uAddr++;
switch (len)
Assert(false);
return rv;
return VERR_TOO_MUCH_DATA;
return VERR_TOO_MUCH_DATA;
return VINF_SUCCESS;