VirtualBox

vbox的更動 12617 路徑 trunk/src/VBox/Devices/PC


忽略:
時間撮記:
2008-9-20 下午05:18:44 (16 年 以前)
作者:
vboxsync
訊息:

removed buggy relocation code

檔案:
修改 1 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/Devices/PC/DevAPIC.cpp

    r12616 r12617  
    6262/** @def IOAPIC_UNLOCK
    6363 * Releases the PDM lock. This is a NOP if locking is disabled. */
    64 #define APIC_LOCK(pThis, rc) \
    65     do { \
     64#define APIC_LOCK(pThis, rc)                                            \
     65    do {                                                                \
    6666        int rc2 = (pThis)->CTX_SUFF(pApicHlp)->pfnLock((pThis)->CTX_SUFF(pDevIns), rc); \
    67         if (rc2 != VINF_SUCCESS) \
    68             return rc2; \
     67        if (rc2 != VINF_SUCCESS)                                        \
     68            return rc2;                                                 \
    6969    } while (0)
    70 #define APIC_UNLOCK(pThis) \
     70#define APIC_LOCK_VOID(pThis, rc)                                       \
     71    do {                                                                \
     72        int rc2 = (pThis)->CTX_SUFF(pApicHlp)->pfnLock((pThis)->CTX_SUFF(pDevIns), rc); \
     73        if (rc2 != VINF_SUCCESS)                                        \
     74            return;                                                     \
     75    } while (0)
     76#define APIC_UNLOCK(pThis)                                              \
    7177    (pThis)->CTX_SUFF(pApicHlp)->pfnUnlock((pThis)->CTX_SUFF(pDevIns))
    7278#define IOAPIC_LOCK(pThis, rc) \
     
    447453    APICState *s = getLapic(dev);
    448454    Log(("cpu_set_apic_base: %016RX64\n", val));
    449 
     455   
     456    /** @todo: do we need to lock here ? */
     457    /* APIC_LOCK_VOID(dev, VERR_INTERNAL_ERROR); */
    450458    /** @todo If this change is valid immediately, then we should change the MMIO registration! */
    451459    s->apicbase = (val & 0xfffff000) |
     
    460468        dev->CTX_SUFF(pApicHlp)->pfnChangeFeature(pDevIns, false);
    461469    }
     470    /* APIC_UNLOCK(dev); */
    462471}
    463472#endif  /* VBOX */
     
    648657        return false;
    649658    APICState *s = getLapic(dev);
    650 
     659   
     660    /*
     661     * All our callbacks now come from single IOAPIC, thus locking
     662     * seems to be excessive now (@todo: check)
     663     */
    651664    irrv = get_highest_priority_int(s->irr);
    652665    if (irrv < 0)
     
    654667
    655668    ppr = apic_get_ppr_zero_tpr(s);
     669
    656670    if (ppr && (irrv & 0xf0) <= (ppr & 0xf0))
    657671        return false;
     
    871885}
    872886
    873 #ifndef VBOX
    874 int apic_get_interrupt(CPUState *env)
    875 {
    876     APICState *s = env->apic_state;
    877 #else /* VBOX */
     887
    878888PDMBOTHCBDECL(int) apicGetInterrupt(PPDMDEVINS pDevIns)
    879889{
    880890    APICDeviceInfo *dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    881     APICState *s = getLapic(dev);
    882 #endif /* VBOX */
    883     int intno;
    884 
    885891    /* if the APIC is not installed or enabled, we let the 8259 handle the
    886892       IRQs */
    887     if (!s) {
     893    if (!dev)
     894    {
    888895        Log(("apic_get_interrupt: returns -1 (!s)\n"));
    889896        return -1;
    890897    }
     898
     899    APIC_LOCK(dev, VERR_INTERNAL_ERROR);
     900
     901    APICState *s = getLapic(dev);
     902    int intno;
     903
    891904    if (!(s->spurious_vec & APIC_SV_ENABLE)) {
    892905        Log(("apic_get_interrupt: returns -1 (APIC_SV_ENABLE)\n"));
     
    908921    apic_update_irq(dev, s);
    909922    LogFlow(("apic_get_interrupt: returns %d\n", intno));
     923    APIC_UNLOCK(dev);
    910924    return intno;
    911925}
     
    975989    APICDeviceInfo *dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    976990    APICState *s = getLapic(dev);
    977     dev->pApicHlpR3->pfnLock(pDevIns, VERR_INTERNAL_ERROR);
     991
     992    APIC_LOCK_VOID(dev, VERR_INTERNAL_ERROR);
    978993#endif /* VBOX */
    979994
     
    17721787    APICState *s = getLapic(dev);
    17731788
    1774     dev->pApicHlpR3->pfnLock(pDevIns, VERR_INTERNAL_ERROR);
     1789    APIC_LOCK_VOID(dev, VERR_INTERNAL_ERROR);
    17751790
    17761791    TMTimerStop(s->CTX_SUFF(pTimer));
     
    17941809{
    17951810    APICDeviceInfo *dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    1796    
     1811#ifdef VBOX_WITH_SMP_GUESTS
     1812    LogRel(("[SMP]: relocate apic on %llx\n", offDelta));   
     1813#endif
    17971814    dev->pDevInsRC  = PDMDEVINS_2_RCPTR(pDevIns);
    17981815    dev->pApicHlpRC = dev->pApicHlpR3->pfnGetRCHelpers(pDevIns);
    1799     /** @todo: check if relocated pLapicsRC right */
    1800     dev->pLapicsRC  = MMHyperR3ToR0(PDMDevHlpGetVM(pDevIns), dev->pLapicsR3);
     1816    /** @todo: write pLapicsRC relocation right */
     1817#if 0
     1818    if (dev->pLapicsRC)
     1819        dev->pLapicsRC  = MMHyperR3ToR0(PDMDevHlpGetVM(pDevIns), dev->pLapicsR3);
     1820#endif
    18011821    foreach_apic(dev, 0xffffffff,
    18021822                 apic->pTimerRC = TMTimerRCPtr(apic->CTX_SUFF(pTimer)));
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette