PDMR0Device.cpp revision 766956791b9a42fc91ba6f8bd8be7f6a6f7ba092
9a3faa0b7c1afced2e57bc05acfe3f232f855bd4vboxsync * PDM - Pluggable Device and Driver Manager, R0 Device parts.
9a3faa0b7c1afced2e57bc05acfe3f232f855bd4vboxsync * Copyright (C) 2006-2010 Oracle Corporation
9a3faa0b7c1afced2e57bc05acfe3f232f855bd4vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9a3faa0b7c1afced2e57bc05acfe3f232f855bd4vboxsync * available from http://www.virtualbox.org. This file is free software;
9a3faa0b7c1afced2e57bc05acfe3f232f855bd4vboxsync * you can redistribute it and/or modify it under the terms of the GNU
9a3faa0b7c1afced2e57bc05acfe3f232f855bd4vboxsync * General Public License (GPL) as published by the Free Software
9a3faa0b7c1afced2e57bc05acfe3f232f855bd4vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9a3faa0b7c1afced2e57bc05acfe3f232f855bd4vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9a3faa0b7c1afced2e57bc05acfe3f232f855bd4vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9a3faa0b7c1afced2e57bc05acfe3f232f855bd4vboxsync/*******************************************************************************
9a3faa0b7c1afced2e57bc05acfe3f232f855bd4vboxsync* Header Files *
9a3faa0b7c1afced2e57bc05acfe3f232f855bd4vboxsync*******************************************************************************/
9a3faa0b7c1afced2e57bc05acfe3f232f855bd4vboxsync/*******************************************************************************
297c76d05a4b7e2c6a8a99731a147c7a478d43b9vboxsync* Global Variables *
297c76d05a4b7e2c6a8a99731a147c7a478d43b9vboxsync*******************************************************************************/
eb34012c2c2a8a2ad7ab3853befe49ed637f98afvboxsyncextern DECLEXPORT(const PDMAPICHLPR0) g_pdmR0ApicHlp;
297c76d05a4b7e2c6a8a99731a147c7a478d43b9vboxsyncextern DECLEXPORT(const PDMIOAPICHLPR0) g_pdmR0IoApicHlp;
297c76d05a4b7e2c6a8a99731a147c7a478d43b9vboxsyncextern DECLEXPORT(const PDMHPETHLPR0) g_pdmR0HpetHlp;
297c76d05a4b7e2c6a8a99731a147c7a478d43b9vboxsync/*******************************************************************************
297c76d05a4b7e2c6a8a99731a147c7a478d43b9vboxsync* Internal Functions *
297c76d05a4b7e2c6a8a99731a147c7a478d43b9vboxsync*******************************************************************************/
297c76d05a4b7e2c6a8a99731a147c7a478d43b9vboxsyncstatic void pdmR0IsaSetIrq(PVM pVM, int iIrq, int iLevel);
7f5d3309eea160bba5ec277029d49d4a67e54f66vboxsyncstatic void pdmR0IoApicSetIrq(PVM pVM, int iIrq, int iLevel);
297c76d05a4b7e2c6a8a99731a147c7a478d43b9vboxsync/** @name Ring-0 Device Helpers
9a3faa0b7c1afced2e57bc05acfe3f232f855bd4vboxsync/** @interface_method_impl{PDMDEVHLPR0,pfnPCISetIrq} */
297c76d05a4b7e2c6a8a99731a147c7a478d43b9vboxsyncstatic DECLCALLBACK(void) pdmR0DevHlp_PCISetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel)
297c76d05a4b7e2c6a8a99731a147c7a478d43b9vboxsync LogFlow(("pdmR0DevHlp_PCISetIrq: caller=%p/%d: iIrq=%d iLevel=%d\n", pDevIns, pDevIns->iInstance, iIrq, iLevel));
297c76d05a4b7e2c6a8a99731a147c7a478d43b9vboxsync PPCIDEVICE pPciDev = pDevIns->Internal.s.pPciDeviceR0;
5b7e1b66e85427d68adcfbecfe8ea4c06c9cd1afvboxsync PPDMPCIBUS pPciBus = pDevIns->Internal.s.pPciBusR0;
297c76d05a4b7e2c6a8a99731a147c7a478d43b9vboxsync pPciBus->pfnSetIrqR0(pPciBus->pDevInsR0, pPciDev, iIrq, iLevel);
7420e5ee5565b181c144eabb14da0da9e8cce657vboxsync /* queue for ring-3 execution. */
7420e5ee5565b181c144eabb14da0da9e8cce657vboxsync PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueR0);
if (pTask)
LogFlow(("pdmR0DevHlp_ISASetIrq: caller=%p/%d: iIrq=%d iLevel=%d\n", pDevIns, pDevIns->iInstance, iIrq, iLevel));
static DECLCALLBACK(int) pdmR0DevHlp_PhysRead(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, void *pvBuf, size_t cbRead)
return rc;
static DECLCALLBACK(int) pdmR0DevHlp_PhysWrite(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, const void *pvBuf, size_t cbWrite)
return rc;
Log(("pdmR0DevHlp_A20IsEnabled: caller=%p/%d: returns %RTbool\n", pDevIns, pDevIns->iInstance, fEnabled));
return fEnabled;
LogFlow(("pdmR0DevHlp_VMState: caller=%p/%d: returns %d\n", pDevIns, pDevIns->iInstance, enmVMState));
return enmVMState;
static DECLCALLBACK(int) pdmR0DevHlp_VMSetError(PPDMDEVINS pDevIns, int rc, RT_SRC_POS_DECL, const char *pszFormat, ...)
int rc2 = VMSetErrorV(pDevIns->Internal.s.pVMR0, rc, RT_SRC_POS_ARGS, pszFormat, args); Assert(rc2 == rc); NOREF(rc2);
return rc;
static DECLCALLBACK(int) pdmR0DevHlp_VMSetErrorV(PPDMDEVINS pDevIns, int rc, RT_SRC_POS_DECL, const char *pszFormat, va_list va)
int rc2 = VMSetErrorV(pDevIns->Internal.s.pVMR0, rc, RT_SRC_POS_ARGS, pszFormat, va); Assert(rc2 == rc); NOREF(rc2);
return rc;
static DECLCALLBACK(int) pdmR0DevHlp_VMSetRuntimeError(PPDMDEVINS pDevIns, uint32_t fFlags, const char *pszErrorId, const char *pszFormat, ...)
return rc;
static DECLCALLBACK(int) pdmR0DevHlp_VMSetRuntimeErrorV(PPDMDEVINS pDevIns, uint32_t fFlags, const char *pszErrorId, const char *pszFormat, va_list va)
return rc;
static DECLCALLBACK(int) pdmR0DevHlp_PATMSetMMIOPatchInfo(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RTGCPTR pCachedData)
AssertFailed();
/* return PATMSetMMIOPatchInfo(pDevIns->Internal.s.pVMR0, GCPhys, pCachedData); */
return VINF_SUCCESS;
static DECLCALLBACK(void) pdmR0ApicHlp_SetInterruptFF(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu)
VMMGetCpuId(pVM), pDevIns, pDevIns->iInstance, VMCPU_FF_ISSET(pVCpu, VMCPU_FF_INTERRUPT_APIC), idCpu));
switch (enmType)
case PDMAPICIRQ_HARDWARE:
case PDMAPICIRQ_NMI:
case PDMAPICIRQ_SMI:
case PDMAPICIRQ_EXTINT:
case VMCPUSTATE_STARTED_EXEC:
static DECLCALLBACK(void) pdmR0ApicHlp_ClearInterruptFF(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu)
switch (enmType)
case PDMAPICIRQ_HARDWARE:
case PDMAPICIRQ_EXTINT:
LogFlow(("pdmR0ApicHlp_ChangeFeature: caller=%p/%d: version=%d\n", pDevIns, pDevIns->iInstance, (int)enmVersion));
switch (enmVersion)
case PDMAPICVERSION_NONE:
case PDMAPICVERSION_APIC:
case PDMAPICVERSION_X2APIC:
static DECLCALLBACK(int) pdmR0IoApicHlp_ApicBusDeliver(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode,
LogFlow(("pdmR0IoApicHlp_ApicBusDeliver: caller=%p/%d: u8Dest=%RX8 u8DestMode=%RX8 u8DeliveryMode=%RX8 iVector=%RX8 u8Polarity=%RX8 u8TriggerMode=%RX8\n",
pDevIns, pDevIns->iInstance, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode));
return pVM->pdm.s.Apic.pfnBusDeliverR0(pVM->pdm.s.Apic.pDevInsR0, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode);
return VINF_SUCCESS;
static DECLCALLBACK(int) pdmR0DrvHlp_VMSetError(PPDMDRVINS pDrvIns, int rc, RT_SRC_POS_DECL, const char *pszFormat, ...)
int rc2 = VMSetErrorV(pDrvIns->Internal.s.pVMR0, rc, RT_SRC_POS_ARGS, pszFormat, args); Assert(rc2 == rc); NOREF(rc2);
return rc;
static DECLCALLBACK(int) pdmR0DrvHlp_VMSetErrorV(PPDMDRVINS pDrvIns, int rc, RT_SRC_POS_DECL, const char *pszFormat, va_list va)
int rc2 = VMSetErrorV(pDrvIns->Internal.s.pVMR0, rc, RT_SRC_POS_ARGS, pszFormat, va); Assert(rc2 == rc); NOREF(rc2);
return rc;
static DECLCALLBACK(int) pdmR0DrvHlp_VMSetRuntimeError(PPDMDRVINS pDrvIns, uint32_t fFlags, const char *pszErrorId, const char *pszFormat, ...)
return rc;
static DECLCALLBACK(int) pdmR0DrvHlp_VMSetRuntimeErrorV(PPDMDRVINS pDrvIns, uint32_t fFlags, const char *pszErrorId, const char *pszFormat, va_list va)
return rc;
static DECLCALLBACK(bool) pdmR0DrvHlp_AssertEMT(PPDMDRVINS pDrvIns, const char *pszFile, unsigned iLine, const char *pszFunction)
static DECLCALLBACK(bool) pdmR0DrvHlp_AssertOther(PPDMDRVINS pDrvIns, const char *pszFile, unsigned iLine, const char *pszFunction)
if (pTask)
if (pTask)
AssertMsgReturn(pReq->Hdr.cbReq == sizeof(*pReq), ("%#x != %#x\n", pReq->Hdr.cbReq, sizeof(*pReq)), VERR_INVALID_PARAMETER);