PDMR0Device.cpp revision e74eef731a813e4e06680c587a6759b9974b29c9
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* $Id$ */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @file
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * PDM - Pluggable Device and Driver Manager, R0 Device parts.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Copyright (C) 2006-2010 Sun Microsystems, Inc.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
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 *
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
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*******************************************************************************
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync* Header Files *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync*******************************************************************************/
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define LOG_GROUP LOG_GROUP_PDM_DEVICE
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include "PDMInternal.h"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/pdm.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/pgm.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/mm.h>
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync#include <VBox/vm.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/vmm.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/patm.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/hwaccm.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/log.h>
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync#include <VBox/err.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <VBox/gvmm.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/asm.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/assert.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/string.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*******************************************************************************
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync* Global Variables *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync*******************************************************************************/
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRT_C_DECLS_BEGIN
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncextern DECLEXPORT(const PDMDEVHLPR0) g_pdmR0DevHlp;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncextern DECLEXPORT(const PDMPICHLPR0) g_pdmR0PicHlp;
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsyncextern DECLEXPORT(const PDMAPICHLPR0) g_pdmR0ApicHlp;
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsyncextern DECLEXPORT(const PDMIOAPICHLPR0) g_pdmR0IoApicHlp;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncextern DECLEXPORT(const PDMPCIHLPR0) g_pdmR0PciHlp;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncextern DECLEXPORT(const PDMHPETHLPR0) g_pdmR0HpetHlp;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRT_C_DECLS_END
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*******************************************************************************
afed5ab737f4aacfae3fe73776f40e989190a7cavboxsync* Internal Functions *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync*******************************************************************************/
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic void pdmR0IsaSetIrq(PVM pVM, int iIrq, int iLevel);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic void pdmR0IoApicSetIrq(PVM pVM, int iIrq, int iLevel);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @name Ring-0 Device Helpers
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMDEVHLPR0::pfnPCISetIrq */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(void) pdmR0DevHlp_PCISetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0DevHlp_PCISetIrq: caller=%p/%d: iIrq=%d iLevel=%d\n", pDevIns, pDevIns->iInstance, iIrq, iLevel));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVM pVM = pDevIns->Internal.s.pVMR0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PPCIDEVICE pPciDev = pDevIns->Internal.s.pPciDeviceR0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PPDMPCIBUS pPciBus = pDevIns->Internal.s.pPciBusR0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( pPciDev
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && pPciBus
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && pPciBus->pDevInsR0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmLock(pVM);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pPciBus->pfnSetIrqR0(pPciBus->pDevInsR0, pPciDev, iIrq, iLevel);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmUnlock(pVM);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync /* queue for ring-3 execution. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueR0);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pTask)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pTask->enmOp = PDMDEVHLPTASKOP_PCI_SET_IRQ;
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync pTask->pDevInsR3 = PDMDEVINS_2_R3PTR(pDevIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pTask->u.SetIRQ.iIrq = iIrq;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pTask->u.SetIRQ.iLevel = iLevel;
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0);
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync }
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync else
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync AssertMsgFailed(("We're out of devhlp queue items!!!\n"));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0DevHlp_PCISetIrq: caller=%p/%d: returns void\n", pDevIns, pDevIns->iInstance));
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync/** @copydoc PDMDEVHLPR0::pfnPCISetIrq */
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsyncstatic DECLCALLBACK(void) pdmR0DevHlp_ISASetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel)
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync{
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync LogFlow(("pdmR0DevHlp_ISASetIrq: caller=%p/%d: iIrq=%d iLevel=%d\n", pDevIns, pDevIns->iInstance, iIrq, iLevel));
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0IsaSetIrq(pDevIns->Internal.s.pVMR0, iIrq, iLevel);
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0DevHlp_ISASetIrq: caller=%p/%d: returns void\n", pDevIns, pDevIns->iInstance));
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync}
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync/** @copydoc PDMDEVHLPR0::pfnPhysRead */
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsyncstatic DECLCALLBACK(int) pdmR0DevHlp_PhysRead(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, void *pvBuf, size_t cbRead)
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync{
fdea543f71872a3ec3909536a4fce37ab7aa3a8bvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync LogFlow(("pdmR0DevHlp_PhysRead: caller=%p/%d: GCPhys=%RGp pvBuf=%p cbRead=%#x\n",
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync pDevIns, pDevIns->iInstance, GCPhys, pvBuf, cbRead));
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync int rc = PGMPhysRead(pDevIns->Internal.s.pVMR0, GCPhys, pvBuf, cbRead);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertRC(rc); /** @todo track down the users for this bugger. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Log(("pdmR0DevHlp_PhysRead: caller=%p/%d: returns %Rrc\n", pDevIns, pDevIns->iInstance, rc));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync}
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync/** @copydoc PDMDEVHLPR0::pfnPhysWrite */
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsyncstatic DECLCALLBACK(int) pdmR0DevHlp_PhysWrite(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, const void *pvBuf, size_t cbWrite)
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync{
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync LogFlow(("pdmR0DevHlp_PhysWrite: caller=%p/%d: GCPhys=%RGp pvBuf=%p cbWrite=%#x\n",
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync pDevIns, pDevIns->iInstance, GCPhys, pvBuf, cbWrite));
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync int rc = PGMPhysWrite(pDevIns->Internal.s.pVMR0, GCPhys, pvBuf, cbWrite);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync AssertRC(rc); /** @todo track down the users for this bugger. */
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync Log(("pdmR0DevHlp_PhysWrite: caller=%p/%d: returns %Rrc\n", pDevIns, pDevIns->iInstance, rc));
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync return rc;
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync}
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync/** @copydoc PDMDEVHLPR0::pfnA20IsEnabled */
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsyncstatic DECLCALLBACK(bool) pdmR0DevHlp_A20IsEnabled(PPDMDEVINS pDevIns)
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync{
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync LogFlow(("pdmR0DevHlp_A20IsEnabled: caller=%p/%d:\n", pDevIns, pDevIns->iInstance));
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync bool fEnabled = PGMPhysIsA20Enabled(VMMGetCpu(pDevIns->Internal.s.pVMR0));
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync Log(("pdmR0DevHlp_A20IsEnabled: caller=%p/%d: returns %RTbool\n", pDevIns, pDevIns->iInstance, fEnabled));
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync return fEnabled;
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync}
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync/** @copydoc PDMDEVHLPR0::pfnVMSetError */
726fc44ad0bd65a178ad4c3ab46ebd6cd3208e99vboxsyncstatic DECLCALLBACK(int) pdmR0DevHlp_VMSetError(PPDMDEVINS pDevIns, int rc, RT_SRC_POS_DECL, const char *pszFormat, ...)
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync{
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync va_list args;
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync va_start(args, pszFormat);
68ef804c4ec232c58e2c03c8fc6afe3765c5c0d1vboxsync int rc2 = VMSetErrorV(pDevIns->Internal.s.pVMR0, rc, RT_SRC_POS_ARGS, pszFormat, args); Assert(rc2 == rc); NOREF(rc2);
68ef804c4ec232c58e2c03c8fc6afe3765c5c0d1vboxsync va_end(args);
68ef804c4ec232c58e2c03c8fc6afe3765c5c0d1vboxsync return rc;
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync}
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync/** @copydoc PDMDEVHLPR0::pfnVMSetErrorV */
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsyncstatic DECLCALLBACK(int) pdmR0DevHlp_VMSetErrorV(PPDMDEVINS pDevIns, int rc, RT_SRC_POS_DECL, const char *pszFormat, va_list va)
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync{
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync int rc2 = VMSetErrorV(pDevIns->Internal.s.pVMR0, rc, RT_SRC_POS_ARGS, pszFormat, va); Assert(rc2 == rc); NOREF(rc2);
b8aaccdbdd143967110d499670605dd7ff6ecc72vboxsync return rc;
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync}
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync/** @copydoc PDMDEVHLPR0::pfnVMSetRuntimeError */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(int) pdmR0DevHlp_VMSetRuntimeError(PPDMDEVINS pDevIns, uint32_t fFlags, const char *pszErrorId, const char *pszFormat, ...)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync va_list va;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync va_start(va, pszFormat);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = VMSetRuntimeErrorV(pDevIns->Internal.s.pVMR0, fFlags, pszErrorId, pszFormat, va);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync va_end(va);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMDEVHLPR0::pfnVMSetRuntimeErrorV */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(int) pdmR0DevHlp_VMSetRuntimeErrorV(PPDMDEVINS pDevIns, uint32_t fFlags, const char *pszErrorId, const char *pszFormat, va_list va)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = VMSetRuntimeErrorV(pDevIns->Internal.s.pVMR0, fFlags, pszErrorId, pszFormat, va);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMDEVHLPR0::pdmR0DevHlp_PATMSetMMIOPatchInfo*/
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(int) pdmR0DevHlp_PATMSetMMIOPatchInfo(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RTGCPTR pCachedData)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0DevHlp_PATMSetMMIOPatchInfo: caller=%p/%d:\n", pDevIns, pDevIns->iInstance));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertFailed();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync/* return PATMSetMMIOPatchInfo(pDevIns->Internal.s.pVMR0, GCPhys, pCachedData); */
a11c569636fa6838bd423f4631a9660a5a84204bvboxsync return VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMDEVHLPR0::pfnGetVM */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(PVM) pdmR0DevHlp_GetVM(PPDMDEVINS pDevIns)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0DevHlp_GetVM: caller='%p'/%d\n", pDevIns, pDevIns->iInstance));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return pDevIns->Internal.s.pVMR0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMDEVHLPR0::pfnCanEmulateIoBlock */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(bool) pdmR0DevHlp_CanEmulateIoBlock(PPDMDEVINS pDevIns)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
3ecf9412133496b2aeb090cfd33a286404ec59fbvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0DevHlp_GetVM: caller='%p'/%d\n", pDevIns, pDevIns->iInstance));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return HWACCMCanEmulateIoBlock(VMMGetCpu(pDevIns->Internal.s.pVMR0));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMDEVHLPR0::pfnGetVMCPU */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(PVMCPU) pdmR0DevHlp_GetVMCPU(PPDMDEVINS pDevIns)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0DevHlp_GetVMCPU: caller='%p'/%d\n", pDevIns, pDevIns->iInstance));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VMMGetCpu(pDevIns->Internal.s.pVMR0);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The Ring-0 Device Helper Callbacks.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncextern DECLEXPORT(const PDMDEVHLPR0) g_pdmR0DevHlp =
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDM_DEVHLPR0_VERSION,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0DevHlp_PCISetIrq,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0DevHlp_ISASetIrq,
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync pdmR0DevHlp_PhysRead,
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync pdmR0DevHlp_PhysWrite,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0DevHlp_A20IsEnabled,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0DevHlp_VMSetError,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0DevHlp_VMSetErrorV,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0DevHlp_VMSetRuntimeError,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0DevHlp_VMSetRuntimeErrorV,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0DevHlp_PATMSetMMIOPatchInfo,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0DevHlp_GetVM,
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync pdmR0DevHlp_CanEmulateIoBlock,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0DevHlp_GetVMCPU,
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync PDM_DEVHLPR0_VERSION
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync};
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync/** @} */
78a205e3fc6719d59e8c561b3d287d3a4f879852vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync/** @name PIC Ring-0 Helpers
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync * @{
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync */
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMPICHLPR0::pfnSetInterruptFF */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(void) pdmR0PicHlp_SetInterruptFF(PPDMDEVINS pDevIns)
6b022885f2cb6a55167609edecd89570cd80001dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVM pVM = pDevIns->Internal.s.pVMR0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pVM->pdm.s.Apic.pfnLocalInterruptR0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LogFlow(("pdmR0PicHlp_SetInterruptFF: caller='%p'/%d: Setting local interrupt on LAPIC\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pDevIns, pDevIns->iInstance));
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 return;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVMCPU pVCpu = &pVM->aCpus[0]; /* for PIC we always deliver to CPU 0, MP use APIC */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
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
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VMCPU_FF_SET(pVCpu, VMCPU_FF_INTERRUPT_PIC);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMPICHLPR0::pfnClearInterruptFF */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(void) pdmR0PicHlp_ClearInterruptFF(PPDMDEVINS pDevIns)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVM pVM = pDevIns->Internal.s.pVMR0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pVM->pdm.s.Apic.pfnLocalInterruptR0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
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",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pDevIns, pDevIns->iInstance));
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);
8a132edc1577cbe2a19cd778c1b2bea6ae5e8515vboxsync return;
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync }
8a132edc1577cbe2a19cd778c1b2bea6ae5e8515vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVMCPU pVCpu = &pVM->aCpus[0]; /* for PIC we always deliver to CPU 0, MP use APIC */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
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)));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_PIC);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync/** @copydoc PDMPICHLPR0::pfnLock */
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsyncstatic DECLCALLBACK(int) pdmR0PicHlp_Lock(PPDMDEVINS pDevIns, int rc)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return pdmLockEx(pDevIns->Internal.s.pVMR0, rc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync/** @copydoc PDMPICHLPR0::pfnUnlock */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(void) pdmR0PicHlp_Unlock(PPDMDEVINS pDevIns)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmUnlock(pDevIns->Internal.s.pVMR0);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
79b07d7ae28b916539c6397e010a5cc05e300551vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The Ring-0 PIC Helper Callbacks.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncextern DECLEXPORT(const PDMPICHLPR0) g_pdmR0PicHlp =
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDM_PICHLPR0_VERSION,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0PicHlp_SetInterruptFF,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0PicHlp_ClearInterruptFF,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0PicHlp_Lock,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0PicHlp_Unlock,
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync PDM_PICHLPR0_VERSION
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync};
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @} */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @name APIC Ring-0 Helpers
79b07d7ae28b916539c6397e010a5cc05e300551vboxsync * @{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMAPICHLPR0::pfnSetInterruptFF */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(void) pdmR0ApicHlp_SetInterruptFF(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVM pVM = pDevIns->Internal.s.pVMR0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVMCPU pVCpu = &pVM->aCpus[idCpu];
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync AssertReturnVoid(idCpu < pVM->cCpus);
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync
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
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync switch (enmType)
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync {
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync case PDMAPICIRQ_HARDWARE:
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync VMCPU_FF_SET(pVCpu, VMCPU_FF_INTERRUPT_APIC);
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync break;
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync case PDMAPICIRQ_NMI:
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync VMCPU_FF_SET(pVCpu, VMCPU_FF_INTERRUPT_NMI);
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync break;
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync case PDMAPICIRQ_SMI:
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync VMCPU_FF_SET(pVCpu, VMCPU_FF_INTERRUPT_SMI);
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync break;
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync case PDMAPICIRQ_EXTINT:
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync VMCPU_FF_SET(pVCpu, VMCPU_FF_INTERRUPT_PIC);
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync break;
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync default:
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync AssertMsgFailed(("enmType=%d\n", enmType));
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync break;
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync }
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync /* We need to wait up the target CPU. */
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync if (VMMGetCpuId(pVM) != idCpu)
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync {
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync switch (VMCPU_GET_STATE(pVCpu))
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync {
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync case VMCPUSTATE_STARTED_EXEC:
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync GVMMR0SchedPokeEx(pVM, pVCpu->idCpu, false /* don't take the used lock */);
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync break;
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync case VMCPUSTATE_STARTED_HALTED:
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync GVMMR0SchedWakeUpEx(pVM, pVCpu->idCpu, false /* don't take the used lock */);
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync break;
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync default:
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync break; /* nothing to do in other states. */
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync }
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync }
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync}
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync/** @copydoc PDMAPICHLPR0::pfnClearInterruptFF */
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsyncstatic DECLCALLBACK(void) pdmR0ApicHlp_ClearInterruptFF(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu)
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVM pVM = pDevIns->Internal.s.pVMR0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PVMCPU pVCpu = &pVM->aCpus[idCpu];
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync
e52f819639386db020b2a635b47a415248c7fbf9vboxsync AssertReturnVoid(idCpu < pVM->cCpus);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
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)));
e02db9e0d46f862430895b82b10e8ecde075cf11vboxsync
79b07d7ae28b916539c6397e010a5cc05e300551vboxsync /* Note: NMI/SMI can't be cleared. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (enmType)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case PDMAPICIRQ_HARDWARE:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_APIC);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case PDMAPICIRQ_EXTINT:
0e77737b0ba913683e614db11463b31ca67aacbevboxsync VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_PIC);
0e77737b0ba913683e614db11463b31ca67aacbevboxsync break;
0e77737b0ba913683e614db11463b31ca67aacbevboxsync default:
0e77737b0ba913683e614db11463b31ca67aacbevboxsync AssertMsgFailed(("enmType=%d\n", enmType));
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync break;
0e77737b0ba913683e614db11463b31ca67aacbevboxsync }
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync}
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync/** @copydoc PDMAPICHLPR0::pfnChangeFeature */
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsyncstatic DECLCALLBACK(void) pdmR0ApicHlp_ChangeFeature(PPDMDEVINS pDevIns, PDMAPICVERSION enmVersion)
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync{
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
79b07d7ae28b916539c6397e010a5cc05e300551vboxsync LogFlow(("pdmR0ApicHlp_ChangeFeature: caller=%p/%d: version=%d\n", pDevIns, pDevIns->iInstance, (int)enmVersion));
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync switch (enmVersion)
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync {
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync case PDMAPICVERSION_NONE:
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync CPUMClearGuestCpuIdFeature(pDevIns->Internal.s.pVMR0, CPUMCPUIDFEATURE_APIC);
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync CPUMClearGuestCpuIdFeature(pDevIns->Internal.s.pVMR0, CPUMCPUIDFEATURE_X2APIC);
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync break;
0e77737b0ba913683e614db11463b31ca67aacbevboxsync case PDMAPICVERSION_APIC:
0e77737b0ba913683e614db11463b31ca67aacbevboxsync CPUMSetGuestCpuIdFeature(pDevIns->Internal.s.pVMR0, CPUMCPUIDFEATURE_APIC);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CPUMClearGuestCpuIdFeature(pDevIns->Internal.s.pVMR0, CPUMCPUIDFEATURE_X2APIC);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case PDMAPICVERSION_X2APIC:
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync CPUMSetGuestCpuIdFeature(pDevIns->Internal.s.pVMR0, CPUMCPUIDFEATURE_X2APIC);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync CPUMSetGuestCpuIdFeature(pDevIns->Internal.s.pVMR0, CPUMCPUIDFEATURE_APIC);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default:
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync AssertMsgFailed(("Unknown APIC version: %d\n", (int)enmVersion));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @copydoc PDMAPICHLPR0::pfnLock */
6b022885f2cb6a55167609edecd89570cd80001dvboxsyncstatic DECLCALLBACK(int) pdmR0ApicHlp_Lock(PPDMDEVINS pDevIns, int rc)
6b022885f2cb6a55167609edecd89570cd80001dvboxsync{
86b687e7808a36be33c43ae58adc8ab22d378feavboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return pdmLockEx(pDevIns->Internal.s.pVMR0, rc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
e98b0df488a9ec7732b1d5c2e735ce707842e975vboxsync/** @copydoc PDMAPICHLPR0::pfnUnlock */
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsyncstatic DECLCALLBACK(void) pdmR0ApicHlp_Unlock(PPDMDEVINS pDevIns)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmUnlock(pDevIns->Internal.s.pVMR0);
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync/** @copydoc PDMAPICHLPR0::pfnGetCpuId */
86b687e7808a36be33c43ae58adc8ab22d378feavboxsyncstatic DECLCALLBACK(VMCPUID) pdmR0ApicHlp_GetCpuId(PPDMDEVINS pDevIns)
6b022885f2cb6a55167609edecd89570cd80001dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VMMGetCpuId(pDevIns->Internal.s.pVMR0);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The Ring-0 APIC Helper Callbacks.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsyncextern DECLEXPORT(const PDMAPICHLPR0) g_pdmR0ApicHlp =
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDM_APICHLPR0_VERSION,
6b022885f2cb6a55167609edecd89570cd80001dvboxsync pdmR0ApicHlp_SetInterruptFF,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0ApicHlp_ClearInterruptFF,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0ApicHlp_ChangeFeature,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0ApicHlp_Lock,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0ApicHlp_Unlock,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0ApicHlp_GetCpuId,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PDM_APICHLPR0_VERSION
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync};
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @} */
858aad6160628a88d8a273db0344fc3ba7dcc9abvboxsync
65eb75d34c65a45c0945358715253950d63e440cvboxsync
65eb75d34c65a45c0945358715253950d63e440cvboxsync
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync
858aad6160628a88d8a273db0344fc3ba7dcc9abvboxsync/** @name I/O APIC Ring-0 Helpers
858aad6160628a88d8a273db0344fc3ba7dcc9abvboxsync * @{
858aad6160628a88d8a273db0344fc3ba7dcc9abvboxsync */
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync
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)
6b022885f2cb6a55167609edecd89570cd80001dvboxsync{
6b022885f2cb6a55167609edecd89570cd80001dvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync PVM pVM = pDevIns->Internal.s.pVMR0;
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));
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync Assert(pVM->pdm.s.Apic.pDevInsR0);
a6936eab59adc5624216e6e5e5e455fc6a40df7fvboxsync if (pVM->pdm.s.Apic.pfnBusDeliverR0)
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync return pVM->pdm.s.Apic.pfnBusDeliverR0(pVM->pdm.s.Apic.pDevInsR0, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode);
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync return VINF_SUCCESS;
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync}
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync/** @copydoc PDMIOAPICHLPR0::pfnLock */
6b022885f2cb6a55167609edecd89570cd80001dvboxsyncstatic DECLCALLBACK(int) pdmR0IoApicHlp_Lock(PPDMDEVINS pDevIns, int rc)
6b022885f2cb6a55167609edecd89570cd80001dvboxsync{
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync return pdmLockEx(pDevIns->Internal.s.pVMR0, rc);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync/** @copydoc PDMIOAPICHLPR0::pfnUnlock */
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsyncstatic DECLCALLBACK(void) pdmR0IoApicHlp_Unlock(PPDMDEVINS pDevIns)
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync{
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync pdmUnlock(pDevIns->Internal.s.pVMR0);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync/**
440444d68cda7866c59e2e3d3f236608ef1c316fvboxsync * The Ring-0 I/O APIC Helper Callbacks.
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncextern DECLEXPORT(const PDMIOAPICHLPR0) g_pdmR0IoApicHlp =
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync PDM_IOAPICHLPR0_VERSION,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pdmR0IoApicHlp_ApicBusDeliver,
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync pdmR0IoApicHlp_Lock,
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync pdmR0IoApicHlp_Unlock,
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync PDM_IOAPICHLPR0_VERSION
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync};
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync/** @} */
6b022885f2cb6a55167609edecd89570cd80001dvboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync
86b687e7808a36be33c43ae58adc8ab22d378feavboxsync
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync/** @name PCI Bus Ring-0 Helpers
03319aeaef07ef63a404237f2cb56199131f4a03vboxsync * @{
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync */
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync/** @copydoc PDMPCIHLPR0::pfnIsaSetIrq */
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsyncstatic DECLCALLBACK(void) pdmR0PciHlp_IsaSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel)
03319aeaef07ef63a404237f2cb56199131f4a03vboxsync{
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync Log4(("pdmR0PciHlp_IsaSetIrq: iIrq=%d iLevel=%d\n", iIrq, iLevel));
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync pdmR0IsaSetIrq(pDevIns->Internal.s.pVMR0, iIrq, iLevel);
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync}
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync
8e8844a522f5d335f177a0313b03067d79cce201vboxsync/** @copydoc PDMPCIHLPR0::pfnIoApicSetIrq */
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsyncstatic DECLCALLBACK(void) pdmR0PciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel)
8e8844a522f5d335f177a0313b03067d79cce201vboxsync{
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync Log4(("pdmR0PciHlp_IoApicSetIrq: iIrq=%d iLevel=%d\n", iIrq, iLevel));
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync pdmR0IoApicSetIrq(pDevIns->Internal.s.pVMR0, iIrq, iLevel);
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync}
03319aeaef07ef63a404237f2cb56199131f4a03vboxsync
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync/** @copydoc PDMPCIHLPR0::pfnLock */
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsyncstatic DECLCALLBACK(int) pdmR0PciHlp_Lock(PPDMDEVINS pDevIns, int rc)
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync{
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync return pdmLockEx(pDevIns->Internal.s.pVMR0, rc);
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync}
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync/** @copydoc PDMPCIHLPR0::pfnUnlock */
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsyncstatic DECLCALLBACK(void) pdmR0PciHlp_Unlock(PPDMDEVINS pDevIns)
6b022885f2cb6a55167609edecd89570cd80001dvboxsync{
6b022885f2cb6a55167609edecd89570cd80001dvboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
86b687e7808a36be33c43ae58adc8ab22d378feavboxsync pdmUnlock(pDevIns->Internal.s.pVMR0);
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync}
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
03319aeaef07ef63a404237f2cb56199131f4a03vboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync/**
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync * The Ring-0 PCI Bus Helper Callbacks.
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync */
6b022885f2cb6a55167609edecd89570cd80001dvboxsyncextern DECLEXPORT(const PDMPCIHLPR0) g_pdmR0PciHlp =
8e8844a522f5d335f177a0313b03067d79cce201vboxsync{
9a12d720d4db6c26d09600ddab781ad8df5e1826vboxsync PDM_PCIHLPR0_VERSION,
8e8844a522f5d335f177a0313b03067d79cce201vboxsync pdmR0PciHlp_IsaSetIrq,
9a12d720d4db6c26d09600ddab781ad8df5e1826vboxsync pdmR0PciHlp_IoApicSetIrq,
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync pdmR0PciHlp_Lock,
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync pdmR0PciHlp_Unlock,
03319aeaef07ef63a404237f2cb56199131f4a03vboxsync PDM_PCIHLPR0_VERSION, /* the end */
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync};
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync/** @} */
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync/** @name HPET Ring-0 Helpers
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync * @{
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync */
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync/** @copydoc PDMHPETHLPR0::pfnLock */
7082d29724f6c3788977a51591b0379fd3acbf72vboxsyncstatic DECLCALLBACK(int) pdmR0HpetHlp_Lock(PPDMDEVINS pDevIns, int rc)
7082d29724f6c3788977a51591b0379fd3acbf72vboxsync{
7082d29724f6c3788977a51591b0379fd3acbf72vboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync return pdmLockEx(pDevIns->Internal.s.pVMR0, rc);
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync}
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync
f827fea1108b8f8a1a5f63318f6ec3cf4a9e7010vboxsync/** @copydoc PDMHPETHLPR0::pfnUnlock */
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsyncstatic DECLCALLBACK(void) pdmR0HpetHlp_Unlock(PPDMDEVINS pDevIns)
6b022885f2cb6a55167609edecd89570cd80001dvboxsync{
86b687e7808a36be33c43ae58adc8ab22d378feavboxsync PDMDEV_ASSERT_DEVINS(pDevIns);
6b022885f2cb6a55167609edecd89570cd80001dvboxsync pdmUnlock(pDevIns->Internal.s.pVMR0);
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync}
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync/**
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync * The Ring-0 HPET Helper Callbacks.
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync */
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsyncextern DECLEXPORT(const PDMHPETHLPR0) g_pdmR0HpetHlp =
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync{
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync PDM_HPETHLPR0_VERSION,
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync pdmR0HpetHlp_Lock,
f827fea1108b8f8a1a5f63318f6ec3cf4a9e7010vboxsync pdmR0HpetHlp_Unlock,
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync PDM_HPETHLPR0_VERSION, /* the end */
6b022885f2cb6a55167609edecd89570cd80001dvboxsync};
86b687e7808a36be33c43ae58adc8ab22d378feavboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync/** @} */
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync/**
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync * Sets an irq on the I/O APIC.
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync *
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync * @param pVM The VM handle.
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync * @param iIrq The irq.
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync * @param iLevel The new level.
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync */
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsyncstatic void pdmR0IsaSetIrq(PVM pVM, int iIrq, int iLevel)
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync{
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync if ( ( pVM->pdm.s.IoApic.pDevInsR0
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync || !pVM->pdm.s.IoApic.pDevInsR3)
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync && ( pVM->pdm.s.Pic.pDevInsR0
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync || !pVM->pdm.s.Pic.pDevInsR3))
6b022885f2cb6a55167609edecd89570cd80001dvboxsync {
6b022885f2cb6a55167609edecd89570cd80001dvboxsync pdmLock(pVM);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync if (pVM->pdm.s.Pic.pDevInsR0)
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync pVM->pdm.s.Pic.pfnSetIrqR0(pVM->pdm.s.Pic.pDevInsR0, iIrq, iLevel);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync if (pVM->pdm.s.IoApic.pDevInsR0)
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync pVM->pdm.s.IoApic.pfnSetIrqR0(pVM->pdm.s.IoApic.pDevInsR0, iIrq, iLevel);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync pdmUnlock(pVM);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync }
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync else
6b022885f2cb6a55167609edecd89570cd80001dvboxsync {
8e8844a522f5d335f177a0313b03067d79cce201vboxsync /* queue for ring-3 execution. */
8e8844a522f5d335f177a0313b03067d79cce201vboxsync PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueR0);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync if (pTask)
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync {
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync pTask->enmOp = PDMDEVHLPTASKOP_ISA_SET_IRQ;
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync pTask->u.SetIRQ.iIrq = iIrq;
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync pTask->u.SetIRQ.iLevel = iLevel;
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync }
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync else
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync AssertMsgFailed(("We're out of devhlp queue items!!!\n"));
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync }
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync}
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
6b022885f2cb6a55167609edecd89570cd80001dvboxsync/**
6b022885f2cb6a55167609edecd89570cd80001dvboxsync * Sets an irq on the I/O APIC.
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync *
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync * @param pVM The VM handle.
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync * @param iIrq The irq.
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync * @param iLevel The new level.
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync */
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsyncstatic void pdmR0IoApicSetIrq(PVM pVM, int iIrq, int iLevel)
6b022885f2cb6a55167609edecd89570cd80001dvboxsync{
8e8844a522f5d335f177a0313b03067d79cce201vboxsync if (pVM->pdm.s.IoApic.pDevInsR0)
8e8844a522f5d335f177a0313b03067d79cce201vboxsync {
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync pdmLock(pVM);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync pVM->pdm.s.IoApic.pfnSetIrqR0(pVM->pdm.s.IoApic.pDevInsR0, iIrq, iLevel);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync pdmUnlock(pVM);
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync }
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync else if (pVM->pdm.s.IoApic.pDevInsR3)
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync {
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync /* queue for ring-3 execution. */
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueR0);
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync if (pTask)
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync {
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync pTask->enmOp = PDMDEVHLPTASKOP_IOAPIC_SET_IRQ;
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync pTask->u.SetIRQ.iIrq = iIrq;
6b022885f2cb6a55167609edecd89570cd80001dvboxsync pTask->u.SetIRQ.iLevel = iLevel;
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync
da936e0446fb2b56b813d5d938f1dfc6e4bf8b13vboxsync PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0);
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync }
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync else
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync AssertMsgFailed(("We're out of devhlp queue items!!!\n"));
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync }
6b022885f2cb6a55167609edecd89570cd80001dvboxsync}
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync