Changeset 44515 in vbox for trunk/src/VBox/Devices/PC
- Timestamp:
- Feb 1, 2013 2:52:32 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 83554
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/DevAPIC.cpp
r44509 r44515 2 2 /** @file 3 3 * 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. 4 7 */ 5 8 … … 105 108 /** @def APIC_AND_TM_LOCK 106 109 * Acquires the virtual sync clock lock as well as the PDM lock. */ 107 #define APIC_AND_TM_LOCK(a_pDev, a_pA cpi, rcBusy) \110 #define APIC_AND_TM_LOCK(a_pDev, a_pApic, rcBusy) \ 108 111 do { \ 109 int rc2 = TMTimerLock((a_pA cpi)->CTX_SUFF(pTimer), (rcBusy)); \112 int rc2 = TMTimerLock((a_pApic)->CTX_SUFF(pTimer), (rcBusy)); \ 110 113 if (rc2 != VINF_SUCCESS) \ 111 114 return rc2; \ … … 113 116 if (rc2 != VINF_SUCCESS) \ 114 117 { \ 115 TMTimerUnlock((a_pA cpi)->CTX_SUFF(pTimer)); \118 TMTimerUnlock((a_pApic)->CTX_SUFF(pTimer)); \ 116 119 return rc2; \ 117 120 } \ … … 120 123 /** @def APIC_AND_TM_UNLOCK 121 124 * Releases the PDM lock as well as the TM virtual sync clock lock. */ 122 #define APIC_AND_TM_UNLOCK(a_pDev, a_pA cpi) \125 #define APIC_AND_TM_UNLOCK(a_pDev, a_pApic) \ 123 126 do { \ 124 TMTimerUnlock((a_pA cpi)->CTX_SUFF(pTimer)); \127 TMTimerUnlock((a_pApic)->CTX_SUFF(pTimer)); \ 125 128 PDMCritSectLeave((a_pDev)->CTX_SUFF(pCritSect)); \ 126 129 } while (0) … … 171 174 #define APIC_MAX_PATCH_ATTEMPTS 100 172 175 173 typedef uint32_t PhysApicId;174 typedef uint32_t LogApicId;175 176 176 177 177 /******************************************************************************* 178 178 * Structures and Typedefs * 179 179 *******************************************************************************/ 180 typedef uint32_t PhysApicId; 181 typedef uint32_t LogApicId; 182 180 183 typedef struct APIC256BITREG 181 184 { … … 262 265 263 266 267 /** 268 * The state of one APIC. 269 * 270 * @remarks This is generally pointed to by a parameter or variable named pApic. 271 */ 264 272 typedef struct APICState 265 273 { 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; 267 282 /* Task priority register (interrupt level) */ 268 uint32_t tpr;283 uint32_t tpr; 269 284 /* Logical APIC id - user programmable */ 270 LogApicId id;285 LogApicId id; 271 286 /* Physical APIC id - not visible to user, constant */ 272 PhysApicId phys_id;287 PhysApicId phys_id; 273 288 /** @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; 288 299 289 300 /** The time stamp of the initial_count load, i.e. when it was started. */ … … 334 345 # endif 335 346 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 */ 336 352 typedef struct 337 353 { … … 393 409 * Internal Functions * 394 410 *******************************************************************************/ 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,411 static void apic_update_tpr(APICDeviceInfo *pDev, APICState *pApic, uint32_t val); 412 413 static void apic_eoi(APICDeviceInfo *pDev, APICState *pApic); /* */ 414 static PVMCPUSET apic_get_delivery_bitmask(APICDeviceInfo *pDev, uint8_t dest, uint8_t dest_mode, PVMCPUSET pDstSet); 415 static int apic_deliver(APICDeviceInfo *pDev, APICState *pApic, 400 416 uint8_t dest, uint8_t dest_mode, 401 417 uint8_t delivery_mode, uint8_t vector_num, 402 418 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);419 static int apic_get_arb_pri(APICState const *pApic); 420 static int apic_get_ppr(APICState const *pApic); 421 static uint32_t apic_get_current_count(APICDeviceInfo const *pDev, APICState const *pApic); 422 static void apicTimerSetInitialCount(APICDeviceInfo *pDev, APICState *pApic, uint32_t initial_count); 407 423 static 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)424 static void apicSendInitIpi(APICDeviceInfo *pDev, APICState *pApic); 425 426 static void apicR3InitIpi(APICDeviceInfo *pDev, APICState *pApic); 427 static void apic_set_irq(APICDeviceInfo *pDev, APICState *pApic, int vector_num, int trigger_mode, uint32_t uTagSrc); 428 static bool apic_update_irq(APICDeviceInfo *pDev, APICState *pApic); 429 430 431 DECLINLINE(APICState *) apicGetStateById(APICDeviceInfo *pDev, VMCPUID id) 416 432 { 417 433 AssertFatalMsg(id < pDev->cCpus, ("CPU id %d out of range\n", id)); … … 419 435 } 420 436 421 DECLINLINE(APICState*) getLapic(APICDeviceInfo* pDev) 437 /** 438 * Get the APIC state for the calling EMT. 439 */ 440 DECLINLINE(APICState *) apicGetStateByCurEmt(APICDeviceInfo *pDev) 422 441 { 423 442 /* LAPIC's array is indexed by CPU id */ 424 443 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 447 DECLINLINE(VMCPUID) getCpuFromLapic(APICDeviceInfo *pDev, APICState *pApic) 429 448 { 430 449 /* 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 453 DECLINLINE(void) apicCpuSetInterrupt(APICDeviceInfo *pDev, APICState *pApic, PDMAPICIRQ enmType = PDMAPICIRQ_HARDWARE) 454 { 455 LogFlow(("apic: setting interrupt flag for cpu %d\n", getCpuFromLapic(pDev, pApic))); 437 456 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 460 DECLINLINE(void) apicCpuClearInterrupt(APICDeviceInfo *pDev, APICState *pApic, PDMAPICIRQ enmType = PDMAPICIRQ_HARDWARE) 442 461 { 443 462 LogFlow(("apic: clear interrupt flag\n")); 444 463 pDev->CTX_SUFF(pApicHlp)->pfnClearInterruptFF(pDev->CTX_SUFF(pDevIns), enmType, 445 getCpuFromLapic(pDev, s));464 getCpuFromLapic(pDev, pApic)); 446 465 } 447 466 448 467 # ifdef IN_RING3 449 468 450 DECLINLINE(void) cpuSendSipi(APICDeviceInfo* pDev, APICState *s, int vector)469 DECLINLINE(void) apicR3CpuSendSipi(APICDeviceInfo *pDev, APICState *pApic, int vector) 451 470 { 452 471 Log2(("apic: send SIPI vector=%d\n", vector)); 453 472 454 473 pDev->pApicHlpR3->pfnSendSipi(pDev->pDevInsR3, 455 getCpuFromLapic(pDev, s),474 getCpuFromLapic(pDev, pApic), 456 475 vector); 457 476 } 458 477 459 DECLINLINE(void) cpuSendInitIpi(APICDeviceInfo* pDev, APICState *s)478 DECLINLINE(void) apicR3CpuSendInitIpi(APICDeviceInfo *pDev, APICState *pApic) 460 479 { 461 480 Log2(("apic: send init IPI\n")); 462 481 463 482 pDev->pApicHlpR3->pfnSendInitIpi(pDev->pDevInsR3, 464 getCpuFromLapic(pDev, s));483 getCpuFromLapic(pDev, pApic)); 465 484 } 466 485 467 486 # endif /* IN_RING3 */ 468 487 469 DECLINLINE(uint32_t) getApicEnableBits(APICDeviceInfo *pDev)488 DECLINLINE(uint32_t) getApicEnableBits(APICDeviceInfo *pDev) 470 489 { 471 490 switch (pDev->enmVersion) … … 500 519 } 501 520 502 static int apic_bus_deliver(APICDeviceInfo *pDev,521 static int apic_bus_deliver(APICDeviceInfo *pDev, 503 522 PCVMCPUSET pDstSet, uint8_t delivery_mode, 504 523 uint8_t vector_num, uint8_t polarity, … … 515 534 if (idDstCpu != NIL_VMCPUID) 516 535 { 517 APICState *pApic = getLapicById(pDev, idDstCpu);536 APICState *pApic = apicGetStateById(pDev, idDstCpu); 518 537 apic_set_irq(pDev, pApic, vector_num, trigger_mode, uTagSrc); 519 538 } … … 527 546 case APIC_DM_SMI: 528 547 APIC_FOREACH_IN_SET_BEGIN(pDev, pDstSet); 529 cpuSetInterrupt(pDev, pCurApic, PDMAPICIRQ_SMI);548 apicCpuSetInterrupt(pDev, pCurApic, PDMAPICIRQ_SMI); 530 549 APIC_FOREACH_END(); 531 550 return VINF_SUCCESS; … … 533 552 case APIC_DM_NMI: 534 553 APIC_FOREACH_IN_SET_BEGIN(pDev, pDstSet); 535 cpuSetInterrupt(pDev, pCurApic, PDMAPICIRQ_NMI);554 apicCpuSetInterrupt(pDev, pCurApic, PDMAPICIRQ_NMI); 536 555 APIC_FOREACH_END(); 537 556 return VINF_SUCCESS; … … 568 587 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 569 588 Assert(PDMCritSectIsOwner(pDev->CTX_SUFF(pCritSect))); 570 APICState * s = getLapicById(pDev, idCpu);589 APICState *pApic = apicGetStateById(pDev, idCpu); 571 590 Log(("apicSetBase: %016RX64\n", val)); 572 591 … … 575 594 /** @todo If this change is valid immediately, then we should change the MMIO registration! */ 576 595 /* 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); 583 601 584 602 if (oldMode != newMode) … … 588 606 case PDMAPICVERSION_NONE: 589 607 { 590 s->spurious_vec &= ~APIC_SV_ENABLE;608 pApic->spurious_vec &= ~APIC_SV_ENABLE; 591 609 /* Clear any pending APIC interrupt action flag. */ 592 cpuClearInterrupt(pDev, s);610 apicCpuClearInterrupt(pDev, pApic); 593 611 /** @todo: why do we do that? */ 594 612 pDev->CTX_SUFF(pApicHlp)->pfnChangeFeature(pDevIns, PDMAPICVERSION_NONE); … … 612 630 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 613 631 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; 617 635 } 618 636 … … 621 639 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 622 640 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); 626 644 } 627 645 … … 630 648 /* We don't perform any locking here as that would cause a lot of contention for VT-x/AMD-V. */ 631 649 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; 635 653 } 636 654 … … 1023 1041 return VERR_EM_INTERPRETER; /** @todo tell the caller to raise hell (\#GP(0)). */ 1024 1042 1025 APICState *pApic = getLapicById(pDev, idCpu);1043 APICState *pApic = apicGetStateById(pDev, idCpu); 1026 1044 uint32_t iReg = (u32Reg - MSR_IA32_X2APIC_START) & 0xff; 1027 1045 return apicWriteRegister(pDev, pApic, iReg, u64Value, VINF_SUCCESS /*rcBusy*/, true /*fMsr*/); … … 1039 1057 return VERR_EM_INTERPRETER; 1040 1058 1041 APICState *pApic = getLapicById(pDev, idCpu);1059 APICState *pApic = apicGetStateById(pDev, idCpu); 1042 1060 uint32_t iReg = (u32Reg - MSR_IA32_X2APIC_START) & 0xff; 1043 1061 return apicReadRegister(pDev, pApic, iReg, pu64Value, VINF_SUCCESS /*rcBusy*/, true /*fMsr*/); … … 1067 1085 PDMBOTHCBDECL(int) apicLocalInterrupt(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level) 1068 1086 { 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); 1071 1089 1072 1090 Assert(PDMCritSectIsOwner(pDev->CTX_SUFF(pCritSect))); … … 1074 1092 1075 1093 /* 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)) 1077 1095 { 1078 1096 LogFlow(("apicLocalInterrupt: LAPIC disabled, delivering directly to CPU core.\n")); 1079 1097 if (u8Level) 1080 cpuSetInterrupt(pDev, s, PDMAPICIRQ_EXTINT);1098 apicCpuSetInterrupt(pDev, pApic, PDMAPICIRQ_EXTINT); 1081 1099 else 1082 cpuClearInterrupt(pDev, s, PDMAPICIRQ_EXTINT);1100 apicCpuClearInterrupt(pDev, pApic, PDMAPICIRQ_EXTINT); 1083 1101 1084 1102 return VINF_SUCCESS; … … 1094 1112 * no more than one CPU has the interrupt unmasked. 1095 1113 */ 1096 uint32_t 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. */ 1099 1117 /* Drop int if entry is masked. May not be correct for level-triggered interrupts. */ 1100 1118 if (!(u32Lvec & APIC_LVT_MASKED)) … … 1111 1129 LogFlow(("apicLocalInterrupt: %s ExtINT interrupt\n", u8Level ? "setting" : "clearing")); 1112 1130 if (u8Level) 1113 cpuSetInterrupt(pDev, s, enmType);1131 apicCpuSetInterrupt(pDev, pApic, enmType); 1114 1132 else 1115 cpuClearInterrupt(pDev, s, enmType);1133 apicCpuClearInterrupt(pDev, pApic, enmType); 1116 1134 return VINF_SUCCESS; 1117 1135 case APIC_DM_NMI: … … 1146 1164 } 1147 1165 LogFlow(("apicLocalInterrupt: setting local interrupt type %d\n", enmType)); 1148 cpuSetInterrupt(pDev, s, enmType);1166 apicCpuSetInterrupt(pDev, pApic, enmType); 1149 1167 } 1150 1168 return VINF_SUCCESS; 1151 1169 } 1152 1170 1153 static int apic_get_ppr(APICState const * s)1171 static int apic_get_ppr(APICState const *pApic) 1154 1172 { 1155 1173 int ppr; 1156 1174 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); 1159 1177 isrv >>= 4; 1160 1178 if (tpr >= isrv) 1161 ppr = s->tpr;1179 ppr = pApic->tpr; 1162 1180 else 1163 1181 ppr = isrv << 4; … … 1165 1183 } 1166 1184 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)1185 static int apic_get_ppr_zero_tpr(APICState *pApic) 1186 { 1187 return Apic256BitReg_FindLastSetBit(&pApic->isr, 0); 1188 } 1189 1190 static int apic_get_arb_pri(APICState const *pApic) 1173 1191 { 1174 1192 /** @todo XXX: arbitration */ … … 1177 1195 1178 1196 /* 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))1197 static bool apic_update_irq(APICDeviceInfo *pDev, APICState *pApic) 1198 { 1199 if (!(pApic->spurious_vec & APIC_SV_ENABLE)) 1182 1200 { 1183 1201 /* Clear any pending APIC interrupt action flag. */ 1184 cpuClearInterrupt(pDev, s);1202 apicCpuClearInterrupt(pDev, pApic); 1185 1203 return false; 1186 1204 } 1187 1205 1188 int irrv = Apic256BitReg_FindLastSetBit(& s->irr, -1);1206 int irrv = Apic256BitReg_FindLastSetBit(&pApic->irr, -1); 1189 1207 if (irrv < 0) 1190 1208 return false; 1191 int ppr = apic_get_ppr( s);1209 int ppr = apic_get_ppr(pApic); 1192 1210 if (ppr && (irrv & 0xf0) <= (ppr & 0xf0)) 1193 1211 return false; 1194 cpuSetInterrupt(pDev, s);1212 apicCpuSetInterrupt(pDev, pApic); 1195 1213 return true; 1196 1214 } … … 1205 1223 /* We don't perform any locking here as that would cause a lot of contention for VT-x/AMD-V. */ 1206 1224 1207 APICState * s = getLapicById(pDev, idCpu);1225 APICState *pApic = apicGetStateById(pDev, idCpu); 1208 1226 1209 1227 /* … … 1212 1230 */ 1213 1231 /** @todo check excessive locking whatever... */ 1214 int irrv = Apic256BitReg_FindLastSetBit(& s->irr, -1);1232 int irrv = Apic256BitReg_FindLastSetBit(&pApic->irr, -1); 1215 1233 if (irrv < 0) 1216 1234 return false; 1217 1235 1218 int ppr = apic_get_ppr_zero_tpr( s);1236 int ppr = apic_get_ppr_zero_tpr(pApic); 1219 1237 1220 1238 if (ppr && (irrv & 0xf0) <= (ppr & 0xf0)) … … 1224 1242 } 1225 1243 1226 static void apic_update_tpr(APICDeviceInfo *pDev, APICState * s, uint32_t val)1244 static void apic_update_tpr(APICDeviceInfo *pDev, APICState *pApic, uint32_t val) 1227 1245 { 1228 1246 bool fIrqIsActive = false; 1229 1247 bool fIrqWasActive = false; 1230 1248 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); 1234 1252 1235 1253 /* If an interrupt is pending and now masked, then clear the FF flag. */ … … 1238 1256 Log(("apic_update_tpr: deactivate interrupt that was masked by the TPR update (%x)\n", val)); 1239 1257 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 1262 static 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); 1249 1267 if (trigger_mode) 1250 Apic256BitReg_SetBit(& s->tmr, vector_num);1268 Apic256BitReg_SetBit(&pApic->tmr, vector_num); 1251 1269 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; 1256 1274 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 1280 static void apic_eoi(APICDeviceInfo *pDev, APICState *pApic) 1281 { 1282 int isrv = Apic256BitReg_FindLastSetBit(&pApic->isr, -1); 1265 1283 if (isrv < 0) 1266 1284 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)); 1269 1287 /** @todo XXX: send the EOI packet to the APIC bus to allow the I/O APIC to 1270 1288 * set the remote IRR bit for level triggered interrupts. */ 1271 apic_update_irq(pDev, s);1289 apic_update_irq(pDev, pApic); 1272 1290 } 1273 1291 … … 1305 1323 1306 1324 #ifdef IN_RING3 1307 static void apic_init_ipi(APICDeviceInfo* pDev, APICState *s) 1325 1326 static void apicR3InitIpi(APICDeviceInfo *pDev, APICState *pApic) 1308 1327 { 1309 1328 int i; 1310 1329 1311 1330 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 1349 static void apicSendInitIpi(APICDeviceInfo *pDev, APICState *pApic) 1350 { 1351 apicR3InitIpi(pDev, pApic); 1352 apicR3CpuSendInitIpi(pDev, pApic); 1334 1353 } 1335 1354 1336 1355 /* 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 } 1356 static 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 1342 1362 #endif /* IN_RING3 */ 1343 1363 1344 static int apic_deliver(APICDeviceInfo *pDev, APICState * s,1364 static int apic_deliver(APICDeviceInfo *pDev, APICState *pApic, 1345 1365 uint8_t dest, uint8_t dest_mode, 1346 1366 uint8_t delivery_mode, uint8_t vector_num, 1347 1367 uint8_t polarity, uint8_t trigger_mode) 1348 1368 { 1349 int dest_shorthand = ( s->icr[0] >> 18) & 3;1369 int dest_shorthand = (pApic->icr[0] >> 18) & 3; 1350 1370 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)); 1351 1371 … … 1358 1378 case 1: 1359 1379 VMCPUSET_EMPTY(&DstSet); 1360 VMCPUSET_ADD(&DstSet, s->id);1380 VMCPUSET_ADD(&DstSet, pApic->id); 1361 1381 break; 1362 1382 case 2: … … 1365 1385 case 3: 1366 1386 VMCPUSET_FILL(&DstSet); 1367 VMCPUSET_DEL(&DstSet, s->id);1387 VMCPUSET_DEL(&DstSet, pApic->id); 1368 1388 break; 1369 1389 } … … 1373 1393 case APIC_DM_INIT: 1374 1394 { 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; 1377 1397 if (level == 0 && trig_mode == 1) 1378 1398 { … … 1380 1400 pCurApic->arb_id = pCurApic->id; 1381 1401 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)); 1383 1403 return VINF_SUCCESS; 1384 1404 } … … 1389 1409 # ifdef IN_RING3 1390 1410 APIC_FOREACH_IN_SET_BEGIN(pDev, &DstSet); 1391 apic _startup(pDev, pCurApic, vector_num);1411 apicR3Startup(pDev, pCurApic, vector_num); 1392 1412 APIC_FOREACH_END(); 1393 1413 return VINF_SUCCESS; … … 1408 1428 { 1409 1429 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 */ 1412 1431 if (!pDev) 1413 1432 { 1414 Log(("apic_get_interrupt: returns -1 (! s)\n"));1433 Log(("apic_get_interrupt: returns -1 (!pDev)\n")); 1415 1434 return -1; 1416 1435 } … … 1418 1437 Assert(PDMCritSectIsOwner(pDev->CTX_SUFF(pCritSect))); 1419 1438 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)); 1425 1444 return -1; 1426 1445 } 1427 1446 1428 1447 /** @todo XXX: spurious IRQ handling */ 1429 int intno = Apic256BitReg_FindLastSetBit(& s->irr, -1);1448 int intno = Apic256BitReg_FindLastSetBit(&pApic->irr, -1); 1430 1449 if (intno < 0) 1431 1450 { 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)); 1433 1452 return -1; 1434 1453 } 1435 1454 1436 if ( s->tpr && (uint32_t)intno <= s->tpr)1455 if (pApic->tpr && (uint32_t)intno <= pApic->tpr) 1437 1456 { 1438 1457 *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)); 1452 1471 return intno; 1453 1472 } … … 1649 1668 1650 1669 # ifdef IN_RING3 1670 1651 1671 /** 1652 1672 * Timer callback function. … … 1659 1679 { 1660 1680 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 1661 APICState *pApic = (APICState *)pvUser;1681 APICState *pApic = (APICState *)pvUser; 1662 1682 Assert(pApic->pTimerR3 == pTimer); 1663 1683 Assert(pApic->fTimerArmed); … … 1692 1712 static void apic_save(SSMHANDLE* f, void *opaque) 1693 1713 { 1694 APICState * s= (APICState*)opaque;1714 APICState *pApic = (APICState*)opaque; 1695 1715 int i; 1696 1716 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); 1705 1725 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]); 1709 1729 } 1710 1730 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); 1723 1743 } 1724 1744 1725 1745 static int apic_load(SSMHANDLE *f, void *opaque, int version_id) 1726 1746 { 1727 APICState * s= (APICState*)opaque;1747 APICState *pApic = (APICState*)opaque; 1728 1748 int i; 1729 1749 1730 1750 /** @todo XXX: what if the base changes? (registered memory regions) */ 1731 SSMR3GetU32(f, & s->apicbase);1751 SSMR3GetU32(f, &pApic->apicbase); 1732 1752 1733 1753 switch (version_id) … … 1737 1757 uint8_t val = 0; 1738 1758 SSMR3GetU8(f, &val); 1739 s->id = val;1759 pApic->id = val; 1740 1760 /* UP only in old saved states */ 1741 s->phys_id = 0;1761 pApic->phys_id = 0; 1742 1762 SSMR3GetU8(f, &val); 1743 s->arb_id = val;1763 pApic->arb_id = val; 1744 1764 break; 1745 1765 } 1746 1766 case APIC_SAVED_STATE_VERSION: 1747 1767 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); 1751 1771 break; 1752 1772 default: 1753 1773 return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION; 1754 1774 } 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); 1759 1779 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]); 1763 1783 } 1764 1784 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); 1777 1797 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); 1782 1802 1783 1803 return VINF_SUCCESS; /** @todo darn mess! */ … … 1790 1810 { 1791 1811 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)); 1795 1815 1796 1816 /** @todo add LAPIC range validity checks (different LAPICs can … … 1813 1833 case 4: 1814 1834 { 1815 #if 0 /* * @noteexperimental */1835 #if 0 /* Note! experimental */ 1816 1836 #ifndef IN_RING3 1817 1837 uint32_t index = (GCPhysAddr >> 4) & 0xff; 1818 1838 1819 1839 if ( index == 0x08 /* TPR */ 1820 && ++ s->cTPRPatchAttempts < APIC_MAX_PATCH_ATTEMPTS)1840 && ++pApic->cTPRPatchAttempts < APIC_MAX_PATCH_ATTEMPTS) 1821 1841 { 1822 1842 #ifdef IN_RC 1823 pDevIns->pDevHlpGC->pfnPATMSetMMIOPatchInfo(pDevIns, GCPhysAddr, & s->tpr);1843 pDevIns->pDevHlpGC->pfnPATMSetMMIOPatchInfo(pDevIns, GCPhysAddr, &pApic->tpr); 1824 1844 #else 1825 1845 RTGCPTR pDevInsGC = PDMINS2DATA_GCPTR(pDevIns); … … 1833 1853 /* It does its own locking. */ 1834 1854 uint64_t u64Value = 0; 1835 int rc = apicReadRegister(pDev, s, (GCPhysAddr >> 4) & 0xff, &u64Value,1855 int rc = apicReadRegister(pDev, pApic, (GCPhysAddr >> 4) & 0xff, &u64Value, 1836 1856 VINF_IOM_R3_MMIO_READ, false /*fMsr*/); 1837 1857 *(uint32_t *)pv = (uint32_t)u64Value; … … 1849 1869 { 1850 1870 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)); 1854 1874 1855 1875 /** @todo: add LAPIC range validity checks (multiple LAPICs can theoretically have … … 1866 1886 case 4: 1867 1887 /* 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, 1869 1889 VINF_IOM_R3_MMIO_WRITE, false /*fMsr*/); 1870 1890 … … 1917 1937 * @param pHlp The output helper. 1918 1938 */ 1919 static void apicR3InfoBasic(APICDeviceInfo 1939 static void apicR3InfoBasic(APICDeviceInfo *pDev, APICState *pApic, PCDBGFINFOHLP pHlp) 1920 1940 { 1921 1941 uint64_t u64; … … 2023 2043 { 2024 2044 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 2025 APICState *pApic = getLapic(pDev);2045 APICState *pApic = apicGetStateByCurEmt(pDev); 2026 2046 2027 2047 if (pszArgs == NULL || !*pszArgs || !strcmp(pszArgs, "basic")) … … 2134 2154 2135 2155 /* 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. */ 2139 2159 pApic->arb_id = pApic->id = i; 2140 2160 Assert(pApic->id == pApic->phys_id); /* The two should match again. */ … … 2146 2166 2147 2167 /* Clear any pending APIC interrupt action flag. */ 2148 cpuClearInterrupt(pDev, pApic);2168 apicCpuClearInterrupt(pDev, pApic); 2149 2169 } 2150 2170 /** @todo r=bird: Why is this done everytime, while the constructor first … … 2178 2198 * @param id The Local APIC ID. 2179 2199 */ 2180 DECLINLINE(void) initApicData(APICState *pApic, uint8_t id)2200 static void apicR3StateInit(APICState *pApic, uint8_t id) 2181 2201 { 2182 2202 memset(pApic, 0, sizeof(*pApic)); … … 2264 2284 2265 2285 for (i = 0; i < cCpus; i++) 2266 initApicData(&pDev->paLapicsR3[i], i);2286 apicR3StateInit(&pDev->paLapicsR3[i], i); 2267 2287 2268 2288 /*
Note:
See TracChangeset
for help on using the changeset viewer.