VirtualBox

Changeset 19437 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
May 6, 2009 2:34:05 PM (16 years ago)
Author:
vboxsync
Message:

SMP: send SIPI notification from APIC, let VM handle what really do

Location:
trunk/src/VBox/VMM
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/PDMDevMiscHlp.cpp

    r19400 r19437  
    230230}
    231231
     232/** @copydoc PDMAPICHLPR3::pfnSendSipi */
     233static DECLCALLBACK(void) pdmR3ApicHlp_SendSipi(PPDMDEVINS pDevIns, VMCPUID idCpu, int iVector)
     234{
     235    PDMDEV_ASSERT_DEVINS(pDevIns);
     236    VM_ASSERT_EMT(pDevIns->Internal.s.pVMR3);
     237
     238    PVM pVM = pDevIns->Internal.s.pVMR3;
     239    PVMCPU pCpu = VMMGetCpuById(pVM, idCpu);
     240    CPUMSetGuestCS(pCpu, iVector * 0x100);
     241    CPUMSetGuestEIP(pCpu, 0);
     242    /** @todo: how do I unhalt VCPU? */
     243}
    232244
    233245/** @copydoc PDMAPICHLPR3::pfnGetRCHelpers */
     
    273285    pdmR3ApicHlp_Unlock,
    274286    pdmR3ApicHlp_GetCpuId,
     287    pdmR3ApicHlp_SendSipi,
    275288    pdmR3ApicHlp_GetRCHelpers,
    276289    pdmR3ApicHlp_GetR0Helpers,
  • trunk/src/VBox/VMM/VMMAll/VMMAll.cpp

    r19434 r19437  
    7373}
    7474
     75
     76/**
     77 * Sends SIPI to the virtual CPU by setting CS:EIP into vector-dependent state
     78 * and unhalting processor
     79 *
     80 * @param   pVM         The VM to operate on.
     81 * @param   idCpu       Virtual CPU to perform SIPI on
     82 * @param   iVector     SIPI vector
     83 */
     84VMMDECL(void) VMMSendSipi(PVM pVM, VMCPUID idCpu, int iVector)
     85{
     86    PVMCPU pCpu = VMMGetCpuById(pVM, idCpu);
     87    CPUMSetGuestCS(pCpu, iVector * 0x100);
     88    CPUMSetGuestEIP(pCpu, 0);
     89    /** @todo: how do I unhalt VCPU? */
     90}
    7591
    7692/**
  • trunk/src/VBox/VMM/VMMGC/PDMGCDevice.cpp

    r19141 r19437  
    9292static DECLCALLBACK(void) pdmRCApicHlp_Unlock(PPDMDEVINS pDevIns);
    9393static DECLCALLBACK(VMCPUID) pdmRCApicHlp_GetCpuId(PPDMDEVINS pDevIns);
     94static DECLCALLBACK(void) pdmRCApicHlp_SendSipi(PPDMDEVINS pDevIns, VMCPUID idCpu, int iVector);
    9495/** @} */
    9596
     
    167168    pdmRCApicHlp_Unlock,
    168169    pdmRCApicHlp_GetCpuId,
     170    pdmRCApicHlp_SendSipi,
    169171    PDM_APICHLPRC_VERSION
    170172};
     
    487489    PDMDEV_ASSERT_DEVINS(pDevIns);
    488490    return VMMGetCpuId(pDevIns->Internal.s.pVMRC);
     491}
     492
     493/** @copydoc PDMAPICHLPR3::pfnSendSipi */
     494static DECLCALLBACK(void) pdmRCApicHlp_SendSipi(PPDMDEVINS pDevIns, VMCPUID idCpu, int iVector)
     495{
     496    /* we shall never send a SIPI in raw mode */
     497    AssertFailed();
    489498}
    490499
  • trunk/src/VBox/VMM/VMMR0/PDMR0Device.cpp

    r19141 r19437  
    9494static DECLCALLBACK(void) pdmR0ApicHlp_Unlock(PPDMDEVINS pDevIns);
    9595static DECLCALLBACK(VMCPUID) pdmR0ApicHlp_GetCpuId(PPDMDEVINS pDevIns);
     96static DECLCALLBACK(void) pdmR0ApicHlp_SendSipi(PPDMDEVINS pDevIns, VMCPUID idCpu, int iVector);
    9697/** @} */
    9798
     
    170171    pdmR0ApicHlp_Unlock,
    171172    pdmR0ApicHlp_GetCpuId,
     173    pdmR0ApicHlp_SendSipi,
    172174    PDM_APICHLPR0_VERSION
    173175};
     
    503505}
    504506
     507/** @copydoc PDMAPICHLPR0::pfnSendSipi */
     508static DECLCALLBACK(void) pdmR0ApicHlp_SendSipi(PPDMDEVINS pDevIns, VMCPUID idCpu, int iVector)
     509{
     510    PDMDEV_ASSERT_DEVINS(pDevIns);
     511    return VMMSendSipi(pDevIns->Internal.s.pVMR0, idCpu, iVector);
     512}
    505513
    506514/** @copydoc PDMIOAPICHLPR0::pfnApicBusDeliver */
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