VirtualBox

Changeset 19437 in vbox


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
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/pdmdev.h

    r19366 r19437  
    11591159    DECLRCCALLBACKMEMBER(VMCPUID, pfnGetCpuId,(PPDMDEVINS pDevIns));
    11601160
     1161    /**
     1162     * Sends SIPI to given virtual CPU.
     1163     *
     1164     * @param   pDevIns         The APIC device instance.
     1165     * @param   idCpu           Virtual CPU to perform SIPI on
     1166     * @param   iVector         SIPI vector
     1167     */
     1168    DECLRCCALLBACKMEMBER(void,  pfnSendSipi,(PPDMDEVINS pDevIns, VMCPUID idCpu, int iVector));
     1169
    11611170    /** Just a safety precaution. */
    11621171    uint32_t                u32TheEnd;
     
    12271236    DECLR0CALLBACKMEMBER(VMCPUID, pfnGetCpuId,(PPDMDEVINS pDevIns));
    12281237
     1238    /**
     1239     * Sends SIPI to given virtual CPU.
     1240     *
     1241     * @param   pDevIns         The APIC device instance.
     1242     * @param   idCpu           Virtual CPU to perform SIPI on
     1243     * @param   iVector         SIPI vector
     1244     */
     1245    DECLR0CALLBACKMEMBER(void,    pfnSendSipi,(PPDMDEVINS pDevIns, VMCPUID idCpu, int iVector));
     1246
    12291247    /** Just a safety precaution. */
    12301248    uint32_t                u32TheEnd;
     
    12931311     */
    12941312    DECLR3CALLBACKMEMBER(VMCPUID, pfnGetCpuId,(PPDMDEVINS pDevIns));
     1313
     1314    /**
     1315     * Sends SIPI to given virtual CPU.
     1316     *
     1317     * @param   pDevIns         The APIC device instance.
     1318     * @param   idCpu           Virtual CPU to perform SIPI on
     1319     * @param   iVector         SIPI vector
     1320     */
     1321    DECLR3CALLBACKMEMBER(void,    pfnSendSipi,(PPDMDEVINS pDevIns, VMCPUID idCpu, int iVector));
    12951322
    12961323    /**
  • trunk/include/VBox/vmm.h

    r19406 r19437  
    117117VMMDECL(uint32_t)    VMMGetSvnRev(void);
    118118VMMDECL(VMMSWITCHER) VMMGetSwitcher(PVM pVM);
     119VMMDECL(void)        VMMSendSipi(PVM pVM, VMCPUID idCpu, int iVector);
    119120
    120121/** @def VMMIsHwVirtExtForced
  • trunk/src/VBox/Devices/PC/DevAPIC.cpp

    r17968 r19437  
    363363                                                 getCpuFromLapic(dev, s));
    364364}
     365
     366DECLINLINE(void) cpuSendSipi(APICDeviceInfo* dev, APICState *s, int vector)
     367{
     368    Log2(("apic: send SIPI vector=%d\n", vector));
     369    dev->CTX_SUFF(pApicHlp)->pfnSendSipi(dev->CTX_SUFF(pDevIns),
     370                                         getCpuFromLapic(dev, s),
     371                                         vector);
     372}
     373
     374
    365375
    366376DECLINLINE(uint32_t) getApicEnableBits(APICDeviceInfo* dev)
     
    10811091    /** @todo: init CPUs */
    10821092    LogRel(("[SMP] apic_startup: %d on CPUs %d\n", vector_num, s->id));
     1093    cpuSendSipi(dev, s, vector_num);
    10831094#endif
    10841095}
  • 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