VirtualBox

Changeset 44515 in vbox for trunk/src/VBox/Devices/PC


Ignore:
Timestamp:
Feb 1, 2013 2:52:32 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
83554
Message:

DevAPIC.cpp: Some cleanups.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/DevAPIC.cpp

    r44509 r44515  
    22/** @file
    33 * Advanced Programmable Interrupt Controller (APIC) Device.
     4 *
     5 * @remarks This code does not use pThis, it uses pDev and pApic due to the
     6 *          non-standard arrangements of the APICs wrt PDM.
    47 */
    58
     
    105108/** @def APIC_AND_TM_LOCK
    106109 * Acquires the virtual sync clock lock as well as the PDM lock. */
    107 #define APIC_AND_TM_LOCK(a_pDev, a_pAcpi, rcBusy) \
     110#define APIC_AND_TM_LOCK(a_pDev, a_pApic, rcBusy) \
    108111    do { \
    109         int rc2 = TMTimerLock((a_pAcpi)->CTX_SUFF(pTimer), (rcBusy)); \
     112        int rc2 = TMTimerLock((a_pApic)->CTX_SUFF(pTimer), (rcBusy)); \
    110113        if (rc2 != VINF_SUCCESS) \
    111114            return rc2; \
     
    113116        if (rc2 != VINF_SUCCESS) \
    114117        { \
    115             TMTimerUnlock((a_pAcpi)->CTX_SUFF(pTimer)); \
     118            TMTimerUnlock((a_pApic)->CTX_SUFF(pTimer)); \
    116119            return rc2; \
    117120        } \
     
    120123/** @def APIC_AND_TM_UNLOCK
    121124 * Releases the PDM lock as well as the TM virtual sync clock lock.  */
    122 #define APIC_AND_TM_UNLOCK(a_pDev, a_pAcpi) \
     125#define APIC_AND_TM_UNLOCK(a_pDev, a_pApic) \
    123126    do { \
    124         TMTimerUnlock((a_pAcpi)->CTX_SUFF(pTimer)); \
     127        TMTimerUnlock((a_pApic)->CTX_SUFF(pTimer)); \
    125128        PDMCritSectLeave((a_pDev)->CTX_SUFF(pCritSect)); \
    126129    } while (0)
     
    171174#define APIC_MAX_PATCH_ATTEMPTS         100
    172175
    173 typedef uint32_t PhysApicId;
    174 typedef uint32_t LogApicId;
    175 
    176176
    177177/*******************************************************************************
    178178*   Structures and Typedefs                                                    *
    179179*******************************************************************************/
     180typedef uint32_t PhysApicId;
     181typedef uint32_t LogApicId;
     182
    180183typedef struct APIC256BITREG
    181184{
     
    262265
    263266
     267/**
     268 * The state of one APIC.
     269 *
     270 * @remarks This is generally pointed to by a parameter or variable named pApic.
     271 */
    264272typedef struct APICState
    265273{
    266     uint32_t apicbase;
     274    /** In service register (ISR). */
     275    APIC256BITREG           isr;
     276    /** Trigger mode register (TMR). */
     277    APIC256BITREG           tmr;
     278    /** Interrupt request register (IIR). */
     279    APIC256BITREG           irr;
     280    uint32_t                lvt[APIC_LVT_NB];
     281    uint32_t                apicbase;
    267282    /* Task priority register (interrupt level) */
    268     uint32_t   tpr;
     283    uint32_t                tpr;
    269284    /* Logical APIC id - user programmable */
    270     LogApicId  id;
     285    LogApicId               id;
    271286    /* Physical APIC id - not visible to user, constant */
    272     PhysApicId phys_id;
     287    PhysApicId              phys_id;
    273288    /** @todo: is it logical or physical? Not really used anyway now. */
    274     PhysApicId arb_id;
    275     uint32_t spurious_vec;
    276     uint8_t log_dest;
    277     uint8_t dest_mode;
    278     APIC256BITREG isr;  /**< in service register */
    279     APIC256BITREG tmr;  /**< trigger mode register */
    280     APIC256BITREG irr;  /**< interrupt request register */
    281     uint32_t lvt[APIC_LVT_NB];
    282     uint32_t esr; /* error register */
    283     uint32_t icr[2];
    284     uint32_t divide_conf;
    285     int count_shift;
    286     uint32_t initial_count;
    287     uint32_t Alignment0;
     289    PhysApicId              arb_id;
     290    uint32_t                spurious_vec;
     291    uint8_t                 log_dest;
     292    uint8_t                 dest_mode;
     293    uint32_t                esr; /* error register */
     294    uint32_t                icr[2];
     295    uint32_t                divide_conf;
     296    int                     count_shift;
     297    uint32_t                initial_count;
     298    uint32_t                Alignment0;
    288299
    289300    /** The time stamp of the initial_count load, i.e. when it was started. */
     
    334345# endif
    335346
     347/**
     348 * The wrapper device for the all the APICs.
     349 *
     350 * @remarks This is generally pointed to by a parameter or variable named pDev.
     351 */
    336352typedef struct
    337353{
     
    393409*   Internal Functions                                                         *
    394410*******************************************************************************/
    395 static void apic_update_tpr(APICDeviceInfo *pDev, APICState* s, uint32_t val);
    396 
    397 static void apic_eoi(APICDeviceInfo *pDev, APICState* s); /*  */
    398 static PVMCPUSET apic_get_delivery_bitmask(APICDeviceInfo* pDev, uint8_t dest, uint8_t dest_mode, PVMCPUSET pDstSet);
    399 static int apic_deliver(APICDeviceInfo* pDev, APICState *s,
     411static void apic_update_tpr(APICDeviceInfo *pDev, APICState *pApic, uint32_t val);
     412
     413static void apic_eoi(APICDeviceInfo *pDev, APICState *pApic); /*  */
     414static PVMCPUSET apic_get_delivery_bitmask(APICDeviceInfo *pDev, uint8_t dest, uint8_t dest_mode, PVMCPUSET pDstSet);
     415static int apic_deliver(APICDeviceInfo *pDev, APICState *pApic,
    400416                        uint8_t dest, uint8_t dest_mode,
    401417                        uint8_t delivery_mode, uint8_t vector_num,
    402418                        uint8_t polarity, uint8_t trigger_mode);
    403 static int apic_get_arb_pri(APICState const *s);
    404 static int apic_get_ppr(APICState const *s);
    405 static uint32_t apic_get_current_count(APICDeviceInfo const *pDev, APICState const *s);
    406 static void apicTimerSetInitialCount(APICDeviceInfo *pDev, APICState *s, uint32_t initial_count);
     419static int apic_get_arb_pri(APICState const *pApic);
     420static int apic_get_ppr(APICState const *pApic);
     421static uint32_t apic_get_current_count(APICDeviceInfo const *pDev, APICState const *pApic);
     422static void apicTimerSetInitialCount(APICDeviceInfo *pDev, APICState *pApic, uint32_t initial_count);
    407423static void apicTimerSetLvt(APICDeviceInfo *pDev, APICState *pApic, uint32_t fNew);
    408 static void apicSendInitIpi(APICDeviceInfo* pDev, APICState *s);
    409 
    410 static void apic_init_ipi(APICDeviceInfo* pDev, APICState *s);
    411 static void apic_set_irq(APICDeviceInfo* pDev, APICState *s, int vector_num, int trigger_mode, uint32_t uTagSrc);
    412 static bool apic_update_irq(APICDeviceInfo* pDev, APICState *s);
    413 
    414 
    415 DECLINLINE(APICState*) getLapicById(APICDeviceInfo *pDev, VMCPUID id)
     424static void apicSendInitIpi(APICDeviceInfo *pDev, APICState *pApic);
     425
     426static void apicR3InitIpi(APICDeviceInfo *pDev, APICState *pApic);
     427static void apic_set_irq(APICDeviceInfo *pDev, APICState *pApic, int vector_num, int trigger_mode, uint32_t uTagSrc);
     428static bool apic_update_irq(APICDeviceInfo *pDev, APICState *pApic);
     429
     430
     431DECLINLINE(APICState *) apicGetStateById(APICDeviceInfo *pDev, VMCPUID id)
    416432{
    417433    AssertFatalMsg(id < pDev->cCpus, ("CPU id %d out of range\n", id));
     
    419435}
    420436
    421 DECLINLINE(APICState*) getLapic(APICDeviceInfo* pDev)
     437/**
     438 * Get the APIC state for the calling EMT.
     439 */
     440DECLINLINE(APICState *) apicGetStateByCurEmt(APICDeviceInfo *pDev)
    422441{
    423442    /* LAPIC's array is indexed by CPU id */
    424443    VMCPUID id = pDev->CTX_SUFF(pApicHlp)->pfnGetCpuId(pDev->CTX_SUFF(pDevIns));
    425     return getLapicById(pDev, id);
    426 }
    427 
    428 DECLINLINE(VMCPUID) getCpuFromLapic(APICDeviceInfo* pDev, APICState *s)
     444    return apicGetStateById(pDev, id);
     445}
     446
     447DECLINLINE(VMCPUID) getCpuFromLapic(APICDeviceInfo *pDev, APICState *pApic)
    429448{
    430449    /* for now we assume LAPIC physical id == CPU id */
    431     return (VMCPUID)s->phys_id;
    432 }
    433 
    434 DECLINLINE(void) cpuSetInterrupt(APICDeviceInfo* pDev, APICState *s, PDMAPICIRQ enmType = PDMAPICIRQ_HARDWARE)
    435 {
    436     LogFlow(("apic: setting interrupt flag for cpu %d\n", getCpuFromLapic(pDev, s)));
     450    return (VMCPUID)pApic->phys_id;
     451}
     452
     453DECLINLINE(void) apicCpuSetInterrupt(APICDeviceInfo *pDev, APICState *pApic, PDMAPICIRQ enmType = PDMAPICIRQ_HARDWARE)
     454{
     455    LogFlow(("apic: setting interrupt flag for cpu %d\n", getCpuFromLapic(pDev, pApic)));
    437456    pDev->CTX_SUFF(pApicHlp)->pfnSetInterruptFF(pDev->CTX_SUFF(pDevIns), enmType,
    438                                                 getCpuFromLapic(pDev, s));
    439 }
    440 
    441 DECLINLINE(void) cpuClearInterrupt(APICDeviceInfo* pDev, APICState *s, PDMAPICIRQ enmType = PDMAPICIRQ_HARDWARE)
     457                                                getCpuFromLapic(pDev, pApic));
     458}
     459
     460DECLINLINE(void) apicCpuClearInterrupt(APICDeviceInfo *pDev, APICState *pApic, PDMAPICIRQ enmType = PDMAPICIRQ_HARDWARE)
    442461{
    443462    LogFlow(("apic: clear interrupt flag\n"));
    444463    pDev->CTX_SUFF(pApicHlp)->pfnClearInterruptFF(pDev->CTX_SUFF(pDevIns), enmType,
    445                                                   getCpuFromLapic(pDev, s));
     464                                                  getCpuFromLapic(pDev, pApic));
    446465}
    447466
    448467# ifdef IN_RING3
    449468
    450 DECLINLINE(void) cpuSendSipi(APICDeviceInfo* pDev, APICState *s, int vector)
     469DECLINLINE(void) apicR3CpuSendSipi(APICDeviceInfo *pDev, APICState *pApic, int vector)
    451470{
    452471    Log2(("apic: send SIPI vector=%d\n", vector));
    453472
    454473    pDev->pApicHlpR3->pfnSendSipi(pDev->pDevInsR3,
    455                                   getCpuFromLapic(pDev, s),
     474                                  getCpuFromLapic(pDev, pApic),
    456475                                  vector);
    457476}
    458477
    459 DECLINLINE(void) cpuSendInitIpi(APICDeviceInfo* pDev, APICState *s)
     478DECLINLINE(void) apicR3CpuSendInitIpi(APICDeviceInfo *pDev, APICState *pApic)
    460479{
    461480    Log2(("apic: send init IPI\n"));
    462481
    463482    pDev->pApicHlpR3->pfnSendInitIpi(pDev->pDevInsR3,
    464                                     getCpuFromLapic(pDev, s));
     483                                    getCpuFromLapic(pDev, pApic));
    465484}
    466485
    467486# endif /* IN_RING3 */
    468487
    469 DECLINLINE(uint32_t) getApicEnableBits(APICDeviceInfo* pDev)
     488DECLINLINE(uint32_t) getApicEnableBits(APICDeviceInfo *pDev)
    470489{
    471490    switch (pDev->enmVersion)
     
    500519}
    501520
    502 static int apic_bus_deliver(APICDeviceInfo* pDev,
     521static int apic_bus_deliver(APICDeviceInfo *pDev,
    503522                            PCVMCPUSET pDstSet, uint8_t delivery_mode,
    504523                            uint8_t vector_num, uint8_t polarity,
     
    515534            if (idDstCpu != NIL_VMCPUID)
    516535            {
    517                 APICState *pApic = getLapicById(pDev, idDstCpu);
     536                APICState *pApic = apicGetStateById(pDev, idDstCpu);
    518537                apic_set_irq(pDev, pApic, vector_num, trigger_mode, uTagSrc);
    519538            }
     
    527546        case APIC_DM_SMI:
    528547            APIC_FOREACH_IN_SET_BEGIN(pDev, pDstSet);
    529                 cpuSetInterrupt(pDev, pCurApic, PDMAPICIRQ_SMI);
     548                apicCpuSetInterrupt(pDev, pCurApic, PDMAPICIRQ_SMI);
    530549            APIC_FOREACH_END();
    531550            return VINF_SUCCESS;
     
    533552        case APIC_DM_NMI:
    534553            APIC_FOREACH_IN_SET_BEGIN(pDev, pDstSet);
    535                 cpuSetInterrupt(pDev, pCurApic, PDMAPICIRQ_NMI);
     554                apicCpuSetInterrupt(pDev, pCurApic, PDMAPICIRQ_NMI);
    536555            APIC_FOREACH_END();
    537556            return VINF_SUCCESS;
     
    568587    APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    569588    Assert(PDMCritSectIsOwner(pDev->CTX_SUFF(pCritSect)));
    570     APICState *s = getLapicById(pDev, idCpu);
     589    APICState *pApic = apicGetStateById(pDev, idCpu);
    571590    Log(("apicSetBase: %016RX64\n", val));
    572591
     
    575594    /** @todo If this change is valid immediately, then we should change the MMIO registration! */
    576595    /* We cannot change if this CPU is BSP or not by writing to MSR - it's hardwired */
    577     PDMAPICVERSION oldMode = getApicMode(s);
    578     s->apicbase =
    579             (val & 0xfffff000) | /* base */
    580             (val & getApicEnableBits(pDev)) | /* mode */
    581             (s->apicbase & MSR_IA32_APICBASE_BSP) /* keep BSP bit */;
    582     PDMAPICVERSION newMode = getApicMode(s);
     596    PDMAPICVERSION oldMode = getApicMode(pApic);
     597    pApic->apicbase = (val & 0xfffff000)                        /* base */
     598                    | (val & getApicEnableBits(pDev))           /* mode */
     599                    | (pApic->apicbase & MSR_IA32_APICBASE_BSP) /* keep BSP bit */;
     600    PDMAPICVERSION newMode = getApicMode(pApic);
    583601
    584602    if (oldMode != newMode)
     
    588606            case PDMAPICVERSION_NONE:
    589607            {
    590                 s->spurious_vec &= ~APIC_SV_ENABLE;
     608                pApic->spurious_vec &= ~APIC_SV_ENABLE;
    591609                /* Clear any pending APIC interrupt action flag. */
    592                 cpuClearInterrupt(pDev, s);
     610                apicCpuClearInterrupt(pDev, pApic);
    593611                /** @todo: why do we do that? */
    594612                pDev->CTX_SUFF(pApicHlp)->pfnChangeFeature(pDevIns, PDMAPICVERSION_NONE);
     
    612630    APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    613631    Assert(PDMCritSectIsOwner(pDev->CTX_SUFF(pCritSect)));
    614     APICState *s = getLapicById(pDev, idCpu);
    615     LogFlow(("apicGetBase: %016llx\n", (uint64_t)s->apicbase));
    616     return s->apicbase;
     632    APICState *pApic = apicGetStateById(pDev, idCpu);
     633    LogFlow(("apicGetBase: %016llx\n", (uint64_t)pApic->apicbase));
     634    return pApic->apicbase;
    617635}
    618636
     
    621639    APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    622640    Assert(PDMCritSectIsOwner(pDev->CTX_SUFF(pCritSect)));
    623     APICState *s = getLapicById(pDev, idCpu);
    624     LogFlow(("apicSetTPR: val=%#x (trp %#x -> %#x)\n", val, s->tpr, val));
    625     apic_update_tpr(pDev, s, val);
     641    APICState *pApic = apicGetStateById(pDev, idCpu);
     642    LogFlow(("apicSetTPR: val=%#x (trp %#x -> %#x)\n", val, pApic->tpr, val));
     643    apic_update_tpr(pDev, pApic, val);
    626644}
    627645
     
    630648    /* We don't perform any locking here as that would cause a lot of contention for VT-x/AMD-V. */
    631649    APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    632     APICState *s = getLapicById(pDev, idCpu);
    633     Log2(("apicGetTPR: returns %#x\n", s->tpr));
    634     return s->tpr;
     650    APICState *pApic = apicGetStateById(pDev, idCpu);
     651    Log2(("apicGetTPR: returns %#x\n", pApic->tpr));
     652    return pApic->tpr;
    635653}
    636654
     
    10231041        return VERR_EM_INTERPRETER; /** @todo tell the caller to raise hell (\#GP(0)).  */
    10241042
    1025     APICState      *pApic = getLapicById(pDev, idCpu);
     1043    APICState      *pApic = apicGetStateById(pDev, idCpu);
    10261044    uint32_t        iReg = (u32Reg - MSR_IA32_X2APIC_START) & 0xff;
    10271045    return apicWriteRegister(pDev, pApic, iReg, u64Value, VINF_SUCCESS /*rcBusy*/, true /*fMsr*/);
     
    10391057        return VERR_EM_INTERPRETER;
    10401058
    1041     APICState      *pApic = getLapicById(pDev, idCpu);
     1059    APICState      *pApic = apicGetStateById(pDev, idCpu);
    10421060    uint32_t        iReg = (u32Reg - MSR_IA32_X2APIC_START) & 0xff;
    10431061    return apicReadRegister(pDev, pApic, iReg, pu64Value, VINF_SUCCESS /*rcBusy*/, true /*fMsr*/);
     
    10671085PDMBOTHCBDECL(int) apicLocalInterrupt(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level)
    10681086{
    1069     APICDeviceInfo  *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    1070     APICState       *s = getLapicById(pDev, 0);
     1087    APICDeviceInfo  *pDev  = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
     1088    APICState       *pApic = apicGetStateById(pDev, 0);
    10711089
    10721090    Assert(PDMCritSectIsOwner(pDev->CTX_SUFF(pCritSect)));
     
    10741092
    10751093    /* If LAPIC is disabled, go straight to the CPU. */
    1076     if (!(s->spurious_vec & APIC_SV_ENABLE))
     1094    if (!(pApic->spurious_vec & APIC_SV_ENABLE))
    10771095    {
    10781096        LogFlow(("apicLocalInterrupt: LAPIC disabled, delivering directly to CPU core.\n"));
    10791097        if (u8Level)
    1080             cpuSetInterrupt(pDev, s, PDMAPICIRQ_EXTINT);
     1098            apicCpuSetInterrupt(pDev, pApic, PDMAPICIRQ_EXTINT);
    10811099        else
    1082             cpuClearInterrupt(pDev, s, PDMAPICIRQ_EXTINT);
     1100            apicCpuClearInterrupt(pDev, pApic, PDMAPICIRQ_EXTINT);
    10831101
    10841102        return VINF_SUCCESS;
     
    10941112     * no more than one CPU has the interrupt unmasked.
    10951113     */
    1096     uint32_t    u32Lvec;
    1097 
    1098     u32Lvec = s->lvt[APIC_LVT_LINT0 + u8Pin];   /* Fetch corresponding LVT entry. */
     1114    uint32_t u32Lvec;
     1115
     1116    u32Lvec = pApic->lvt[APIC_LVT_LINT0 + u8Pin];   /* Fetch corresponding LVT entry. */
    10991117    /* Drop int if entry is masked. May not be correct for level-triggered interrupts. */
    11001118    if (!(u32Lvec & APIC_LVT_MASKED))
     
    11111129                LogFlow(("apicLocalInterrupt: %s ExtINT interrupt\n", u8Level ? "setting" : "clearing"));
    11121130                if (u8Level)
    1113                     cpuSetInterrupt(pDev, s, enmType);
     1131                    apicCpuSetInterrupt(pDev, pApic, enmType);
    11141132                else
    1115                     cpuClearInterrupt(pDev, s, enmType);
     1133                    apicCpuClearInterrupt(pDev, pApic, enmType);
    11161134                return VINF_SUCCESS;
    11171135            case APIC_DM_NMI:
     
    11461164        }
    11471165        LogFlow(("apicLocalInterrupt: setting local interrupt type %d\n", enmType));
    1148         cpuSetInterrupt(pDev, s, enmType);
     1166        apicCpuSetInterrupt(pDev, pApic, enmType);
    11491167    }
    11501168    return VINF_SUCCESS;
    11511169}
    11521170
    1153 static int apic_get_ppr(APICState const *s)
     1171static int apic_get_ppr(APICState const *pApic)
    11541172{
    11551173    int ppr;
    11561174
    1157     int tpr = (s->tpr >> 4);
    1158     int isrv = Apic256BitReg_FindLastSetBit(&s->isr, 0);
     1175    int tpr = (pApic->tpr >> 4);
     1176    int isrv = Apic256BitReg_FindLastSetBit(&pApic->isr, 0);
    11591177    isrv >>= 4;
    11601178    if (tpr >= isrv)
    1161         ppr = s->tpr;
     1179        ppr = pApic->tpr;
    11621180    else
    11631181        ppr = isrv << 4;
     
    11651183}
    11661184
    1167 static int apic_get_ppr_zero_tpr(APICState *s)
    1168 {
    1169     return Apic256BitReg_FindLastSetBit(&s->isr, 0);
    1170 }
    1171 
    1172 static int apic_get_arb_pri(APICState const *s)
     1185static int apic_get_ppr_zero_tpr(APICState *pApic)
     1186{
     1187    return Apic256BitReg_FindLastSetBit(&pApic->isr, 0);
     1188}
     1189
     1190static int apic_get_arb_pri(APICState const *pApic)
    11731191{
    11741192    /** @todo XXX: arbitration */
     
    11771195
    11781196/* signal the CPU if an irq is pending */
    1179 static bool apic_update_irq(APICDeviceInfo *pDev, APICState* s)
    1180 {
    1181     if (!(s->spurious_vec & APIC_SV_ENABLE))
     1197static bool apic_update_irq(APICDeviceInfo *pDev, APICState *pApic)
     1198{
     1199    if (!(pApic->spurious_vec & APIC_SV_ENABLE))
    11821200    {
    11831201        /* Clear any pending APIC interrupt action flag. */
    1184         cpuClearInterrupt(pDev, s);
     1202        apicCpuClearInterrupt(pDev, pApic);
    11851203        return false;
    11861204    }
    11871205
    1188     int irrv = Apic256BitReg_FindLastSetBit(&s->irr, -1);
     1206    int irrv = Apic256BitReg_FindLastSetBit(&pApic->irr, -1);
    11891207    if (irrv < 0)
    11901208        return false;
    1191     int ppr = apic_get_ppr(s);
     1209    int ppr = apic_get_ppr(pApic);
    11921210    if (ppr && (irrv & 0xf0) <= (ppr & 0xf0))
    11931211        return false;
    1194     cpuSetInterrupt(pDev, s);
     1212    apicCpuSetInterrupt(pDev, pApic);
    11951213    return true;
    11961214}
     
    12051223    /* We don't perform any locking here as that would cause a lot of contention for VT-x/AMD-V. */
    12061224
    1207     APICState *s = getLapicById(pDev, idCpu);
     1225    APICState *pApic = apicGetStateById(pDev, idCpu);
    12081226
    12091227    /*
     
    12121230     */
    12131231    /** @todo check excessive locking whatever... */
    1214     int irrv = Apic256BitReg_FindLastSetBit(&s->irr, -1);
     1232    int irrv = Apic256BitReg_FindLastSetBit(&pApic->irr, -1);
    12151233    if (irrv < 0)
    12161234        return false;
    12171235
    1218     int ppr = apic_get_ppr_zero_tpr(s);
     1236    int ppr = apic_get_ppr_zero_tpr(pApic);
    12191237
    12201238    if (ppr && (irrv & 0xf0) <= (ppr & 0xf0))
     
    12241242}
    12251243
    1226 static void apic_update_tpr(APICDeviceInfo *pDev, APICState* s, uint32_t val)
     1244static void apic_update_tpr(APICDeviceInfo *pDev, APICState *pApic, uint32_t val)
    12271245{
    12281246    bool fIrqIsActive = false;
    12291247    bool fIrqWasActive = false;
    12301248
    1231     fIrqWasActive = apic_update_irq(pDev, s);
    1232     s->tpr        = val;
    1233     fIrqIsActive  = apic_update_irq(pDev, s);
     1249    fIrqWasActive = apic_update_irq(pDev, pApic);
     1250    pApic->tpr    = val;
     1251    fIrqIsActive  = apic_update_irq(pDev, pApic);
    12341252
    12351253    /* If an interrupt is pending and now masked, then clear the FF flag. */
     
    12381256        Log(("apic_update_tpr: deactivate interrupt that was masked by the TPR update (%x)\n", val));
    12391257        STAM_COUNTER_INC(&pDev->StatClearedActiveIrq);
    1240         cpuClearInterrupt(pDev, s);
    1241     }
    1242 }
    1243 
    1244 static void apic_set_irq(APICDeviceInfo *pDev,  APICState* s, int vector_num, int trigger_mode, uint32_t uTagSrc)
    1245 {
    1246     LogFlow(("CPU%d: apic_set_irq vector=%x trigger_mode=%x uTagSrc=%#x\n", s->phys_id, vector_num, trigger_mode, uTagSrc));
    1247 
    1248     Apic256BitReg_SetBit(&s->irr, vector_num);
     1258        apicCpuClearInterrupt(pDev, pApic);
     1259    }
     1260}
     1261
     1262static void apic_set_irq(APICDeviceInfo *pDev,  APICState *pApic, int vector_num, int trigger_mode, uint32_t uTagSrc)
     1263{
     1264    LogFlow(("CPU%d: apic_set_irq vector=%x trigger_mode=%x uTagSrc=%#x\n", pApic->phys_id, vector_num, trigger_mode, uTagSrc));
     1265
     1266    Apic256BitReg_SetBit(&pApic->irr, vector_num);
    12491267    if (trigger_mode)
    1250         Apic256BitReg_SetBit(&s->tmr, vector_num);
     1268        Apic256BitReg_SetBit(&pApic->tmr, vector_num);
    12511269    else
    1252         Apic256BitReg_ClearBit(&s->tmr, vector_num);
    1253 
    1254     if (!s->auTags[vector_num])
    1255         s->auTags[vector_num] = uTagSrc;
     1270        Apic256BitReg_ClearBit(&pApic->tmr, vector_num);
     1271
     1272    if (!pApic->auTags[vector_num])
     1273        pApic->auTags[vector_num] = uTagSrc;
    12561274    else
    1257         s->auTags[vector_num] |= RT_BIT_32(31);
    1258 
    1259     apic_update_irq(pDev, s);
    1260 }
    1261 
    1262 static void apic_eoi(APICDeviceInfo *pDev, APICState* s)
    1263 {
    1264     int isrv = Apic256BitReg_FindLastSetBit(&s->isr, -1);
     1275        pApic->auTags[vector_num] |= RT_BIT_32(31);
     1276
     1277    apic_update_irq(pDev, pApic);
     1278}
     1279
     1280static void apic_eoi(APICDeviceInfo *pDev, APICState *pApic)
     1281{
     1282    int isrv = Apic256BitReg_FindLastSetBit(&pApic->isr, -1);
    12651283    if (isrv < 0)
    12661284        return;
    1267     Apic256BitReg_ClearBit(&s->isr, isrv);
    1268     LogFlow(("CPU%d: apic_eoi isrv=%x\n", s->phys_id, isrv));
     1285    Apic256BitReg_ClearBit(&pApic->isr, isrv);
     1286    LogFlow(("CPU%d: apic_eoi isrv=%x\n", pApic->phys_id, isrv));
    12691287    /** @todo XXX: send the EOI packet to the APIC bus to allow the I/O APIC to
    12701288     *             set the remote IRR bit for level triggered interrupts. */
    1271     apic_update_irq(pDev, s);
     1289    apic_update_irq(pDev, pApic);
    12721290}
    12731291
     
    13051323
    13061324#ifdef IN_RING3
    1307 static void apic_init_ipi(APICDeviceInfo* pDev, APICState *s)
     1325
     1326static void apicR3InitIpi(APICDeviceInfo *pDev, APICState *pApic)
    13081327{
    13091328    int i;
    13101329
    13111330    for(i = 0; i < APIC_LVT_NB; i++)
    1312         s->lvt[i] = 1 << 16; /* mask LVT */
    1313     s->tpr = 0;
    1314     s->spurious_vec = 0xff;
    1315     s->log_dest = 0;
    1316     s->dest_mode = 0xff; /** @todo 0xff???? */
    1317     Apic256BitReg_Empty(&s->isr);
    1318     Apic256BitReg_Empty(&s->tmr);
    1319     Apic256BitReg_Empty(&s->irr);
    1320     s->esr = 0;
    1321     memset(s->icr, 0, sizeof(s->icr));
    1322     s->divide_conf = 0;
    1323     s->count_shift = 1;
    1324     s->initial_count = 0;
    1325     s->initial_count_load_time = 0;
    1326     s->next_time = 0;
    1327 }
    1328 
    1329 
    1330 static void apicSendInitIpi(APICDeviceInfo* pDev, APICState *s)
    1331 {
    1332     apic_init_ipi(pDev, s);
    1333     cpuSendInitIpi(pDev, s);
     1331        pApic->lvt[i] = 1 << 16; /* mask LVT */
     1332    pApic->tpr = 0;
     1333    pApic->spurious_vec = 0xff;
     1334    pApic->log_dest = 0;
     1335    pApic->dest_mode = 0xff; /** @todo 0xff???? */
     1336    Apic256BitReg_Empty(&pApic->isr);
     1337    Apic256BitReg_Empty(&pApic->tmr);
     1338    Apic256BitReg_Empty(&pApic->irr);
     1339    pApic->esr = 0;
     1340    memset(pApic->icr, 0, sizeof(pApic->icr));
     1341    pApic->divide_conf = 0;
     1342    pApic->count_shift = 1;
     1343    pApic->initial_count = 0;
     1344    pApic->initial_count_load_time = 0;
     1345    pApic->next_time = 0;
     1346}
     1347
     1348
     1349static void apicSendInitIpi(APICDeviceInfo *pDev, APICState *pApic)
     1350{
     1351    apicR3InitIpi(pDev, pApic);
     1352    apicR3CpuSendInitIpi(pDev, pApic);
    13341353}
    13351354
    13361355/* send a SIPI message to the CPU to start it */
    1337 static void apic_startup(APICDeviceInfo* pDev, APICState *s, int vector_num)
    1338 {
    1339     Log(("[SMP] apic_startup: %d on CPUs %d\n", vector_num, s->phys_id));
    1340     cpuSendSipi(pDev, s, vector_num);
    1341 }
     1356static void apicR3Startup(APICDeviceInfo *pDev, APICState *pApic, int vector_num)
     1357{
     1358    Log(("[SMP] apicR3Startup: %d on CPUs %d\n", vector_num, pApic->phys_id));
     1359    apicR3CpuSendSipi(pDev, pApic, vector_num);
     1360}
     1361
    13421362#endif /* IN_RING3 */
    13431363
    1344 static int  apic_deliver(APICDeviceInfo *pDev, APICState *s,
     1364static int  apic_deliver(APICDeviceInfo *pDev, APICState *pApic,
    13451365                         uint8_t dest, uint8_t dest_mode,
    13461366                         uint8_t delivery_mode, uint8_t vector_num,
    13471367                         uint8_t polarity, uint8_t trigger_mode)
    13481368{
    1349     int dest_shorthand = (s->icr[0] >> 18) & 3;
     1369    int dest_shorthand = (pApic->icr[0] >> 18) & 3;
    13501370    LogFlow(("apic_deliver dest=%x dest_mode=%x dest_shorthand=%x delivery_mode=%x vector_num=%x polarity=%x trigger_mode=%x uTagSrc=%#x\n", dest, dest_mode, dest_shorthand, delivery_mode, vector_num, polarity, trigger_mode));
    13511371
     
    13581378        case 1:
    13591379            VMCPUSET_EMPTY(&DstSet);
    1360             VMCPUSET_ADD(&DstSet, s->id);
     1380            VMCPUSET_ADD(&DstSet, pApic->id);
    13611381            break;
    13621382        case 2:
     
    13651385        case 3:
    13661386            VMCPUSET_FILL(&DstSet);
    1367             VMCPUSET_DEL(&DstSet, s->id);
     1387            VMCPUSET_DEL(&DstSet, pApic->id);
    13681388            break;
    13691389    }
     
    13731393        case APIC_DM_INIT:
    13741394        {
    1375             uint32_t const trig_mode = (s->icr[0] >> 15) & 1;
    1376             uint32_t const level     = (s->icr[0] >> 14) & 1;
     1395            uint32_t const trig_mode = (pApic->icr[0] >> 15) & 1;
     1396            uint32_t const level     = (pApic->icr[0] >> 14) & 1;
    13771397            if (level == 0 && trig_mode == 1)
    13781398            {
     
    13801400                    pCurApic->arb_id = pCurApic->id;
    13811401                APIC_FOREACH_END();
    1382                 Log(("CPU%d: APIC_DM_INIT arbitration id(s) set\n", s->phys_id));
     1402                Log(("CPU%d: APIC_DM_INIT arbitration id(s) set\n", pApic->phys_id));
    13831403                return VINF_SUCCESS;
    13841404            }
     
    13891409# ifdef IN_RING3
    13901410            APIC_FOREACH_IN_SET_BEGIN(pDev, &DstSet);
    1391                 apic_startup(pDev, pCurApic, vector_num);
     1411                apicR3Startup(pDev, pCurApic, vector_num);
    13921412            APIC_FOREACH_END();
    13931413            return VINF_SUCCESS;
     
    14081428{
    14091429    APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    1410     /* if the APIC is not installed or enabled, we let the 8259 handle the
    1411        IRQs */
     1430    /* if the APIC is not installed or enabled, we let the 8259 handle the IRQs */
    14121431    if (!pDev)
    14131432    {
    1414         Log(("apic_get_interrupt: returns -1 (!s)\n"));
     1433        Log(("apic_get_interrupt: returns -1 (!pDev)\n"));
    14151434        return -1;
    14161435    }
     
    14181437    Assert(PDMCritSectIsOwner(pDev->CTX_SUFF(pCritSect)));
    14191438
    1420     APICState *s = getLapicById(pDev, idCpu);
    1421 
    1422     if (!(s->spurious_vec & APIC_SV_ENABLE))
    1423     {
    1424         Log(("CPU%d: apic_get_interrupt: returns -1 (APIC_SV_ENABLE)\n", s->phys_id));
     1439    APICState *pApic = apicGetStateById(pDev, idCpu);
     1440
     1441    if (!(pApic->spurious_vec & APIC_SV_ENABLE))
     1442    {
     1443        Log(("CPU%d: apic_get_interrupt: returns -1 (APIC_SV_ENABLE)\n", pApic->phys_id));
    14251444        return -1;
    14261445    }
    14271446
    14281447    /** @todo XXX: spurious IRQ handling */
    1429     int intno = Apic256BitReg_FindLastSetBit(&s->irr, -1);
     1448    int intno = Apic256BitReg_FindLastSetBit(&pApic->irr, -1);
    14301449    if (intno < 0)
    14311450    {
    1432         Log(("CPU%d: apic_get_interrupt: returns -1 (irr)\n", s->phys_id));
     1451        Log(("CPU%d: apic_get_interrupt: returns -1 (irr)\n", pApic->phys_id));
    14331452        return -1;
    14341453    }
    14351454
    1436     if (s->tpr && (uint32_t)intno <= s->tpr)
     1455    if (pApic->tpr && (uint32_t)intno <= pApic->tpr)
    14371456    {
    14381457        *puTagSrc = 0;
    1439         Log(("apic_get_interrupt: returns %d (sp)\n", s->spurious_vec & 0xff));
    1440         return s->spurious_vec & 0xff;
    1441     }
    1442 
    1443     Apic256BitReg_ClearBit(&s->irr, intno);
    1444     Apic256BitReg_SetBit(&s->isr, intno);
    1445 
    1446     *puTagSrc = s->auTags[intno];
    1447     s->auTags[intno] = 0;
    1448 
    1449     apic_update_irq(pDev, s);
    1450 
    1451     LogFlow(("CPU%d: apic_get_interrupt: returns %d / %#x\n", s->phys_id, intno, *puTagSrc));
     1458        Log(("apic_get_interrupt: returns %d (sp)\n", pApic->spurious_vec & 0xff));
     1459        return pApic->spurious_vec & 0xff;
     1460    }
     1461
     1462    Apic256BitReg_ClearBit(&pApic->irr, intno);
     1463    Apic256BitReg_SetBit(&pApic->isr, intno);
     1464
     1465    *puTagSrc = pApic->auTags[intno];
     1466    pApic->auTags[intno] = 0;
     1467
     1468    apic_update_irq(pDev, pApic);
     1469
     1470    LogFlow(("CPU%d: apic_get_interrupt: returns %d / %#x\n", pApic->phys_id, intno, *puTagSrc));
    14521471    return intno;
    14531472}
     
    16491668
    16501669# ifdef IN_RING3
     1670
    16511671/**
    16521672 * Timer callback function.
     
    16591679{
    16601680    APICDeviceInfo *pDev   = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    1661     APICState      *pApic = (APICState *)pvUser;
     1681    APICState      *pApic  = (APICState *)pvUser;
    16621682    Assert(pApic->pTimerR3 == pTimer);
    16631683    Assert(pApic->fTimerArmed);
     
    16921712static void apic_save(SSMHANDLE* f, void *opaque)
    16931713{
    1694     APICState *s = (APICState*)opaque;
     1714    APICState *pApic = (APICState*)opaque;
    16951715    int i;
    16961716
    1697     SSMR3PutU32(f, s->apicbase);
    1698     SSMR3PutU32(f, s->id);
    1699     SSMR3PutU32(f, s->phys_id);
    1700     SSMR3PutU32(f, s->arb_id);
    1701     SSMR3PutU32(f, s->tpr);
    1702     SSMR3PutU32(f, s->spurious_vec);
    1703     SSMR3PutU8(f,  s->log_dest);
    1704     SSMR3PutU8(f,  s->dest_mode);
     1717    SSMR3PutU32(f, pApic->apicbase);
     1718    SSMR3PutU32(f, pApic->id);
     1719    SSMR3PutU32(f, pApic->phys_id);
     1720    SSMR3PutU32(f, pApic->arb_id);
     1721    SSMR3PutU32(f, pApic->tpr);
     1722    SSMR3PutU32(f, pApic->spurious_vec);
     1723    SSMR3PutU8(f,  pApic->log_dest);
     1724    SSMR3PutU8(f,  pApic->dest_mode);
    17051725    for (i = 0; i < 8; i++) {
    1706         SSMR3PutU32(f, s->isr.au32Bitmap[i]);
    1707         SSMR3PutU32(f, s->tmr.au32Bitmap[i]);
    1708         SSMR3PutU32(f, s->irr.au32Bitmap[i]);
     1726        SSMR3PutU32(f, pApic->isr.au32Bitmap[i]);
     1727        SSMR3PutU32(f, pApic->tmr.au32Bitmap[i]);
     1728        SSMR3PutU32(f, pApic->irr.au32Bitmap[i]);
    17091729    }
    17101730    for (i = 0; i < APIC_LVT_NB; i++) {
    1711         SSMR3PutU32(f, s->lvt[i]);
    1712     }
    1713     SSMR3PutU32(f, s->esr);
    1714     SSMR3PutU32(f, s->icr[0]);
    1715     SSMR3PutU32(f, s->icr[1]);
    1716     SSMR3PutU32(f, s->divide_conf);
    1717     SSMR3PutU32(f, s->count_shift);
    1718     SSMR3PutU32(f, s->initial_count);
    1719     SSMR3PutU64(f, s->initial_count_load_time);
    1720     SSMR3PutU64(f, s->next_time);
    1721 
    1722     TMR3TimerSave(s->CTX_SUFF(pTimer), f);
     1731        SSMR3PutU32(f, pApic->lvt[i]);
     1732    }
     1733    SSMR3PutU32(f, pApic->esr);
     1734    SSMR3PutU32(f, pApic->icr[0]);
     1735    SSMR3PutU32(f, pApic->icr[1]);
     1736    SSMR3PutU32(f, pApic->divide_conf);
     1737    SSMR3PutU32(f, pApic->count_shift);
     1738    SSMR3PutU32(f, pApic->initial_count);
     1739    SSMR3PutU64(f, pApic->initial_count_load_time);
     1740    SSMR3PutU64(f, pApic->next_time);
     1741
     1742    TMR3TimerSave(pApic->CTX_SUFF(pTimer), f);
    17231743}
    17241744
    17251745static int apic_load(SSMHANDLE *f, void *opaque, int version_id)
    17261746{
    1727     APICState *s = (APICState*)opaque;
     1747    APICState *pApic = (APICState*)opaque;
    17281748    int i;
    17291749
    17301750    /** @todo XXX: what if the base changes? (registered memory regions) */
    1731     SSMR3GetU32(f, &s->apicbase);
     1751    SSMR3GetU32(f, &pApic->apicbase);
    17321752
    17331753    switch (version_id)
     
    17371757            uint8_t val = 0;
    17381758            SSMR3GetU8(f, &val);
    1739             s->id = val;
     1759            pApic->id = val;
    17401760            /* UP only in old saved states */
    1741             s->phys_id = 0;
     1761            pApic->phys_id = 0;
    17421762            SSMR3GetU8(f, &val);
    1743             s->arb_id = val;
     1763            pApic->arb_id = val;
    17441764            break;
    17451765        }
    17461766        case APIC_SAVED_STATE_VERSION:
    17471767        case APIC_SAVED_STATE_VERSION_VBOX_30:
    1748             SSMR3GetU32(f, &s->id);
    1749             SSMR3GetU32(f, &s->phys_id);
    1750             SSMR3GetU32(f, &s->arb_id);
     1768            SSMR3GetU32(f, &pApic->id);
     1769            SSMR3GetU32(f, &pApic->phys_id);
     1770            SSMR3GetU32(f, &pApic->arb_id);
    17511771            break;
    17521772        default:
    17531773            return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
    17541774    }
    1755     SSMR3GetU32(f, &s->tpr);
    1756     SSMR3GetU32(f, &s->spurious_vec);
    1757     SSMR3GetU8(f, &s->log_dest);
    1758     SSMR3GetU8(f, &s->dest_mode);
     1775    SSMR3GetU32(f, &pApic->tpr);
     1776    SSMR3GetU32(f, &pApic->spurious_vec);
     1777    SSMR3GetU8(f, &pApic->log_dest);
     1778    SSMR3GetU8(f, &pApic->dest_mode);
    17591779    for (i = 0; i < 8; i++) {
    1760         SSMR3GetU32(f, &s->isr.au32Bitmap[i]);
    1761         SSMR3GetU32(f, &s->tmr.au32Bitmap[i]);
    1762         SSMR3GetU32(f, &s->irr.au32Bitmap[i]);
     1780        SSMR3GetU32(f, &pApic->isr.au32Bitmap[i]);
     1781        SSMR3GetU32(f, &pApic->tmr.au32Bitmap[i]);
     1782        SSMR3GetU32(f, &pApic->irr.au32Bitmap[i]);
    17631783    }
    17641784    for (i = 0; i < APIC_LVT_NB; i++) {
    1765         SSMR3GetU32(f, &s->lvt[i]);
    1766     }
    1767     SSMR3GetU32(f, &s->esr);
    1768     SSMR3GetU32(f, &s->icr[0]);
    1769     SSMR3GetU32(f, &s->icr[1]);
    1770     SSMR3GetU32(f, &s->divide_conf);
    1771     SSMR3GetU32(f, (uint32_t *)&s->count_shift);
    1772     SSMR3GetU32(f, (uint32_t *)&s->initial_count);
    1773     SSMR3GetU64(f, (uint64_t *)&s->initial_count_load_time);
    1774     SSMR3GetU64(f, (uint64_t *)&s->next_time);
    1775 
    1776     int rc = TMR3TimerLoad(s->CTX_SUFF(pTimer), f);
     1785        SSMR3GetU32(f, &pApic->lvt[i]);
     1786    }
     1787    SSMR3GetU32(f, &pApic->esr);
     1788    SSMR3GetU32(f, &pApic->icr[0]);
     1789    SSMR3GetU32(f, &pApic->icr[1]);
     1790    SSMR3GetU32(f, &pApic->divide_conf);
     1791    SSMR3GetU32(f, (uint32_t *)&pApic->count_shift);
     1792    SSMR3GetU32(f, (uint32_t *)&pApic->initial_count);
     1793    SSMR3GetU64(f, (uint64_t *)&pApic->initial_count_load_time);
     1794    SSMR3GetU64(f, (uint64_t *)&pApic->next_time);
     1795
     1796    int rc = TMR3TimerLoad(pApic->CTX_SUFF(pTimer), f);
    17771797    AssertRCReturn(rc, rc);
    1778     s->uHintedCountShift = s->uHintedInitialCount = 0;
    1779     s->fTimerArmed = TMTimerIsActive(s->CTX_SUFF(pTimer));
    1780     if (s->fTimerArmed)
    1781         apicDoFrequencyHinting(s);
     1798    pApic->uHintedCountShift = pApic->uHintedInitialCount = 0;
     1799    pApic->fTimerArmed = TMTimerIsActive(pApic->CTX_SUFF(pTimer));
     1800    if (pApic->fTimerArmed)
     1801        apicDoFrequencyHinting(pApic);
    17821802
    17831803    return VINF_SUCCESS; /** @todo darn mess! */
     
    17901810{
    17911811    APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    1792     APICState *s = getLapic(pDev);
    1793 
    1794     Log(("CPU%d: apicMMIORead at %llx\n", s->phys_id,  (uint64_t)GCPhysAddr));
     1812    APICState *pApic = apicGetStateByCurEmt(pDev);
     1813
     1814    Log(("CPU%d: apicMMIORead at %llx\n", pApic->phys_id,  (uint64_t)GCPhysAddr));
    17951815
    17961816    /** @todo add LAPIC range validity checks (different LAPICs can
     
    18131833        case 4:
    18141834        {
    1815 #if 0 /** @note experimental */
     1835#if 0 /* Note! experimental */
    18161836#ifndef IN_RING3
    18171837            uint32_t index = (GCPhysAddr >> 4) & 0xff;
    18181838
    18191839            if (    index == 0x08 /* TPR */
    1820                 &&  ++s->cTPRPatchAttempts < APIC_MAX_PATCH_ATTEMPTS)
     1840                &&  ++pApic->cTPRPatchAttempts < APIC_MAX_PATCH_ATTEMPTS)
    18211841            {
    18221842#ifdef IN_RC
    1823                 pDevIns->pDevHlpGC->pfnPATMSetMMIOPatchInfo(pDevIns, GCPhysAddr, &s->tpr);
     1843                pDevIns->pDevHlpGC->pfnPATMSetMMIOPatchInfo(pDevIns, GCPhysAddr, &pApic->tpr);
    18241844#else
    18251845                RTGCPTR pDevInsGC = PDMINS2DATA_GCPTR(pDevIns);
     
    18331853            /* It does its own locking. */
    18341854            uint64_t u64Value = 0;
    1835             int rc = apicReadRegister(pDev, s, (GCPhysAddr >> 4) & 0xff, &u64Value,
     1855            int rc = apicReadRegister(pDev, pApic, (GCPhysAddr >> 4) & 0xff, &u64Value,
    18361856                                      VINF_IOM_R3_MMIO_READ, false /*fMsr*/);
    18371857            *(uint32_t *)pv = (uint32_t)u64Value;
     
    18491869{
    18501870    APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    1851     APICState *s = getLapic(pDev);
    1852 
    1853     Log(("CPU%d: apicMMIOWrite at %llx\n", s->phys_id, (uint64_t)GCPhysAddr));
     1871    APICState *pApic = apicGetStateByCurEmt(pDev);
     1872
     1873    Log(("CPU%d: apicMMIOWrite at %llx\n", pApic->phys_id, (uint64_t)GCPhysAddr));
    18541874
    18551875    /** @todo: add LAPIC range validity checks (multiple LAPICs can theoretically have
     
    18661886        case 4:
    18671887            /* It does its own locking. */
    1868             return apicWriteRegister(pDev, s, (GCPhysAddr >> 4) & 0xff, *(uint32_t const *)pv,
     1888            return apicWriteRegister(pDev, pApic, (GCPhysAddr >> 4) & 0xff, *(uint32_t const *)pv,
    18691889                                     VINF_IOM_R3_MMIO_WRITE, false /*fMsr*/);
    18701890
     
    19171937 * @param   pHlp                The output helper.
    19181938 */
    1919 static void apicR3InfoBasic(APICDeviceInfo  *pDev, APICState *pApic, PCDBGFINFOHLP pHlp)
     1939static void apicR3InfoBasic(APICDeviceInfo *pDev, APICState *pApic, PCDBGFINFOHLP pHlp)
    19201940{
    19211941    uint64_t u64;
     
    20232043{
    20242044    APICDeviceInfo  *pDev  = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    2025     APICState       *pApic = getLapic(pDev);
     2045    APICState       *pApic = apicGetStateByCurEmt(pDev);
    20262046
    20272047    if (pszArgs == NULL || !*pszArgs || !strcmp(pszArgs, "basic"))
     
    21342154
    21352155        /* Clear LAPIC state as if an INIT IPI was sent. */
    2136         apic_init_ipi(pDev, pApic);
    2137 
    2138         /* The IDs are not touched by apic_init_ipi() and must be reset now. */
     2156        apicR3InitIpi(pDev, pApic);
     2157
     2158        /* The IDs are not touched by apicR3InitIpi() and must be reset now. */
    21392159        pApic->arb_id = pApic->id = i;
    21402160        Assert(pApic->id == pApic->phys_id);    /* The two should match again. */
     
    21462166
    21472167        /* Clear any pending APIC interrupt action flag. */
    2148         cpuClearInterrupt(pDev, pApic);
     2168        apicCpuClearInterrupt(pDev, pApic);
    21492169    }
    21502170    /** @todo r=bird: Why is this done everytime, while the constructor first
     
    21782198 * @param   id          The Local APIC ID.
    21792199 */
    2180 DECLINLINE(void) initApicData(APICState *pApic, uint8_t id)
     2200static void apicR3StateInit(APICState *pApic, uint8_t id)
    21812201{
    21822202    memset(pApic, 0, sizeof(*pApic));
     
    22642284
    22652285    for (i = 0; i < cCpus; i++)
    2266         initApicData(&pDev->paLapicsR3[i], i);
     2286        apicR3StateInit(&pDev->paLapicsR3[i], i);
    22672287
    22682288    /*
Note: See TracChangeset for help on using the changeset viewer.

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