PDMR0Device.cpp revision e74eef731a813e4e06680c587a6759b9974b29c9
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * PDM - Pluggable Device and Driver Manager, R0 Device parts.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Copyright (C) 2006-2010 Sun Microsystems, Inc.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * available from http://www.virtualbox.org. This file is free software;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * additional information or have any questions.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*******************************************************************************
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync* Header Files *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync*******************************************************************************/
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*******************************************************************************
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync* Global Variables *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync*******************************************************************************/
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsyncextern DECLEXPORT(const PDMAPICHLPR0) g_pdmR0ApicHlp;
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsyncextern DECLEXPORT(const PDMIOAPICHLPR0) g_pdmR0IoApicHlp;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncextern DECLEXPORT(const PDMHPETHLPR0) g_pdmR0HpetHlp;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*******************************************************************************
afed5ab737f4aacfae3fe73776f40e989190a7cavboxsync* Internal Functions *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync*******************************************************************************/
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic void pdmR0IsaSetIrq(PVM pVM, int iIrq, int iLevel);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic void pdmR0IoApicSetIrq(PVM pVM, int iIrq, int iLevel);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @name Ring-0 Device Helpers
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMDEVHLPR0::pfnPCISetIrq */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(void) pdmR0DevHlp_PCISetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0DevHlp_PCISetIrq: caller=%p/%d: iIrq=%d iLevel=%d\n", pDevIns, pDevIns->iInstance, iIrq, iLevel));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PPCIDEVICE pPciDev = pDevIns->Internal.s.pPciDeviceR0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PPDMPCIBUS pPciBus = pDevIns->Internal.s.pPciBusR0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pPciBus->pfnSetIrqR0(pPciBus->pDevInsR0, pPciDev, iIrq, iLevel);
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync /* queue for ring-3 execution. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueR0);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0);
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync AssertMsgFailed(("We're out of devhlp queue items!!!\n"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0DevHlp_PCISetIrq: caller=%p/%d: returns void\n", pDevIns, pDevIns->iInstance));
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync/** @copydoc PDMDEVHLPR0::pfnPCISetIrq */
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsyncstatic DECLCALLBACK(void) pdmR0DevHlp_ISASetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel)
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync LogFlow(("pdmR0DevHlp_ISASetIrq: caller=%p/%d: iIrq=%d iLevel=%d\n", pDevIns, pDevIns->iInstance, iIrq, iLevel));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0IsaSetIrq(pDevIns->Internal.s.pVMR0, iIrq, iLevel);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0DevHlp_ISASetIrq: caller=%p/%d: returns void\n", pDevIns, pDevIns->iInstance));
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync/** @copydoc PDMDEVHLPR0::pfnPhysRead */
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsyncstatic DECLCALLBACK(int) pdmR0DevHlp_PhysRead(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, void *pvBuf, size_t cbRead)
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync LogFlow(("pdmR0DevHlp_PhysRead: caller=%p/%d: GCPhys=%RGp pvBuf=%p cbRead=%#x\n",
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync pDevIns, pDevIns->iInstance, GCPhys, pvBuf, cbRead));
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync int rc = PGMPhysRead(pDevIns->Internal.s.pVMR0, GCPhys, pvBuf, cbRead);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertRC(rc); /** @todo track down the users for this bugger. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("pdmR0DevHlp_PhysRead: caller=%p/%d: returns %Rrc\n", pDevIns, pDevIns->iInstance, rc));
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync/** @copydoc PDMDEVHLPR0::pfnPhysWrite */
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsyncstatic DECLCALLBACK(int) pdmR0DevHlp_PhysWrite(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, const void *pvBuf, size_t cbWrite)
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync LogFlow(("pdmR0DevHlp_PhysWrite: caller=%p/%d: GCPhys=%RGp pvBuf=%p cbWrite=%#x\n",
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync pDevIns, pDevIns->iInstance, GCPhys, pvBuf, cbWrite));
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync int rc = PGMPhysWrite(pDevIns->Internal.s.pVMR0, GCPhys, pvBuf, cbWrite);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync AssertRC(rc); /** @todo track down the users for this bugger. */
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync Log(("pdmR0DevHlp_PhysWrite: caller=%p/%d: returns %Rrc\n", pDevIns, pDevIns->iInstance, rc));
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync/** @copydoc PDMDEVHLPR0::pfnA20IsEnabled */
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsyncstatic DECLCALLBACK(bool) pdmR0DevHlp_A20IsEnabled(PPDMDEVINS pDevIns)
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync LogFlow(("pdmR0DevHlp_A20IsEnabled: caller=%p/%d:\n", pDevIns, pDevIns->iInstance));
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync bool fEnabled = PGMPhysIsA20Enabled(VMMGetCpu(pDevIns->Internal.s.pVMR0));
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync Log(("pdmR0DevHlp_A20IsEnabled: caller=%p/%d: returns %RTbool\n", pDevIns, pDevIns->iInstance, fEnabled));
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync/** @copydoc PDMDEVHLPR0::pfnVMSetError */
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsyncstatic DECLCALLBACK(int) pdmR0DevHlp_VMSetError(PPDMDEVINS pDevIns, int rc, RT_SRC_POS_DECL, const char *pszFormat, ...)
68ef804c4ec232c58e2c03c8fc6afe3765c5c0d1vboxsync int rc2 = VMSetErrorV(pDevIns->Internal.s.pVMR0, rc, RT_SRC_POS_ARGS, pszFormat, args); Assert(rc2 == rc); NOREF(rc2);
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync/** @copydoc PDMDEVHLPR0::pfnVMSetErrorV */
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsyncstatic DECLCALLBACK(int) pdmR0DevHlp_VMSetErrorV(PPDMDEVINS pDevIns, int rc, RT_SRC_POS_DECL, const char *pszFormat, va_list va)
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync int rc2 = VMSetErrorV(pDevIns->Internal.s.pVMR0, rc, RT_SRC_POS_ARGS, pszFormat, va); Assert(rc2 == rc); NOREF(rc2);
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync/** @copydoc PDMDEVHLPR0::pfnVMSetRuntimeError */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(int) pdmR0DevHlp_VMSetRuntimeError(PPDMDEVINS pDevIns, uint32_t fFlags, const char *pszErrorId, const char *pszFormat, ...)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = VMSetRuntimeErrorV(pDevIns->Internal.s.pVMR0, fFlags, pszErrorId, pszFormat, va);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMDEVHLPR0::pfnVMSetRuntimeErrorV */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(int) pdmR0DevHlp_VMSetRuntimeErrorV(PPDMDEVINS pDevIns, uint32_t fFlags, const char *pszErrorId, const char *pszFormat, va_list va)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = VMSetRuntimeErrorV(pDevIns->Internal.s.pVMR0, fFlags, pszErrorId, pszFormat, va);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMDEVHLPR0::pdmR0DevHlp_PATMSetMMIOPatchInfo*/
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(int) pdmR0DevHlp_PATMSetMMIOPatchInfo(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RTGCPTR pCachedData)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0DevHlp_PATMSetMMIOPatchInfo: caller=%p/%d:\n", pDevIns, pDevIns->iInstance));
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync/* return PATMSetMMIOPatchInfo(pDevIns->Internal.s.pVMR0, GCPhys, pCachedData); */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMDEVHLPR0::pfnGetVM */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(PVM) pdmR0DevHlp_GetVM(PPDMDEVINS pDevIns)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0DevHlp_GetVM: caller='%p'/%d\n", pDevIns, pDevIns->iInstance));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMDEVHLPR0::pfnCanEmulateIoBlock */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(bool) pdmR0DevHlp_CanEmulateIoBlock(PPDMDEVINS pDevIns)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0DevHlp_GetVM: caller='%p'/%d\n", pDevIns, pDevIns->iInstance));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return HWACCMCanEmulateIoBlock(VMMGetCpu(pDevIns->Internal.s.pVMR0));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMDEVHLPR0::pfnGetVMCPU */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(PVMCPU) pdmR0DevHlp_GetVMCPU(PPDMDEVINS pDevIns)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0DevHlp_GetVMCPU: caller='%p'/%d\n", pDevIns, pDevIns->iInstance));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The Ring-0 Device Helper Callbacks.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncextern DECLEXPORT(const PDMDEVHLPR0) g_pdmR0DevHlp =
6b022885f2cb6a55167609edecd89570cd80001dvboxsync/** @name PIC Ring-0 Helpers
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMPICHLPR0::pfnSetInterruptFF */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(void) pdmR0PicHlp_SetInterruptFF(PPDMDEVINS pDevIns)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0PicHlp_SetInterruptFF: caller='%p'/%d: Setting local interrupt on LAPIC\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Raise the LAPIC's LINT0 line instead of signaling the CPU directly. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pVM->pdm.s.Apic.pfnLocalInterruptR0(pVM->pdm.s.Apic.pDevInsR0, 0, 1);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVMCPU pVCpu = &pVM->aCpus[0]; /* for PIC we always deliver to CPU 0, MP use APIC */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0PicHlp_SetInterruptFF: caller=%p/%d: VMCPU_FF_INTERRUPT_PIC %d -> 1\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pDevIns, pDevIns->iInstance, VMCPU_FF_ISSET(pVCpu, VMCPU_FF_INTERRUPT_PIC)));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMPICHLPR0::pfnClearInterruptFF */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(void) pdmR0PicHlp_ClearInterruptFF(PPDMDEVINS pDevIns)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Raise the LAPIC's LINT0 line instead of signaling the CPU directly. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0PicHlp_ClearInterruptFF: caller='%s'/%d: Clearing local interrupt on LAPIC\n",
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync /* Lower the LAPIC's LINT0 line instead of signaling the CPU directly. */
9782b553bdb12385214a3ac596aff1476bcb7cbdvboxsync pVM->pdm.s.Apic.pfnLocalInterruptR0(pVM->pdm.s.Apic.pDevInsR0, 0, 0);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVMCPU pVCpu = &pVM->aCpus[0]; /* for PIC we always deliver to CPU 0, MP use APIC */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0PicHlp_ClearInterruptFF: caller=%p/%d: VMCPU_FF_INTERRUPT_PIC %d -> 0\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pDevIns, pDevIns->iInstance, VMCPU_FF_ISSET(pVCpu, VMCPU_FF_INTERRUPT_PIC)));
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync/** @copydoc PDMPICHLPR0::pfnLock */
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsyncstatic DECLCALLBACK(int) pdmR0PicHlp_Lock(PPDMDEVINS pDevIns, int rc)
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync/** @copydoc PDMPICHLPR0::pfnUnlock */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(void) pdmR0PicHlp_Unlock(PPDMDEVINS pDevIns)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The Ring-0 PIC Helper Callbacks.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncextern DECLEXPORT(const PDMPICHLPR0) g_pdmR0PicHlp =
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @name APIC Ring-0 Helpers
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMAPICHLPR0::pfnSetInterruptFF */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(void) pdmR0ApicHlp_SetInterruptFF(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu)
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync LogFlow(("pdmR0ApicHlp_SetInterruptFF: CPU%d=caller=%p/%d: VM_FF_INTERRUPT %d -> 1 (CPU%d)\n",
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync VMMGetCpuId(pVM), pDevIns, pDevIns->iInstance, VMCPU_FF_ISSET(pVCpu, VMCPU_FF_INTERRUPT_APIC), idCpu));
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync /* We need to wait up the target CPU. */
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync GVMMR0SchedPokeEx(pVM, pVCpu->idCpu, false /* don't take the used lock */);
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync GVMMR0SchedWakeUpEx(pVM, pVCpu->idCpu, false /* don't take the used lock */);
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync break; /* nothing to do in other states. */
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync/** @copydoc PDMAPICHLPR0::pfnClearInterruptFF */
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsyncstatic DECLCALLBACK(void) pdmR0ApicHlp_ClearInterruptFF(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0ApicHlp_ClearInterruptFF: caller=%p/%d: VM_FF_INTERRUPT %d -> 0\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pDevIns, pDevIns->iInstance, VMCPU_FF_ISSET(pVCpu, VMCPU_FF_INTERRUPT_APIC)));
79b07d7ae28b916539c6397e010a5cc05e300551vboxsync /* Note: NMI/SMI can't be cleared. */
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync/** @copydoc PDMAPICHLPR0::pfnChangeFeature */
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsyncstatic DECLCALLBACK(void) pdmR0ApicHlp_ChangeFeature(PPDMDEVINS pDevIns, PDMAPICVERSION enmVersion)
79b07d7ae28b916539c6397e010a5cc05e300551vboxsync LogFlow(("pdmR0ApicHlp_ChangeFeature: caller=%p/%d: version=%d\n", pDevIns, pDevIns->iInstance, (int)enmVersion));
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync CPUMClearGuestCpuIdFeature(pDevIns->Internal.s.pVMR0, CPUMCPUIDFEATURE_APIC);
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync CPUMClearGuestCpuIdFeature(pDevIns->Internal.s.pVMR0, CPUMCPUIDFEATURE_X2APIC);
0e77737b0ba913683e614db11463b31ca67aacbevboxsync CPUMSetGuestCpuIdFeature(pDevIns->Internal.s.pVMR0, CPUMCPUIDFEATURE_APIC);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CPUMClearGuestCpuIdFeature(pDevIns->Internal.s.pVMR0, CPUMCPUIDFEATURE_X2APIC);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync CPUMSetGuestCpuIdFeature(pDevIns->Internal.s.pVMR0, CPUMCPUIDFEATURE_X2APIC);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync CPUMSetGuestCpuIdFeature(pDevIns->Internal.s.pVMR0, CPUMCPUIDFEATURE_APIC);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync AssertMsgFailed(("Unknown APIC version: %d\n", (int)enmVersion));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMAPICHLPR0::pfnLock */
6b022885f2cb6a55167609edecd89570cd80001dvboxsyncstatic DECLCALLBACK(int) pdmR0ApicHlp_Lock(PPDMDEVINS pDevIns, int rc)
e98b0df488a9ec7732b1d5c2e735ce707842e975vboxsync/** @copydoc PDMAPICHLPR0::pfnUnlock */
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsyncstatic DECLCALLBACK(void) pdmR0ApicHlp_Unlock(PPDMDEVINS pDevIns)
6b022885f2cb6a55167609edecd89570cd80001dvboxsync/** @copydoc PDMAPICHLPR0::pfnGetCpuId */
86b687e7808a36be33c43ae58adc8ab22d378feavboxsyncstatic DECLCALLBACK(VMCPUID) pdmR0ApicHlp_GetCpuId(PPDMDEVINS pDevIns)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The Ring-0 APIC Helper Callbacks.
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsyncextern DECLEXPORT(const PDMAPICHLPR0) g_pdmR0ApicHlp =
858aad6160628a88d8a273db0344fc3ba7dcc9abvboxsync/** @name I/O APIC Ring-0 Helpers
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMIOAPICHLPR0::pfnApicBusDeliver */
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsyncstatic DECLCALLBACK(int) pdmR0IoApicHlp_ApicBusDeliver(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode)
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync LogFlow(("pdmR0IoApicHlp_ApicBusDeliver: caller=%p/%d: u8Dest=%RX8 u8DestMode=%RX8 u8DeliveryMode=%RX8 iVector=%RX8 u8Polarity=%RX8 u8TriggerMode=%RX8\n",
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync pDevIns, pDevIns->iInstance, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode));
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync return pVM->pdm.s.Apic.pfnBusDeliverR0(pVM->pdm.s.Apic.pDevInsR0, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode);
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync/** @copydoc PDMIOAPICHLPR0::pfnLock */
6b022885f2cb6a55167609edecd89570cd80001dvboxsyncstatic DECLCALLBACK(int) pdmR0IoApicHlp_Lock(PPDMDEVINS pDevIns, int rc)
6b022885f2cb6a55167609edecd89570cd80001dvboxsync/** @copydoc PDMIOAPICHLPR0::pfnUnlock */
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsyncstatic DECLCALLBACK(void) pdmR0IoApicHlp_Unlock(PPDMDEVINS pDevIns)
440444d68cda7866c59e2e3d3f236608ef1c316fvboxsync * The Ring-0 I/O APIC Helper Callbacks.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncextern DECLEXPORT(const PDMIOAPICHLPR0) g_pdmR0IoApicHlp =
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync/** @name PCI Bus Ring-0 Helpers
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync/** @copydoc PDMPCIHLPR0::pfnIsaSetIrq */
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsyncstatic DECLCALLBACK(void) pdmR0PciHlp_IsaSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel)
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync Log4(("pdmR0PciHlp_IsaSetIrq: iIrq=%d iLevel=%d\n", iIrq, iLevel));
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync pdmR0IsaSetIrq(pDevIns->Internal.s.pVMR0, iIrq, iLevel);
8e8844a522f5d335f177a0313b03067d79cce201vboxsync/** @copydoc PDMPCIHLPR0::pfnIoApicSetIrq */
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsyncstatic DECLCALLBACK(void) pdmR0PciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel)
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync Log4(("pdmR0PciHlp_IoApicSetIrq: iIrq=%d iLevel=%d\n", iIrq, iLevel));
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync pdmR0IoApicSetIrq(pDevIns->Internal.s.pVMR0, iIrq, iLevel);
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync/** @copydoc PDMPCIHLPR0::pfnLock */
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsyncstatic DECLCALLBACK(int) pdmR0PciHlp_Lock(PPDMDEVINS pDevIns, int rc)
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync/** @copydoc PDMPCIHLPR0::pfnUnlock */
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsyncstatic DECLCALLBACK(void) pdmR0PciHlp_Unlock(PPDMDEVINS pDevIns)
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync * The Ring-0 PCI Bus Helper Callbacks.
6b022885f2cb6a55167609edecd89570cd80001dvboxsyncextern DECLEXPORT(const PDMPCIHLPR0) g_pdmR0PciHlp =
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync/** @name HPET Ring-0 Helpers
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync/** @copydoc PDMHPETHLPR0::pfnLock */
7082d29724f6c3788977a51591b0379fd3acbf72vboxsyncstatic DECLCALLBACK(int) pdmR0HpetHlp_Lock(PPDMDEVINS pDevIns, int rc)
f827fea1108b8f8a1a5f63318f6ec3cf4a9e7010vboxsync/** @copydoc PDMHPETHLPR0::pfnUnlock */
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsyncstatic DECLCALLBACK(void) pdmR0HpetHlp_Unlock(PPDMDEVINS pDevIns)
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync * The Ring-0 HPET Helper Callbacks.
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsyncextern DECLEXPORT(const PDMHPETHLPR0) g_pdmR0HpetHlp =
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync * Sets an irq on the I/O APIC.
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync * @param pVM The VM handle.
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync * @param iIrq The irq.
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync * @param iLevel The new level.
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsyncstatic void pdmR0IsaSetIrq(PVM pVM, int iIrq, int iLevel)
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync pVM->pdm.s.Pic.pfnSetIrqR0(pVM->pdm.s.Pic.pDevInsR0, iIrq, iLevel);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync pVM->pdm.s.IoApic.pfnSetIrqR0(pVM->pdm.s.IoApic.pDevInsR0, iIrq, iLevel);
8e8844a522f5d335f177a0313b03067d79cce201vboxsync /* queue for ring-3 execution. */
8e8844a522f5d335f177a0313b03067d79cce201vboxsync PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueR0);
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0);
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync AssertMsgFailed(("We're out of devhlp queue items!!!\n"));
6b022885f2cb6a55167609edecd89570cd80001dvboxsync * Sets an irq on the I/O APIC.
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync * @param pVM The VM handle.
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync * @param iIrq The irq.
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync * @param iLevel The new level.
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsyncstatic void pdmR0IoApicSetIrq(PVM pVM, int iIrq, int iLevel)
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync pVM->pdm.s.IoApic.pfnSetIrqR0(pVM->pdm.s.IoApic.pDevInsR0, iIrq, iLevel);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync /* queue for ring-3 execution. */
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueR0);
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0);
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync AssertMsgFailed(("We're out of devhlp queue items!!!\n"));