Changeset 37476 in vbox for trunk/src/VBox/Devices/PC
- Timestamp:
- Jun 15, 2011 4:52:47 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 72292
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/DevAPIC.cpp
r37475 r37476 60 60 /** @def APIC_LOCK 61 61 * Acquires the PDM lock. */ 62 #define APIC_LOCK( pThis, rcBusy) \62 #define APIC_LOCK(a_pDev, rcBusy) \ 63 63 do { \ 64 int rc2 = PDMCritSectEnter(( pThis)->CTX_SUFF(pCritSect), (rcBusy)); \64 int rc2 = PDMCritSectEnter((a_pDev)->CTX_SUFF(pCritSect), (rcBusy)); \ 65 65 if (rc2 != VINF_SUCCESS) \ 66 66 return rc2; \ … … 69 69 /** @def APIC_LOCK_VOID 70 70 * Acquires the PDM lock and does not expect failure (i.e. ring-3 only!). */ 71 #define APIC_LOCK_VOID( pThis, rcBusy) \71 #define APIC_LOCK_VOID(a_pDev, rcBusy) \ 72 72 do { \ 73 int rc2 = PDMCritSectEnter(( pThis)->CTX_SUFF(pCritSect), (rcBusy)); \73 int rc2 = PDMCritSectEnter((a_pDev)->CTX_SUFF(pCritSect), (rcBusy)); \ 74 74 AssertLogRelRCReturnVoid(rc2); \ 75 75 } while (0) … … 77 77 /** @def APIC_UNLOCK 78 78 * Releases the PDM lock. */ 79 #define APIC_UNLOCK( pThis) \80 PDMCritSectLeave(( pThis)->CTX_SUFF(pCritSect))79 #define APIC_UNLOCK(a_pDev) \ 80 PDMCritSectLeave((a_pDev)->CTX_SUFF(pCritSect)) 81 81 82 82 /** @def APIC_AND_TM_LOCK … … 118 118 119 119 120 #define foreach_apic( dev, mask, code)\120 #define foreach_apic(pDev, mask, code) \ 121 121 do { \ 122 uint32_t i; \ 123 APICState *apic = (dev)->CTX_SUFF(paLapics); \ 124 for (i = 0; i < (dev)->cCpus; i++) \ 122 APICState *apic = (pDev)->CTX_SUFF(paLapics); \ 123 for (uint32_t i = 0; i < (pDev)->cCpus; i++) \ 125 124 { \ 126 125 if (mask & (1 << (apic->id))) \ … … 362 361 * Internal Functions * 363 362 *******************************************************************************/ 364 static void apic_update_tpr(APICDeviceInfo * dev, APICState* s, uint32_t val);365 366 static void apic_eoi(APICDeviceInfo * dev, APICState* s); /* */367 static uint32_t apic_get_delivery_bitmask(APICDeviceInfo* dev, uint8_t dest, uint8_t dest_mode);368 static int apic_deliver(APICDeviceInfo* dev, APICState *s,363 static void apic_update_tpr(APICDeviceInfo *pDev, APICState* s, uint32_t val); 364 365 static void apic_eoi(APICDeviceInfo *pDev, APICState* s); /* */ 366 static uint32_t apic_get_delivery_bitmask(APICDeviceInfo* pDev, uint8_t dest, uint8_t dest_mode); 367 static int apic_deliver(APICDeviceInfo* pDev, APICState *s, 369 368 uint8_t dest, uint8_t dest_mode, 370 369 uint8_t delivery_mode, uint8_t vector_num, … … 372 371 static int apic_get_arb_pri(APICState *s); 373 372 static int apic_get_ppr(APICState *s); 374 static uint32_t apic_get_current_count(APICDeviceInfo* dev, APICState *s);375 static void apicTimerSetInitialCount(APICDeviceInfo * dev, APICState *s, uint32_t initial_count);376 static void apicTimerSetLvt(APICDeviceInfo * dev, APICState *pThis, uint32_t fNew);377 static void apicSendInitIpi(APICDeviceInfo* dev, APICState *s);378 379 static void apic_init_ipi(APICDeviceInfo* dev, APICState *s);380 static void apic_set_irq(APICDeviceInfo* dev, APICState *s, int vector_num, int trigger_mode);381 static bool apic_update_irq(APICDeviceInfo* dev, APICState *s);382 383 384 DECLINLINE(APICState*) getLapicById(APICDeviceInfo * dev, VMCPUID id)385 { 386 AssertFatalMsg(id < dev->cCpus, ("CPU id %d out of range\n", id));387 return & dev->CTX_SUFF(paLapics)[id];388 } 389 390 DECLINLINE(APICState*) getLapic(APICDeviceInfo* dev)373 static uint32_t apic_get_current_count(APICDeviceInfo* pDev, APICState *s); 374 static void apicTimerSetInitialCount(APICDeviceInfo *pDev, APICState *s, uint32_t initial_count); 375 static void apicTimerSetLvt(APICDeviceInfo *pDev, APICState *pApic, uint32_t fNew); 376 static void apicSendInitIpi(APICDeviceInfo* pDev, APICState *s); 377 378 static void apic_init_ipi(APICDeviceInfo* pDev, APICState *s); 379 static void apic_set_irq(APICDeviceInfo* pDev, APICState *s, int vector_num, int trigger_mode); 380 static bool apic_update_irq(APICDeviceInfo* pDev, APICState *s); 381 382 383 DECLINLINE(APICState*) getLapicById(APICDeviceInfo *pDev, VMCPUID id) 384 { 385 AssertFatalMsg(id < pDev->cCpus, ("CPU id %d out of range\n", id)); 386 return &pDev->CTX_SUFF(paLapics)[id]; 387 } 388 389 DECLINLINE(APICState*) getLapic(APICDeviceInfo* pDev) 391 390 { 392 391 /* LAPIC's array is indexed by CPU id */ 393 VMCPUID id = dev->CTX_SUFF(pApicHlp)->pfnGetCpuId(dev->CTX_SUFF(pDevIns));394 return getLapicById( dev, id);395 } 396 397 DECLINLINE(VMCPUID) getCpuFromLapic(APICDeviceInfo* dev, APICState *s)392 VMCPUID id = pDev->CTX_SUFF(pApicHlp)->pfnGetCpuId(pDev->CTX_SUFF(pDevIns)); 393 return getLapicById(pDev, id); 394 } 395 396 DECLINLINE(VMCPUID) getCpuFromLapic(APICDeviceInfo* pDev, APICState *s) 398 397 { 399 398 /* for now we assume LAPIC physical id == CPU id */ … … 401 400 } 402 401 403 DECLINLINE(void) cpuSetInterrupt(APICDeviceInfo* dev, APICState *s, PDMAPICIRQ enmType = PDMAPICIRQ_HARDWARE)404 { 405 LogFlow(("apic: setting interrupt flag for cpu %d\n", getCpuFromLapic( dev, s)));406 dev->CTX_SUFF(pApicHlp)->pfnSetInterruptFF(dev->CTX_SUFF(pDevIns), enmType,407 getCpuFromLapic( dev, s));408 } 409 410 DECLINLINE(void) cpuClearInterrupt(APICDeviceInfo* dev, APICState *s, PDMAPICIRQ enmType = PDMAPICIRQ_HARDWARE)402 DECLINLINE(void) cpuSetInterrupt(APICDeviceInfo* pDev, APICState *s, PDMAPICIRQ enmType = PDMAPICIRQ_HARDWARE) 403 { 404 LogFlow(("apic: setting interrupt flag for cpu %d\n", getCpuFromLapic(pDev, s))); 405 pDev->CTX_SUFF(pApicHlp)->pfnSetInterruptFF(pDev->CTX_SUFF(pDevIns), enmType, 406 getCpuFromLapic(pDev, s)); 407 } 408 409 DECLINLINE(void) cpuClearInterrupt(APICDeviceInfo* pDev, APICState *s, PDMAPICIRQ enmType = PDMAPICIRQ_HARDWARE) 411 410 { 412 411 LogFlow(("apic: clear interrupt flag\n")); 413 dev->CTX_SUFF(pApicHlp)->pfnClearInterruptFF(dev->CTX_SUFF(pDevIns), enmType,414 getCpuFromLapic( dev, s));412 pDev->CTX_SUFF(pApicHlp)->pfnClearInterruptFF(pDev->CTX_SUFF(pDevIns), enmType, 413 getCpuFromLapic(pDev, s)); 415 414 } 416 415 417 416 # ifdef IN_RING3 418 417 419 DECLINLINE(void) cpuSendSipi(APICDeviceInfo* dev, APICState *s, int vector)418 DECLINLINE(void) cpuSendSipi(APICDeviceInfo* pDev, APICState *s, int vector) 420 419 { 421 420 Log2(("apic: send SIPI vector=%d\n", vector)); 422 421 423 dev->pApicHlpR3->pfnSendSipi(dev->pDevInsR3,424 getCpuFromLapic( dev, s),422 pDev->pApicHlpR3->pfnSendSipi(pDev->pDevInsR3, 423 getCpuFromLapic(pDev, s), 425 424 vector); 426 425 } 427 426 428 DECLINLINE(void) cpuSendInitIpi(APICDeviceInfo* dev, APICState *s)427 DECLINLINE(void) cpuSendInitIpi(APICDeviceInfo* pDev, APICState *s) 429 428 { 430 429 Log2(("apic: send init IPI\n")); 431 430 432 dev->pApicHlpR3->pfnSendInitIpi(dev->pDevInsR3,433 getCpuFromLapic( dev, s));431 pDev->pApicHlpR3->pfnSendInitIpi(pDev->pDevInsR3, 432 getCpuFromLapic(pDev, s)); 434 433 } 435 434 436 435 # endif /* IN_RING3 */ 437 436 438 DECLINLINE(uint32_t) getApicEnableBits(APICDeviceInfo* dev)439 { 440 switch ( dev->enmVersion)437 DECLINLINE(uint32_t) getApicEnableBits(APICDeviceInfo* pDev) 438 { 439 switch (pDev->enmVersion) 441 440 { 442 441 case PDMAPICVERSION_NONE: … … 447 446 return MSR_IA32_APICBASE_ENABLE | MSR_IA32_APICBASE_X2ENABLE ; 448 447 default: 449 AssertMsgFailed(("Unsupported APIC version %d\n", dev->enmVersion));448 AssertMsgFailed(("Unsupported APIC version %d\n", pDev->enmVersion)); 450 449 return 0; 451 450 } … … 469 468 } 470 469 471 static int apic_bus_deliver(APICDeviceInfo* dev,470 static int apic_bus_deliver(APICDeviceInfo* pDev, 472 471 uint32_t deliver_bitmask, uint8_t delivery_mode, 473 472 uint8_t vector_num, uint8_t polarity, … … 483 482 if (d >= 0) 484 483 { 485 APICState* apic = getLapicById( dev, d);486 apic_set_irq( dev, apic, vector_num, trigger_mode);484 APICState* apic = getLapicById(pDev, d); 485 apic_set_irq(pDev, apic, vector_num, trigger_mode); 487 486 } 488 487 return VINF_SUCCESS; … … 493 492 494 493 case APIC_DM_SMI: 495 foreach_apic( dev, deliver_bitmask,496 cpuSetInterrupt( dev, apic, PDMAPICIRQ_SMI));494 foreach_apic(pDev, deliver_bitmask, 495 cpuSetInterrupt(pDev, apic, PDMAPICIRQ_SMI)); 497 496 return VINF_SUCCESS; 498 497 499 498 case APIC_DM_NMI: 500 foreach_apic( dev, deliver_bitmask,501 cpuSetInterrupt( dev, apic, PDMAPICIRQ_NMI));499 foreach_apic(pDev, deliver_bitmask, 500 cpuSetInterrupt(pDev, apic, PDMAPICIRQ_NMI)); 502 501 return VINF_SUCCESS; 503 502 … … 505 504 /* normal INIT IPI sent to processors */ 506 505 #ifdef IN_RING3 507 foreach_apic( dev, deliver_bitmask,508 apicSendInitIpi( dev, apic));506 foreach_apic(pDev, deliver_bitmask, 507 apicSendInitIpi(pDev, apic)); 509 508 return VINF_SUCCESS; 510 509 #else … … 521 520 } 522 521 523 foreach_apic( dev, deliver_bitmask,524 apic_set_irq ( dev, apic, vector_num, trigger_mode));522 foreach_apic(pDev, deliver_bitmask, 523 apic_set_irq (pDev, apic, vector_num, trigger_mode)); 525 524 return VINF_SUCCESS; 526 525 } … … 529 528 PDMBOTHCBDECL(void) apicSetBase(PPDMDEVINS pDevIns, uint64_t val) 530 529 { 531 APICDeviceInfo * dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);532 Assert(PDMCritSectIsOwner( dev->CTX_SUFF(pCritSect)));533 APICState *s = getLapic( dev); /** @todo fix interface */530 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 531 Assert(PDMCritSectIsOwner(pDev->CTX_SUFF(pCritSect))); 532 APICState *s = getLapic(pDev); /** @todo fix interface */ 534 533 Log(("apicSetBase: %016RX64\n", val)); 535 534 536 535 /** @todo: do we need to lock here ? */ 537 /* APIC_LOCK_VOID( dev, VERR_INTERNAL_ERROR); */536 /* APIC_LOCK_VOID(pDev, VERR_INTERNAL_ERROR); */ 538 537 /** @todo If this change is valid immediately, then we should change the MMIO registration! */ 539 538 /* We cannot change if this CPU is BSP or not by writing to MSR - it's hardwired */ … … 541 540 s->apicbase = 542 541 (val & 0xfffff000) | /* base */ 543 (val & getApicEnableBits( dev)) | /* mode */542 (val & getApicEnableBits(pDev)) | /* mode */ 544 543 (s->apicbase & MSR_IA32_APICBASE_BSP) /* keep BSP bit */; 545 544 PDMAPICVERSION newMode = getApicMode(s); … … 553 552 s->spurious_vec &= ~APIC_SV_ENABLE; 554 553 /* Clear any pending APIC interrupt action flag. */ 555 cpuClearInterrupt( dev, s);554 cpuClearInterrupt(pDev, s); 556 555 /** @todo: why do we do that? */ 557 dev->CTX_SUFF(pApicHlp)->pfnChangeFeature(pDevIns, PDMAPICVERSION_NONE);556 pDev->CTX_SUFF(pApicHlp)->pfnChangeFeature(pDevIns, PDMAPICVERSION_NONE); 558 557 break; 559 558 } … … 568 567 } 569 568 } 570 /* APIC_UNLOCK( dev); */569 /* APIC_UNLOCK(pDev); */ 571 570 } 572 571 573 572 PDMBOTHCBDECL(uint64_t) apicGetBase(PPDMDEVINS pDevIns) 574 573 { 575 APICDeviceInfo * dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);576 Assert(PDMCritSectIsOwner( dev->CTX_SUFF(pCritSect)));577 APICState *s = getLapic( dev); /** @todo fix interface */574 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 575 Assert(PDMCritSectIsOwner(pDev->CTX_SUFF(pCritSect))); 576 APICState *s = getLapic(pDev); /** @todo fix interface */ 578 577 LogFlow(("apicGetBase: %016llx\n", (uint64_t)s->apicbase)); 579 578 return s->apicbase; … … 582 581 PDMBOTHCBDECL(void) apicSetTPR(PPDMDEVINS pDevIns, VMCPUID idCpu, uint8_t val) 583 582 { 584 APICDeviceInfo * dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);585 Assert(PDMCritSectIsOwner( dev->CTX_SUFF(pCritSect)));586 APICState *s = getLapicById( dev, idCpu);583 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 584 Assert(PDMCritSectIsOwner(pDev->CTX_SUFF(pCritSect))); 585 APICState *s = getLapicById(pDev, idCpu); 587 586 LogFlow(("apicSetTPR: val=%#x (trp %#x -> %#x)\n", val, s->tpr, val)); 588 apic_update_tpr( dev, s, val);587 apic_update_tpr(pDev, s, val); 589 588 } 590 589 … … 592 591 { 593 592 /* We don't perform any locking here as that would cause a lot of contention for VT-x/AMD-V. */ 594 APICDeviceInfo * dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);595 APICState *s = getLapicById( dev, idCpu);593 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 594 APICState *s = getLapicById(pDev, idCpu); 596 595 Log2(("apicGetTPR: returns %#x\n", s->tpr)); 597 596 return s->tpr; … … 768 767 PDMBOTHCBDECL(int) apicReadMSR(PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t *pu64Value) 769 768 { 770 APICDeviceInfo * dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);771 Assert(PDMCritSectIsOwner( dev->CTX_SUFF(pCritSect)));772 773 if ( dev->enmVersion < PDMAPICVERSION_X2APIC)769 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 770 Assert(PDMCritSectIsOwner(pDev->CTX_SUFF(pCritSect))); 771 772 if (pDev->enmVersion < PDMAPICVERSION_X2APIC) 774 773 return VERR_EM_INTERPRETER; 775 774 776 775 uint32_t index = (u32Reg - MSR_IA32_APIC_START) & 0xff; 777 APICState *apic = getLapicById( dev, idCpu);776 APICState *apic = getLapicById(pDev, idCpu); 778 777 uint64_t val = 0; 779 778 int rc = VINF_SUCCESS; … … 835 834 break; 836 835 case 0x39: 837 val = apic_get_current_count( dev, apic);836 val = apic_get_current_count(pDev, apic); 838 837 break; 839 838 case 0x3e: … … 870 869 uint8_t u8TriggerMode) 871 870 { 872 APICDeviceInfo * dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);873 Assert(PDMCritSectIsOwner( dev->CTX_SUFF(pCritSect)));871 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 872 Assert(PDMCritSectIsOwner(pDev->CTX_SUFF(pCritSect))); 874 873 LogFlow(("apicBusDeliverCallback: pDevIns=%p u8Dest=%#x u8DestMode=%#x u8DeliveryMode=%#x iVector=%#x u8Polarity=%#x u8TriggerMode=%#x\n", 875 874 pDevIns, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode)); 876 return apic_bus_deliver( dev, apic_get_delivery_bitmask(dev, u8Dest, u8DestMode),875 return apic_bus_deliver(pDev, apic_get_delivery_bitmask(pDev, u8Dest, u8DestMode), 877 876 u8DeliveryMode, iVector, u8Polarity, u8TriggerMode); 878 877 } … … 884 883 PDMBOTHCBDECL(int) apicLocalInterrupt(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level) 885 884 { 886 APICDeviceInfo * dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);887 APICState *s = getLapicById( dev, 0);888 889 Assert(PDMCritSectIsOwner( dev->CTX_SUFF(pCritSect)));885 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 886 APICState *s = getLapicById(pDev, 0); 887 888 Assert(PDMCritSectIsOwner(pDev->CTX_SUFF(pCritSect))); 890 889 LogFlow(("apicLocalInterrupt: pDevIns=%p u8Pin=%x u8Level=%x\n", pDevIns, u8Pin, u8Level)); 891 890 … … 895 894 LogFlow(("apicLocalInterrupt: LAPIC disabled, delivering directly to CPU core.\n")); 896 895 if (u8Level) 897 cpuSetInterrupt( dev, s, PDMAPICIRQ_EXTINT);896 cpuSetInterrupt(pDev, s, PDMAPICIRQ_EXTINT); 898 897 else 899 cpuClearInterrupt( dev, s, PDMAPICIRQ_EXTINT);898 cpuClearInterrupt(pDev, s, PDMAPICIRQ_EXTINT); 900 899 901 900 return VINF_SUCCESS; … … 928 927 LogFlow(("apicLocalInterrupt: %s ExtINT interrupt\n", u8Level ? "setting" : "clearing")); 929 928 if (u8Level) 930 cpuSetInterrupt( dev, s, enmType);929 cpuSetInterrupt(pDev, s, enmType); 931 930 else 932 cpuClearInterrupt( dev, s, enmType);931 cpuClearInterrupt(pDev, s, enmType); 933 932 return VINF_SUCCESS; 934 933 case APIC_DM_NMI: … … 963 962 } 964 963 LogFlow(("apicLocalInterrupt: setting local interrupt type %d\n", enmType)); 965 cpuSetInterrupt( dev, s, enmType);964 cpuSetInterrupt(pDev, s, enmType); 966 965 } 967 966 return VINF_SUCCESS; … … 1013 1012 1014 1013 /* signal the CPU if an irq is pending */ 1015 static bool apic_update_irq(APICDeviceInfo * dev, APICState* s)1014 static bool apic_update_irq(APICDeviceInfo *pDev, APICState* s) 1016 1015 { 1017 1016 int irrv, ppr; … … 1019 1018 { 1020 1019 /* Clear any pending APIC interrupt action flag. */ 1021 cpuClearInterrupt( dev, s);1020 cpuClearInterrupt(pDev, s); 1022 1021 return false; 1023 1022 } … … 1029 1028 if (ppr && (irrv & 0xf0) <= (ppr & 0xf0)) 1030 1029 return false; 1031 cpuSetInterrupt( dev, s);1030 cpuSetInterrupt(pDev, s); 1032 1031 return true; 1033 1032 } … … 1037 1036 { 1038 1037 int irrv, ppr; 1039 APICDeviceInfo * dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);1040 if (! dev)1038 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 1039 if (!pDev) 1041 1040 return false; 1042 1041 1043 1042 /* We don't perform any locking here as that would cause a lot of contention for VT-x/AMD-V. */ 1044 1043 1045 APICState *s = getLapic( dev); /** @todo fix interface */1044 APICState *s = getLapic(pDev); /** @todo fix interface */ 1046 1045 1047 1046 /* … … 1061 1060 } 1062 1061 1063 static void apic_update_tpr(APICDeviceInfo * dev, APICState* s, uint32_t val)1062 static void apic_update_tpr(APICDeviceInfo *pDev, APICState* s, uint32_t val) 1064 1063 { 1065 1064 bool fIrqIsActive = false; 1066 1065 bool fIrqWasActive = false; 1067 1066 1068 fIrqWasActive = apic_update_irq( dev, s);1067 fIrqWasActive = apic_update_irq(pDev, s); 1069 1068 s->tpr = val; 1070 fIrqIsActive = apic_update_irq( dev, s);1069 fIrqIsActive = apic_update_irq(pDev, s); 1071 1070 1072 1071 /* If an interrupt is pending and now masked, then clear the FF flag. */ … … 1074 1073 { 1075 1074 Log(("apic_update_tpr: deactivate interrupt that was masked by the TPR update (%x)\n", val)); 1076 STAM_COUNTER_INC(& dev->StatClearedActiveIrq);1077 cpuClearInterrupt( dev, s);1078 } 1079 } 1080 1081 static void apic_set_irq(APICDeviceInfo * dev, APICState* s, int vector_num, int trigger_mode)1075 STAM_COUNTER_INC(&pDev->StatClearedActiveIrq); 1076 cpuClearInterrupt(pDev, s); 1077 } 1078 } 1079 1080 static void apic_set_irq(APICDeviceInfo *pDev, APICState* s, int vector_num, int trigger_mode) 1082 1081 { 1083 1082 LogFlow(("CPU%d: apic_set_irq vector=%x, trigger_mode=%x\n", s->phys_id, vector_num, trigger_mode)); … … 1087 1086 else 1088 1087 reset_bit(s->tmr, vector_num); 1089 apic_update_irq( dev, s);1090 } 1091 1092 static void apic_eoi(APICDeviceInfo * dev, APICState* s)1088 apic_update_irq(pDev, s); 1089 } 1090 1091 static void apic_eoi(APICDeviceInfo *pDev, APICState* s) 1093 1092 { 1094 1093 int isrv; … … 1100 1099 /* XXX: send the EOI packet to the APIC bus to allow the I/O APIC to 1101 1100 set the remote IRR bit for level triggered interrupts. */ 1102 apic_update_irq( dev, s);1103 } 1104 1105 static uint32_t apic_get_delivery_bitmask(APICDeviceInfo * dev, uint8_t dest, uint8_t dest_mode)1101 apic_update_irq(pDev, s); 1102 } 1103 1104 static uint32_t apic_get_delivery_bitmask(APICDeviceInfo *pDev, uint8_t dest, uint8_t dest_mode) 1106 1105 { 1107 1106 uint32_t mask = 0; … … 1116 1115 else 1117 1116 { 1118 APICState *apic = dev->CTX_SUFF(paLapics);1117 APICState *apic = pDev->CTX_SUFF(paLapics); 1119 1118 uint32_t i; 1120 1119 1121 1120 /* XXX: cluster mode */ 1122 for(i = 0; i < dev->cCpus; i++)1121 for(i = 0; i < pDev->cCpus; i++) 1123 1122 { 1124 1123 if (apic->dest_mode == APIC_DESTMODE_FLAT) … … 1144 1143 1145 1144 #ifdef IN_RING3 1146 static void apic_init_ipi(APICDeviceInfo* dev, APICState *s)1145 static void apic_init_ipi(APICDeviceInfo* pDev, APICState *s) 1147 1146 { 1148 1147 int i; … … 1167 1166 1168 1167 1169 static void apicSendInitIpi(APICDeviceInfo* dev, APICState *s)1170 { 1171 apic_init_ipi( dev, s);1172 cpuSendInitIpi( dev, s);1168 static void apicSendInitIpi(APICDeviceInfo* pDev, APICState *s) 1169 { 1170 apic_init_ipi(pDev, s); 1171 cpuSendInitIpi(pDev, s); 1173 1172 } 1174 1173 1175 1174 /* send a SIPI message to the CPU to start it */ 1176 static void apic_startup(APICDeviceInfo* dev, APICState *s, int vector_num)1175 static void apic_startup(APICDeviceInfo* pDev, APICState *s, int vector_num) 1177 1176 { 1178 1177 Log(("[SMP] apic_startup: %d on CPUs %d\n", vector_num, s->phys_id)); 1179 cpuSendSipi( dev, s, vector_num);1178 cpuSendSipi(pDev, s, vector_num); 1180 1179 } 1181 1180 #endif /* IN_RING3 */ 1182 1181 1183 static int apic_deliver(APICDeviceInfo* dev, APICState *s,1182 static int apic_deliver(APICDeviceInfo* pDev, APICState *s, 1184 1183 uint8_t dest, uint8_t dest_mode, 1185 1184 uint8_t delivery_mode, uint8_t vector_num, … … 1193 1192 switch (dest_shorthand) { 1194 1193 case 0: 1195 deliver_bitmask = apic_get_delivery_bitmask( dev, dest, dest_mode);1194 deliver_bitmask = apic_get_delivery_bitmask(pDev, dest, dest_mode); 1196 1195 break; 1197 1196 case 1: … … 1212 1211 int level = (s->icr[0] >> 14) & 1; 1213 1212 if (level == 0 && trig_mode == 1) { 1214 foreach_apic( dev, deliver_bitmask,1213 foreach_apic(pDev, deliver_bitmask, 1215 1214 apic->arb_id = apic->id); 1216 1215 Log(("CPU%d: APIC_DM_INIT arbitration id(s) set\n", s->phys_id)); … … 1222 1221 case APIC_DM_SIPI: 1223 1222 # ifdef IN_RING3 1224 foreach_apic( dev, deliver_bitmask,1225 apic_startup( dev, apic, vector_num));1223 foreach_apic(pDev, deliver_bitmask, 1224 apic_startup(pDev, apic, vector_num)); 1226 1225 return VINF_SUCCESS; 1227 1226 # else … … 1232 1231 } 1233 1232 1234 return apic_bus_deliver( dev, deliver_bitmask, delivery_mode, vector_num,1233 return apic_bus_deliver(pDev, deliver_bitmask, delivery_mode, vector_num, 1235 1234 polarity, trigger_mode); 1236 1235 } … … 1239 1238 PDMBOTHCBDECL(int) apicGetInterrupt(PPDMDEVINS pDevIns) 1240 1239 { 1241 APICDeviceInfo * dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);1240 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 1242 1241 /* if the APIC is not installed or enabled, we let the 8259 handle the 1243 1242 IRQs */ 1244 if (! dev)1243 if (!pDev) 1245 1244 { 1246 1245 Log(("apic_get_interrupt: returns -1 (!s)\n")); … … 1248 1247 } 1249 1248 1250 Assert(PDMCritSectIsOwner( dev->CTX_SUFF(pCritSect)));1251 1252 APICState *s = getLapic( dev); /** @todo fix interface */1249 Assert(PDMCritSectIsOwner(pDev->CTX_SUFF(pCritSect))); 1250 1251 APICState *s = getLapic(pDev); /** @todo fix interface */ 1253 1252 int intno; 1254 1253 … … 1270 1269 reset_bit(s->irr, intno); 1271 1270 set_bit(s->isr, intno); 1272 apic_update_irq( dev, s);1271 apic_update_irq(pDev, s); 1273 1272 LogFlow(("CPU%d: apic_get_interrupt: returns %d\n", s->phys_id, intno)); 1274 1273 return intno; … … 1278 1277 * May return to ring-3 to acquire the TM and PDM lock. 1279 1278 */ 1280 static uint32_t apic_get_current_count(APICDeviceInfo * dev, APICState *s)1279 static uint32_t apic_get_current_count(APICDeviceInfo *pDev, APICState *s) 1281 1280 { 1282 1281 int64_t d; … … 1284 1283 1285 1284 /* Acquire the timer lock w/ lock order kludge. */ 1286 PDMCritSectLeave( dev->CTX_SUFF(pCritSect));1285 PDMCritSectLeave(pDev->CTX_SUFF(pCritSect)); 1287 1286 TMTimerLock(s->CTX_SUFF(pTimer), VINF_SUCCESS); 1288 PDMCritSectEnter( dev->CTX_SUFF(pCritSect), VINF_SUCCESS);1287 PDMCritSectEnter(pDev->CTX_SUFF(pCritSect), VINF_SUCCESS); 1289 1288 1290 1289 d = (TMTimerGet(s->CTX_SUFF(pTimer)) - s->initial_count_load_time) >> … … 1309 1308 * Does the frequency hinting and logging. 1310 1309 * 1311 * @param p ThisThe device state.1310 * @param pApic The device state. 1312 1311 */ 1313 DECLINLINE(void) apicDoFrequencyHinting(APICState *p This)1314 { 1315 if ( p This->uHintedInitialCount != pThis->initial_count1316 || p This->uHintedCountShift != (uint32_t)pThis->count_shift)1312 DECLINLINE(void) apicDoFrequencyHinting(APICState *pApic) 1313 { 1314 if ( pApic->uHintedInitialCount != pApic->initial_count 1315 || pApic->uHintedCountShift != (uint32_t)pApic->count_shift) 1317 1316 { 1318 p This->uHintedInitialCount = pThis->initial_count;1319 p This->uHintedCountShift = pThis->count_shift;1317 pApic->uHintedInitialCount = pApic->initial_count; 1318 pApic->uHintedCountShift = pApic->count_shift; 1320 1319 1321 1320 uint32_t uHz; 1322 if (p This->initial_count > 0)1321 if (pApic->initial_count > 0) 1323 1322 { 1324 Assert((unsigned)p This->count_shift < 30);1325 uint64_t cTickPerPeriod = ((uint64_t)p This->initial_count + 1) << pThis->count_shift;1326 uHz = TMTimerGetFreq(p This->CTX_SUFF(pTimer)) / cTickPerPeriod;1323 Assert((unsigned)pApic->count_shift < 30); 1324 uint64_t cTickPerPeriod = ((uint64_t)pApic->initial_count + 1) << pApic->count_shift; 1325 uHz = TMTimerGetFreq(pApic->CTX_SUFF(pTimer)) / cTickPerPeriod; 1327 1326 } 1328 1327 else 1329 1328 uHz = 0; 1330 TMTimerSetFrequencyHint(p This->CTX_SUFF(pTimer), uHz);1329 TMTimerSetFrequencyHint(pApic->CTX_SUFF(pTimer), uHz); 1331 1330 Log(("apic: %u Hz\n", uHz)); 1332 1331 } … … 1336 1335 * Implementation of the 0380h access: Timer reset + new initial count. 1337 1336 * 1338 * @param dev The device state.1339 * @param p ThisThe APIC sub-device state.1337 * @param pDev The device state. 1338 * @param pApic The APIC sub-device state. 1340 1339 * @param u32NewInitialCount The new initial count for the timer. 1341 1340 */ 1342 static void apicTimerSetInitialCount(APICDeviceInfo * dev, APICState *pThis, uint32_t u32NewInitialCount)1343 { 1344 STAM_COUNTER_INC(&p This->StatTimerSetInitialCount);1345 p This->initial_count = u32NewInitialCount;1341 static void apicTimerSetInitialCount(APICDeviceInfo *pDev, APICState *pApic, uint32_t u32NewInitialCount) 1342 { 1343 STAM_COUNTER_INC(&pApic->StatTimerSetInitialCount); 1344 pApic->initial_count = u32NewInitialCount; 1346 1345 1347 1346 /* … … 1349 1348 * a zero length one-shot timer. 1350 1349 */ 1351 if ( !(p This->lvt[APIC_LVT_TIMER] & APIC_LVT_MASKED)1350 if ( !(pApic->lvt[APIC_LVT_TIMER] & APIC_LVT_MASKED) 1352 1351 && u32NewInitialCount > 0) 1353 1352 { … … 1358 1357 uint64_t cTicksNext = u32NewInitialCount; 1359 1358 cTicksNext += 1; 1360 cTicksNext <<= pThis->count_shift; 1361 TMTimerSetRelative(pThis->CTX_SUFF(pTimer), cTicksNext, &pThis->initial_count_load_time); 1362 pThis->next_time = pThis->initial_count_load_time + cTicksNext; 1363 pThis->fTimerArmed = true; 1364 apicDoFrequencyHinting(pThis); 1365 STAM_COUNTER_INC(&pThis->StatTimerSetInitialCountArm); 1366 Log(("apicTimerSetInitialCount: cTicksNext=%'llu (%#llx) ic=%#x sh=%#x nxt=%#llx\n", cTicksNext, cTicksNext, u32NewInitialCount, pThis->count_shift, pThis->next_time)); 1359 cTicksNext <<= pApic->count_shift; 1360 TMTimerSetRelative(pApic->CTX_SUFF(pTimer), cTicksNext, &pApic->initial_count_load_time); 1361 pApic->next_time = pApic->initial_count_load_time + cTicksNext; 1362 pApic->fTimerArmed = true; 1363 apicDoFrequencyHinting(pApic); 1364 STAM_COUNTER_INC(&pApic->StatTimerSetInitialCountArm); 1365 Log(("apicTimerSetInitialCount: cTicksNext=%'llu (%#llx) ic=%#x sh=%#x nxt=%#llx\n", 1366 cTicksNext, cTicksNext, u32NewInitialCount, pApic->count_shift, pApic->next_time)); 1367 1367 } 1368 1368 else 1369 1369 { 1370 1370 /* Stop it if necessary and record the load time for unmasking. */ 1371 if (p This->fTimerArmed)1371 if (pApic->fTimerArmed) 1372 1372 { 1373 STAM_COUNTER_INC(&p This->StatTimerSetInitialCountDisarm);1374 TMTimerStop(p This->CTX_SUFF(pTimer));1375 p This->fTimerArmed = false;1376 p This->uHintedCountShift = pThis->uHintedInitialCount = 0;1373 STAM_COUNTER_INC(&pApic->StatTimerSetInitialCountDisarm); 1374 TMTimerStop(pApic->CTX_SUFF(pTimer)); 1375 pApic->fTimerArmed = false; 1376 pApic->uHintedCountShift = pApic->uHintedInitialCount = 0; 1377 1377 } 1378 p This->initial_count_load_time = TMTimerGet(pThis->CTX_SUFF(pTimer));1379 Log(("apicTimerSetInitialCount: ic=%#x sh=%#x iclt=%#llx\n", u32NewInitialCount, p This->count_shift, pThis->initial_count_load_time));1378 pApic->initial_count_load_time = TMTimerGet(pApic->CTX_SUFF(pTimer)); 1379 Log(("apicTimerSetInitialCount: ic=%#x sh=%#x iclt=%#llx\n", u32NewInitialCount, pApic->count_shift, pApic->initial_count_load_time)); 1380 1380 } 1381 1381 } … … 1384 1384 * Implementation of the 0320h access: change the LVT flags. 1385 1385 * 1386 * @param dev The device state.1387 * @param p ThisThe APIC sub-device state to operate on.1386 * @param pDev The device state. 1387 * @param pApic The APIC sub-device state to operate on. 1388 1388 * @param fNew The new flags. 1389 1389 */ 1390 static void apicTimerSetLvt(APICDeviceInfo * dev, APICState *pThis, uint32_t fNew)1391 { 1392 STAM_COUNTER_INC(&p This->StatTimerSetLvt);1390 static void apicTimerSetLvt(APICDeviceInfo *pDev, APICState *pApic, uint32_t fNew) 1391 { 1392 STAM_COUNTER_INC(&pApic->StatTimerSetLvt); 1393 1393 1394 1394 /* … … 1396 1396 * unnecessary work. 1397 1397 */ 1398 uint32_t const fOld = p This->lvt[APIC_LVT_TIMER];1399 p This->lvt[APIC_LVT_TIMER] = fNew;1398 uint32_t const fOld = pApic->lvt[APIC_LVT_TIMER]; 1399 pApic->lvt[APIC_LVT_TIMER] = fNew; 1400 1400 1401 1401 /* Only the masked and peridic bits are relevant (see apic_timer_update). */ … … 1413 1413 && !(fNew & APIC_LVT_TIMER_PERIODIC)) 1414 1414 { 1415 STAM_COUNTER_INC(&p This->StatTimerSetLvtClearPeriodic);1416 uint64_t cTicks = (p This->next_time - pThis->initial_count_load_time) >> pThis->count_shift;1417 if (cTicks >= p This->initial_count)1415 STAM_COUNTER_INC(&pApic->StatTimerSetLvtClearPeriodic); 1416 uint64_t cTicks = (pApic->next_time - pApic->initial_count_load_time) >> pApic->count_shift; 1417 if (cTicks >= pApic->initial_count) 1418 1418 { 1419 1419 /* not first period, stop it. */ 1420 TMTimerStop(p This->CTX_SUFF(pTimer));1421 p This->fTimerArmed = false;1422 p This->uHintedCountShift = pThis->uHintedInitialCount = 0;1420 TMTimerStop(pApic->CTX_SUFF(pTimer)); 1421 pApic->fTimerArmed = false; 1422 pApic->uHintedCountShift = pApic->uHintedInitialCount = 0; 1423 1423 } 1424 1424 /* else: first period, let it fire normally. */ … … 1431 1431 */ 1432 1432 if (fNew & APIC_LVT_MASKED) 1433 STAM_COUNTER_INC(&p This->StatTimerSetLvtPostponed);1434 else if (p This->fTimerArmed)1435 STAM_COUNTER_INC(&p This->StatTimerSetLvtArmed);1433 STAM_COUNTER_INC(&pApic->StatTimerSetLvtPostponed); 1434 else if (pApic->fTimerArmed) 1435 STAM_COUNTER_INC(&pApic->StatTimerSetLvtArmed); 1436 1436 /* 1437 1437 * If unmasked, not armed and with a valid initial count value (according … … 1442 1442 */ 1443 1443 else if ( (fOld & APIC_LVT_MASKED) 1444 && p This->initial_count > 0)1444 && pApic->initial_count > 0) 1445 1445 { 1446 STAM_COUNTER_INC(&p This->StatTimerSetLvtArm);1446 STAM_COUNTER_INC(&pApic->StatTimerSetLvtArm); 1447 1447 for (unsigned cTries = 0; ; cTries++) 1448 1448 { 1449 1449 uint64_t NextTS; 1450 uint64_t cTicks = (TMTimerGet(p This->CTX_SUFF(pTimer)) - pThis->initial_count_load_time) >> pThis->count_shift;1450 uint64_t cTicks = (TMTimerGet(pApic->CTX_SUFF(pTimer)) - pApic->initial_count_load_time) >> pApic->count_shift; 1451 1451 if (fNew & APIC_LVT_TIMER_PERIODIC) 1452 NextTS = ((cTicks / ((uint64_t)p This->initial_count + 1)) + 1) * ((uint64_t)pThis->initial_count + 1);1452 NextTS = ((cTicks / ((uint64_t)pApic->initial_count + 1)) + 1) * ((uint64_t)pApic->initial_count + 1); 1453 1453 else 1454 1454 { 1455 if (cTicks >= p This->initial_count)1455 if (cTicks >= pApic->initial_count) 1456 1456 break; 1457 NextTS = (uint64_t)p This->initial_count + 1;1457 NextTS = (uint64_t)pApic->initial_count + 1; 1458 1458 } 1459 NextTS <<= p This->count_shift;1460 NextTS += p This->initial_count_load_time;1459 NextTS <<= pApic->count_shift; 1460 NextTS += pApic->initial_count_load_time; 1461 1461 1462 1462 /* Try avoid the assertion in TM.cpp... this isn't perfect! */ 1463 if ( NextTS > TMTimerGet(p This->CTX_SUFF(pTimer))1463 if ( NextTS > TMTimerGet(pApic->CTX_SUFF(pTimer)) 1464 1464 || cTries > 10) 1465 1465 { 1466 TMTimerSet(p This->CTX_SUFF(pTimer), NextTS);1467 p This->next_time = NextTS;1468 p This->fTimerArmed = true;1469 apicDoFrequencyHinting(p This);1470 Log(("apicTimerSetLvt: ic=%#x sh=%#x nxt=%#llx\n", p This->initial_count, pThis->count_shift, pThis->next_time));1466 TMTimerSet(pApic->CTX_SUFF(pTimer), NextTS); 1467 pApic->next_time = NextTS; 1468 pApic->fTimerArmed = true; 1469 apicDoFrequencyHinting(pApic); 1470 Log(("apicTimerSetLvt: ic=%#x sh=%#x nxt=%#llx\n", pApic->initial_count, pApic->count_shift, pApic->next_time)); 1471 1471 break; 1472 1472 } 1473 STAM_COUNTER_INC(&p This->StatTimerSetLvtArmRetries);1473 STAM_COUNTER_INC(&pApic->StatTimerSetLvtArmRetries); 1474 1474 } 1475 1475 } 1476 1476 } 1477 1477 else 1478 STAM_COUNTER_INC(&p This->StatTimerSetLvtNoRelevantChange);1478 STAM_COUNTER_INC(&pApic->StatTimerSetLvtNoRelevantChange); 1479 1479 } 1480 1480 … … 1489 1489 static DECLCALLBACK(void) apicTimerCallback(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser) 1490 1490 { 1491 APICDeviceInfo * dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);1492 APICState *p This= (APICState *)pvUser;1493 Assert(p This->pTimerR3 == pTimer);1494 Assert(p This->fTimerArmed);1495 Assert(PDMCritSectIsOwned( dev->pCritSectR3));1491 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 1492 APICState *pApic = (APICState *)pvUser; 1493 Assert(pApic->pTimerR3 == pTimer); 1494 Assert(pApic->fTimerArmed); 1495 Assert(PDMCritSectIsOwned(pDev->pCritSectR3)); 1496 1496 Assert(TMTimerIsLockOwner(pTimer)); 1497 1497 1498 if (!(p This->lvt[APIC_LVT_TIMER] & APIC_LVT_MASKED)) {1498 if (!(pApic->lvt[APIC_LVT_TIMER] & APIC_LVT_MASKED)) { 1499 1499 LogFlow(("apic_timer: trigger irq\n")); 1500 apic_set_irq( dev, pThis, pThis->lvt[APIC_LVT_TIMER] & 0xff, APIC_TRIGGER_EDGE);1501 1502 if ( (p This->lvt[APIC_LVT_TIMER] & APIC_LVT_TIMER_PERIODIC)1503 && p This->initial_count > 0) {1500 apic_set_irq(pDev, pApic, pApic->lvt[APIC_LVT_TIMER] & 0xff, APIC_TRIGGER_EDGE); 1501 1502 if ( (pApic->lvt[APIC_LVT_TIMER] & APIC_LVT_TIMER_PERIODIC) 1503 && pApic->initial_count > 0) { 1504 1504 /* new interval. */ 1505 p This->next_time += (((uint64_t)pThis->initial_count + 1) << pThis->count_shift);1506 TMTimerSet(p This->CTX_SUFF(pTimer), pThis->next_time);1507 p This->fTimerArmed = true;1508 apicDoFrequencyHinting(p This);1509 Log2(("apicTimerCallback: ic=%#x sh=%#x nxt=%#llx\n", p This->initial_count, pThis->count_shift, pThis->next_time));1505 pApic->next_time += (((uint64_t)pApic->initial_count + 1) << pApic->count_shift); 1506 TMTimerSet(pApic->CTX_SUFF(pTimer), pApic->next_time); 1507 pApic->fTimerArmed = true; 1508 apicDoFrequencyHinting(pApic); 1509 Log2(("apicTimerCallback: ic=%#x sh=%#x nxt=%#llx\n", pApic->initial_count, pApic->count_shift, pApic->next_time)); 1510 1510 } else { 1511 1511 /* single shot or disabled. */ 1512 p This->fTimerArmed = false;1513 p This->uHintedCountShift = pThis->uHintedInitialCount = 0;1512 pApic->fTimerArmed = false; 1513 pApic->uHintedCountShift = pApic->uHintedInitialCount = 0; 1514 1514 } 1515 1515 } else { 1516 1516 /* masked, do not rearm. */ 1517 p This->fTimerArmed = false;1518 p This->uHintedCountShift = pThis->uHintedInitialCount = 0;1517 pApic->fTimerArmed = false; 1518 pApic->uHintedCountShift = pApic->uHintedInitialCount = 0; 1519 1519 } 1520 1520 } 1521 1521 # endif /* IN_RING3 */ 1522 1522 1523 static uint32_t apic_mem_readl(APICDeviceInfo* dev, APICState *s, RTGCPHYS addr)1523 static uint32_t apic_mem_readl(APICDeviceInfo* pDev, APICState *s, RTGCPHYS addr) 1524 1524 { 1525 1525 uint32_t val; … … 1582 1582 break; 1583 1583 case 0x39: 1584 val = apic_get_current_count( dev, s);1584 val = apic_get_current_count(pDev, s); 1585 1585 break; 1586 1586 case 0x3e: … … 1926 1926 PDMBOTHCBDECL(int) apicMMIORead(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, void *pv, unsigned cb) 1927 1927 { 1928 APICDeviceInfo * dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);1929 APICState *s = getLapic( dev);1928 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 1929 APICState *s = getLapic(pDev); 1930 1930 1931 1931 Log(("CPU%d: apicMMIORead at %llx\n", s->phys_id, (uint64_t)GCPhysAddr)); … … 1934 1934 different physical addresses, see #3092) */ 1935 1935 1936 STAM_COUNTER_INC(&CTXSUFF( dev->StatMMIORead));1936 STAM_COUNTER_INC(&CTXSUFF(pDev->StatMMIORead)); 1937 1937 switch (cb) 1938 1938 { … … 1964 1964 #endif 1965 1965 #endif /* experimental */ 1966 APIC_LOCK( dev, VINF_IOM_HC_MMIO_READ);1967 *(uint32_t *)pv = apic_mem_readl( dev, s, GCPhysAddr);1968 APIC_UNLOCK( dev);1966 APIC_LOCK(pDev, VINF_IOM_HC_MMIO_READ); 1967 *(uint32_t *)pv = apic_mem_readl(pDev, s, GCPhysAddr); 1968 APIC_UNLOCK(pDev); 1969 1969 break; 1970 1970 } … … 1978 1978 PDMBOTHCBDECL(int) apicMMIOWrite(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, void *pv, unsigned cb) 1979 1979 { 1980 APICDeviceInfo * dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);1981 APICState *s = getLapic( dev);1980 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 1981 APICState *s = getLapic(pDev); 1982 1982 1983 1983 Log(("CPU%d: apicMMIOWrite at %llx\n", s->phys_id, (uint64_t)GCPhysAddr)); … … 1986 1986 different physical addresses, see #3092) */ 1987 1987 1988 STAM_COUNTER_INC(&CTXSUFF( dev->StatMMIOWrite));1988 STAM_COUNTER_INC(&CTXSUFF(pDev->StatMMIOWrite)); 1989 1989 switch (cb) 1990 1990 { … … 1996 1996 case 4: 1997 1997 /* It does its own locking. */ 1998 return acpiWriteRegister( dev, s, (GCPhysAddr >> 4) & 0xff, *(uint32_t const *)pv,1998 return acpiWriteRegister(pDev, s, (GCPhysAddr >> 4) & 0xff, *(uint32_t const *)pv, 1999 1999 VINF_IOM_HC_MMIO_WRITE, false /*fMsr*/); 2000 2000 … … 2009 2009 2010 2010 /* Print a 8-dword LAPIC bit map (256 bits). */ 2011 static void lapicDumpVec(APICDeviceInfo * dev, APICState *lapic, PCDBGFINFOHLP pHlp, unsigned start)2011 static void lapicDumpVec(APICDeviceInfo *pDev, APICState *lapic, PCDBGFINFOHLP pHlp, unsigned start) 2012 2012 { 2013 2013 unsigned i; … … 2016 2016 for (i = 0; i < 8; ++i) 2017 2017 { 2018 val = apic_mem_readl( dev, lapic, start + (i << 4));2018 val = apic_mem_readl(pDev, lapic, start + (i << 4)); 2019 2019 pHlp->pfnPrintf(pHlp, "%08X", val); 2020 2020 } … … 2023 2023 2024 2024 /* Print basic LAPIC state. */ 2025 static DECLCALLBACK(void) lapicInfoBasic(APICDeviceInfo * dev, APICState *lapic, PCDBGFINFOHLP pHlp)2025 static DECLCALLBACK(void) lapicInfoBasic(APICDeviceInfo *pDev, APICState *lapic, PCDBGFINFOHLP pHlp) 2026 2026 { 2027 2027 uint32_t val; … … 2029 2029 2030 2030 pHlp->pfnPrintf(pHlp, "Local APIC at %08X:\n", lapic->apicbase); 2031 val = apic_mem_readl( dev, lapic, 0x20);2031 val = apic_mem_readl(pDev, lapic, 0x20); 2032 2032 pHlp->pfnPrintf(pHlp, " LAPIC ID : %08X\n", val); 2033 2033 pHlp->pfnPrintf(pHlp, " APIC ID = %02X\n", (val >> 24) & 0xff); 2034 val = apic_mem_readl( dev, lapic, 0x30);2034 val = apic_mem_readl(pDev, lapic, 0x30); 2035 2035 max_lvt = (val >> 16) & 0xff; 2036 2036 pHlp->pfnPrintf(pHlp, " APIC VER : %08X\n", val); 2037 2037 pHlp->pfnPrintf(pHlp, " version = %02X\n", val & 0xff); 2038 2038 pHlp->pfnPrintf(pHlp, " lvts = %d\n", ((val >> 16) & 0xff) + 1); 2039 val = apic_mem_readl( dev, lapic, 0x80);2039 val = apic_mem_readl(pDev, lapic, 0x80); 2040 2040 pHlp->pfnPrintf(pHlp, " TPR : %08X\n", val); 2041 2041 pHlp->pfnPrintf(pHlp, " task pri = %d/%d\n", (val >> 4) & 0xf, val & 0xf); 2042 val = apic_mem_readl( dev, lapic, 0xA0);2042 val = apic_mem_readl(pDev, lapic, 0xA0); 2043 2043 pHlp->pfnPrintf(pHlp, " PPR : %08X\n", val); 2044 2044 pHlp->pfnPrintf(pHlp, " cpu pri = %d/%d\n", (val >> 4) & 0xf, val & 0xf); 2045 val = apic_mem_readl( dev, lapic, 0xD0);2045 val = apic_mem_readl(pDev, lapic, 0xD0); 2046 2046 pHlp->pfnPrintf(pHlp, " LDR : %08X\n", val); 2047 2047 pHlp->pfnPrintf(pHlp, " log id = %02X\n", (val >> 24) & 0xff); 2048 val = apic_mem_readl( dev, lapic, 0xE0);2048 val = apic_mem_readl(pDev, lapic, 0xE0); 2049 2049 pHlp->pfnPrintf(pHlp, " DFR : %08X\n", val); 2050 val = apic_mem_readl( dev, lapic, 0xF0);2050 val = apic_mem_readl(pDev, lapic, 0xF0); 2051 2051 pHlp->pfnPrintf(pHlp, " SVR : %08X\n", val); 2052 2052 pHlp->pfnPrintf(pHlp, " focus = %s\n", val & (1 << 9) ? "check off" : "check on"); … … 2054 2054 pHlp->pfnPrintf(pHlp, " vector = %02X\n", val & 0xff); 2055 2055 pHlp->pfnPrintf(pHlp, " ISR : "); 2056 lapicDumpVec( dev, lapic, pHlp, 0x100);2056 lapicDumpVec(pDev, lapic, pHlp, 0x100); 2057 2057 val = get_highest_priority_int(lapic->isr); 2058 2058 pHlp->pfnPrintf(pHlp, " highest = %02X\n", val == ~0U ? 0 : val); 2059 2059 pHlp->pfnPrintf(pHlp, " IRR : "); 2060 lapicDumpVec( dev, lapic, pHlp, 0x200);2060 lapicDumpVec(pDev, lapic, pHlp, 0x200); 2061 2061 val = get_highest_priority_int(lapic->irr); 2062 2062 pHlp->pfnPrintf(pHlp, " highest = %02X\n", val == ~0U ? 0 : val); 2063 val = apic_mem_readl( dev, lapic, 0x320);2063 val = apic_mem_readl(pDev, lapic, 0x320); 2064 2064 } 2065 2065 2066 2066 /* Print the more interesting LAPIC LVT entries. */ 2067 static DECLCALLBACK(void) lapicInfoLVT(APICDeviceInfo * dev, APICState *lapic, PCDBGFINFOHLP pHlp)2067 static DECLCALLBACK(void) lapicInfoLVT(APICDeviceInfo *pDev, APICState *lapic, PCDBGFINFOHLP pHlp) 2068 2068 { 2069 2069 uint32_t val; … … 2071 2071 "NMI", "INIT", "Reserved", "ExtINT" }; 2072 2072 2073 val = apic_mem_readl( dev, lapic, 0x320);2073 val = apic_mem_readl(pDev, lapic, 0x320); 2074 2074 pHlp->pfnPrintf(pHlp, " LVT Timer : %08X\n", val); 2075 2075 pHlp->pfnPrintf(pHlp, " mode = %s\n", val & (1 << 17) ? "periodic" : "one-shot"); … … 2077 2077 pHlp->pfnPrintf(pHlp, " status = %s\n", val & (1 << 12) ? "pending" : "idle"); 2078 2078 pHlp->pfnPrintf(pHlp, " vector = %02X\n", val & 0xff); 2079 val = apic_mem_readl( dev, lapic, 0x350);2079 val = apic_mem_readl(pDev, lapic, 0x350); 2080 2080 pHlp->pfnPrintf(pHlp, " LVT LINT0 : %08X\n", val); 2081 2081 pHlp->pfnPrintf(pHlp, " mask = %d\n", (val >> 16) & 1); … … 2086 2086 pHlp->pfnPrintf(pHlp, " delivry = %s\n", dmodes[(val >> 8) & 7]); 2087 2087 pHlp->pfnPrintf(pHlp, " vector = %02X\n", val & 0xff); 2088 val = apic_mem_readl( dev, lapic, 0x360);2088 val = apic_mem_readl(pDev, lapic, 0x360); 2089 2089 pHlp->pfnPrintf(pHlp, " LVT LINT1 : %08X\n", val); 2090 2090 pHlp->pfnPrintf(pHlp, " mask = %d\n", (val >> 16) & 1); … … 2098 2098 2099 2099 /* Print LAPIC timer state. */ 2100 static DECLCALLBACK(void) lapicInfoTimer(APICDeviceInfo * dev, APICState *lapic, PCDBGFINFOHLP pHlp)2100 static DECLCALLBACK(void) lapicInfoTimer(APICDeviceInfo *pDev, APICState *lapic, PCDBGFINFOHLP pHlp) 2101 2101 { 2102 2102 uint32_t val; … … 2104 2104 2105 2105 pHlp->pfnPrintf(pHlp, "Local APIC timer:\n"); 2106 val = apic_mem_readl( dev, lapic, 0x380);2106 val = apic_mem_readl(pDev, lapic, 0x380); 2107 2107 pHlp->pfnPrintf(pHlp, " Initial count : %08X\n", val); 2108 val = apic_mem_readl( dev, lapic, 0x390);2108 val = apic_mem_readl(pDev, lapic, 0x390); 2109 2109 pHlp->pfnPrintf(pHlp, " Current count : %08X\n", val); 2110 val = apic_mem_readl( dev, lapic, 0x3E0);2110 val = apic_mem_readl(pDev, lapic, 0x3E0); 2111 2111 pHlp->pfnPrintf(pHlp, " Divide config : %08X\n", val); 2112 2112 divider = ((val >> 1) & 0x04) | (val & 0x03); … … 2123 2123 static DECLCALLBACK(void) lapicInfo(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs) 2124 2124 { 2125 APICDeviceInfo * dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);2125 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 2126 2126 APICState *lapic; 2127 2127 2128 lapic = getLapic( dev);2128 lapic = getLapic(pDev); 2129 2129 2130 2130 if (pszArgs == NULL || !strcmp(pszArgs, "basic")) 2131 2131 { 2132 lapicInfoBasic( dev, lapic, pHlp);2132 lapicInfoBasic(pDev, lapic, pHlp); 2133 2133 } 2134 2134 else if (!strcmp(pszArgs, "lvt")) 2135 2135 { 2136 lapicInfoLVT( dev, lapic, pHlp);2136 lapicInfoLVT(pDev, lapic, pHlp); 2137 2137 } 2138 2138 else if (!strcmp(pszArgs, "timer")) 2139 2139 { 2140 lapicInfoTimer( dev, lapic, pHlp);2140 lapicInfoTimer(pDev, lapic, pHlp); 2141 2141 } 2142 2142 else … … 2151 2151 static DECLCALLBACK(int) apicLiveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uPass) 2152 2152 { 2153 APICDeviceInfo *p This= PDMINS_2_DATA(pDevIns, APICDeviceInfo *);2154 2155 SSMR3PutU32( pSSM, p This->cCpus);2156 SSMR3PutBool(pSSM, p This->fIoApic);2157 SSMR3PutU32( pSSM, p This->enmVersion);2153 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 2154 2155 SSMR3PutU32( pSSM, pDev->cCpus); 2156 SSMR3PutBool(pSSM, pDev->fIoApic); 2157 SSMR3PutU32( pSSM, pDev->enmVersion); 2158 2158 AssertCompile(PDMAPICVERSION_APIC == 2); 2159 2159 … … 2166 2166 static DECLCALLBACK(int) apicSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 2167 2167 { 2168 APICDeviceInfo * dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);2168 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 2169 2169 2170 2170 /* config */ … … 2172 2172 2173 2173 /* save all APICs data, @todo: is it correct? */ 2174 foreach_apic( dev, 0xffffffff, apic_save(pSSM, apic));2174 foreach_apic(pDev, 0xffffffff, apic_save(pSSM, apic)); 2175 2175 2176 2176 return VINF_SUCCESS; … … 2182 2182 static DECLCALLBACK(int) apicLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass) 2183 2183 { 2184 APICDeviceInfo *p This= PDMINS_2_DATA(pDevIns, APICDeviceInfo *);2184 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 2185 2185 2186 2186 if ( uVersion != APIC_SAVED_STATE_VERSION … … 2193 2193 uint32_t cCpus; 2194 2194 int rc = SSMR3GetU32(pSSM, &cCpus); AssertRCReturn(rc, rc); 2195 if (cCpus != p This->cCpus)2196 return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - cCpus: saved=%#x config=%#x"), cCpus, p This->cCpus);2195 if (cCpus != pDev->cCpus) 2196 return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - cCpus: saved=%#x config=%#x"), cCpus, pDev->cCpus); 2197 2197 bool fIoApic; 2198 2198 rc = SSMR3GetBool(pSSM, &fIoApic); AssertRCReturn(rc, rc); 2199 if (fIoApic != p This->fIoApic)2200 return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - fIoApic: saved=%RTbool config=%RTbool"), fIoApic, p This->fIoApic);2199 if (fIoApic != pDev->fIoApic) 2200 return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - fIoApic: saved=%RTbool config=%RTbool"), fIoApic, pDev->fIoApic); 2201 2201 uint32_t uApicVersion; 2202 2202 rc = SSMR3GetU32(pSSM, &uApicVersion); AssertRCReturn(rc, rc); 2203 if (uApicVersion != (uint32_t)p This->enmVersion)2204 return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - uApicVersion: saved=%#x config=%#x"), uApicVersion, p This->enmVersion);2203 if (uApicVersion != (uint32_t)pDev->enmVersion) 2204 return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Config mismatch - uApicVersion: saved=%#x config=%#x"), uApicVersion, pDev->enmVersion); 2205 2205 } 2206 2206 … … 2209 2209 2210 2210 /* load all APICs data */ /** @todo: is it correct? */ 2211 APIC_LOCK(p This, VERR_INTERNAL_ERROR_3);2212 foreach_apic(p This, 0xffffffff,2211 APIC_LOCK(pDev, VERR_INTERNAL_ERROR_3); 2212 foreach_apic(pDev, 0xffffffff, 2213 2213 if (apic_load(pSSM, apic, uVersion)) { 2214 2214 AssertFailed(); 2215 APIC_UNLOCK(p This);2215 APIC_UNLOCK(pDev); 2216 2216 return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION; 2217 2217 } 2218 2218 ); 2219 APIC_UNLOCK(p This);2219 APIC_UNLOCK(pDev); 2220 2220 return VINF_SUCCESS; 2221 2221 } … … 2226 2226 static DECLCALLBACK(void) apicReset(PPDMDEVINS pDevIns) 2227 2227 { 2228 APICDeviceInfo *dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 2229 unsigned i; 2230 2231 APIC_LOCK_VOID(dev, VERR_INTERNAL_ERROR); 2228 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 2229 APIC_LOCK_VOID(pDev, VERR_INTERNAL_ERROR); 2232 2230 2233 2231 /* Reset all APICs. */ 2234 for ( i = 0; i < dev->cCpus; i++) {2235 APICState *pApic = & dev->CTX_SUFF(paLapics)[i];2232 for (VMCPUID i = 0; i < pDev->cCpus; i++) { 2233 APICState *pApic = &pDev->CTX_SUFF(paLapics)[i]; 2236 2234 TMTimerStop(pApic->CTX_SUFF(pTimer)); 2237 2235 2238 2236 /* Clear LAPIC state as if an INIT IPI was sent. */ 2239 apic_init_ipi( dev, pApic);2237 apic_init_ipi(pDev, pApic); 2240 2238 /* The IDs are not touched by apic_init_ipi() and must be reset now. */ 2241 2239 pApic->arb_id = pApic->id = i; … … 2247 2245 2248 2246 /* Clear any pending APIC interrupt action flag. */ 2249 cpuClearInterrupt( dev, pApic);2247 cpuClearInterrupt(pDev, pApic); 2250 2248 } 2251 2249 /** @todo r=bird: Why is this done everytime, while the constructor first 2252 2250 * checks the CPUID? Who is right? */ 2253 dev->pApicHlpR3->pfnChangeFeature(dev->pDevInsR3, dev->enmVersion);2254 2255 APIC_UNLOCK( dev);2251 pDev->pApicHlpR3->pfnChangeFeature(pDev->pDevInsR3, pDev->enmVersion); 2252 2253 APIC_UNLOCK(pDev); 2256 2254 } 2257 2255 … … 2261 2259 static DECLCALLBACK(void) apicRelocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta) 2262 2260 { 2263 APICDeviceInfo *p This= PDMINS_2_DATA(pDevIns, APICDeviceInfo *);2264 p This->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns);2265 p This->pApicHlpRC = pThis->pApicHlpR3->pfnGetRCHelpers(pDevIns);2266 p This->paLapicsRC = MMHyperR3ToRC(PDMDevHlpGetVM(pDevIns), pThis->paLapicsR3);2267 p This->pCritSectRC = pThis->pApicHlpR3->pfnGetRCCritSect(pDevIns);2268 for (uint32_t i = 0; i < p This->cCpus; i++)2269 p This->paLapicsR3[i].pTimerRC = TMTimerRCPtr(pThis->paLapicsR3[i].pTimerR3);2261 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 2262 pDev->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns); 2263 pDev->pApicHlpRC = pDev->pApicHlpR3->pfnGetRCHelpers(pDevIns); 2264 pDev->paLapicsRC = MMHyperR3ToRC(PDMDevHlpGetVM(pDevIns), pDev->paLapicsR3); 2265 pDev->pCritSectRC = pDev->pApicHlpR3->pfnGetRCCritSect(pDevIns); 2266 for (uint32_t i = 0; i < pDev->cCpus; i++) 2267 pDev->paLapicsR3[i].pTimerRC = TMTimerRCPtr(pDev->paLapicsR3[i].pTimerR3); 2270 2268 } 2271 2269 … … 2297 2295 bool fGCEnabled; 2298 2296 bool fR0Enabled; 2299 APICDeviceInfo *pThis= PDMINS_2_DATA(pDevIns, APICDeviceInfo *);2297 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 2300 2298 uint32_t cCpus; 2301 2299 … … 2346 2344 * Init the data. 2347 2345 */ 2348 p This->pDevInsR3 = pDevIns;2349 p This->pDevInsR0 = PDMDEVINS_2_R0PTR(pDevIns);2350 p This->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns);2351 p This->cCpus = cCpus;2352 p This->fIoApic = fIoApic;2346 pDev->pDevInsR3 = pDevIns; 2347 pDev->pDevInsR0 = PDMDEVINS_2_R0PTR(pDevIns); 2348 pDev->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns); 2349 pDev->cCpus = cCpus; 2350 pDev->fIoApic = fIoApic; 2353 2351 /* Use PDMAPICVERSION_X2APIC to activate x2APIC mode */ 2354 p This->enmVersion = PDMAPICVERSION_APIC;2352 pDev->enmVersion = PDMAPICVERSION_APIC; 2355 2353 2356 2354 /* Disable locking in this device. */ … … 2363 2361 * We are not freeing this memory, as it's automatically released when guest exits. 2364 2362 */ 2365 rc = MMHyperAlloc(pVM, cCpus * sizeof(APICState), 1, MM_TAG_PDM_DEVICE_USER, (void **)&p This->paLapicsR3);2363 rc = MMHyperAlloc(pVM, cCpus * sizeof(APICState), 1, MM_TAG_PDM_DEVICE_USER, (void **)&pDev->paLapicsR3); 2366 2364 if (RT_FAILURE(rc)) 2367 2365 return VERR_NO_MEMORY; 2368 p This->paLapicsR0 = MMHyperR3ToR0(pVM, pThis->paLapicsR3);2369 p This->paLapicsRC = MMHyperR3ToRC(pVM, pThis->paLapicsR3);2366 pDev->paLapicsR0 = MMHyperR3ToR0(pVM, pDev->paLapicsR3); 2367 pDev->paLapicsRC = MMHyperR3ToRC(pVM, pDev->paLapicsR3); 2370 2368 2371 2369 for (i = 0; i < cCpus; i++) 2372 initApicData(&p This->paLapicsR3[i], i);2370 initApicData(&pDev->paLapicsR3[i], i); 2373 2371 2374 2372 /* … … 2433 2431 } 2434 2432 2435 rc = PDMDevHlpAPICRegister(pDevIns, &ApicReg, &p This->pApicHlpR3);2433 rc = PDMDevHlpAPICRegister(pDevIns, &ApicReg, &pDev->pApicHlpR3); 2436 2434 AssertLogRelRCReturn(rc, rc); 2437 p This->pCritSectR3 = pThis->pApicHlpR3->pfnGetR3CritSect(pDevIns);2435 pDev->pCritSectR3 = pDev->pApicHlpR3->pfnGetR3CritSect(pDevIns); 2438 2436 2439 2437 /* … … 2452 2450 && u32Edx == X86_CPUID_VENDOR_AMD_EDX /* AuthenticAMD */)) { 2453 2451 LogRel(("Activating Local APIC\n")); 2454 p This->pApicHlpR3->pfnChangeFeature(pDevIns, pThis->enmVersion);2452 pDev->pApicHlpR3->pfnChangeFeature(pDevIns, pDev->enmVersion); 2455 2453 } 2456 2454 } … … 2460 2458 * @todo: shall reregister, if base changes. 2461 2459 */ 2462 uint32_t ApicBase = p This->paLapicsR3[0].apicbase & ~0xfff;2463 rc = PDMDevHlpMMIORegister(pDevIns, ApicBase, 0x1000, p This,2460 uint32_t ApicBase = pDev->paLapicsR3[0].apicbase & ~0xfff; 2461 rc = PDMDevHlpMMIORegister(pDevIns, ApicBase, 0x1000, pDev, 2464 2462 apicMMIOWrite, apicMMIORead, NULL, "APIC Memory"); 2465 2463 if (RT_FAILURE(rc)) … … 2467 2465 2468 2466 if (fGCEnabled) { 2469 p This->pApicHlpRC = pThis->pApicHlpR3->pfnGetRCHelpers(pDevIns);2470 p This->pCritSectRC = pThis->pApicHlpR3->pfnGetRCCritSect(pDevIns);2467 pDev->pApicHlpRC = pDev->pApicHlpR3->pfnGetRCHelpers(pDevIns); 2468 pDev->pCritSectRC = pDev->pApicHlpR3->pfnGetRCCritSect(pDevIns); 2471 2469 2472 2470 rc = PDMDevHlpMMIORegisterRC(pDevIns, ApicBase, 0x1000, 0, … … 2477 2475 2478 2476 if (fR0Enabled) { 2479 p This->pApicHlpR0 = pThis->pApicHlpR3->pfnGetR0Helpers(pDevIns);2480 p This->pCritSectR0 = pThis->pApicHlpR3->pfnGetR0CritSect(pDevIns);2477 pDev->pApicHlpR0 = pDev->pApicHlpR3->pfnGetR0Helpers(pDevIns); 2478 pDev->pCritSectR0 = pDev->pApicHlpR3->pfnGetR0CritSect(pDevIns); 2481 2479 2482 2480 rc = PDMDevHlpMMIORegisterR0(pDevIns, ApicBase, 0x1000, 0, … … 2490 2488 */ 2491 2489 for (i = 0; i < cCpus; i++) { 2492 APICState *pApic = &p This->paLapicsR3[i];2490 APICState *pApic = &pDev->paLapicsR3[i]; 2493 2491 pApic->pszDesc = MMR3HeapAPrintf(pVM, MM_TAG_PDM_DEVICE_USER, "APIC Timer #%u", i); 2494 2492 rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL_SYNC, apicTimerCallback, pApic, … … 2498 2496 pApic->pTimerR0 = TMTimerR0Ptr(pApic->pTimerR3); 2499 2497 pApic->pTimerRC = TMTimerRCPtr(pApic->pTimerR3); 2500 TMR3TimerSetCritSect(pApic->pTimerR3, p This->pCritSectR3);2498 TMR3TimerSetCritSect(pApic->pTimerR3, pDev->pCritSectR3); 2501 2499 } 2502 2500 … … 2504 2502 * Saved state. 2505 2503 */ 2506 rc = PDMDevHlpSSMRegister3(pDevIns, APIC_SAVED_STATE_VERSION, sizeof(*p This),2504 rc = PDMDevHlpSSMRegister3(pDevIns, APIC_SAVED_STATE_VERSION, sizeof(*pDev), 2507 2505 apicLiveExec, apicSaveExec, apicLoadExec); 2508 2506 if (RT_FAILURE(rc)) … … 2519 2517 * Statistics. 2520 2518 */ 2521 PDMDevHlpSTAMRegister(pDevIns, &p This->StatMMIOReadGC, STAMTYPE_COUNTER, "/Devices/APIC/MMIOReadGC", STAMUNIT_OCCURENCES, "Number of APIC MMIO reads in GC.");2522 PDMDevHlpSTAMRegister(pDevIns, &p This->StatMMIOReadHC, STAMTYPE_COUNTER, "/Devices/APIC/MMIOReadHC", STAMUNIT_OCCURENCES, "Number of APIC MMIO reads in HC.");2523 PDMDevHlpSTAMRegister(pDevIns, &p This->StatMMIOWriteGC, STAMTYPE_COUNTER, "/Devices/APIC/MMIOWriteGC", STAMUNIT_OCCURENCES, "Number of APIC MMIO writes in GC.");2524 PDMDevHlpSTAMRegister(pDevIns, &p This->StatMMIOWriteHC, STAMTYPE_COUNTER, "/Devices/APIC/MMIOWriteHC", STAMUNIT_OCCURENCES, "Number of APIC MMIO writes in HC.");2525 PDMDevHlpSTAMRegister(pDevIns, &p This->StatClearedActiveIrq,STAMTYPE_COUNTER, "/Devices/APIC/MaskedActiveIRQ", STAMUNIT_OCCURENCES, "Number of cleared irqs.");2519 PDMDevHlpSTAMRegister(pDevIns, &pDev->StatMMIOReadGC, STAMTYPE_COUNTER, "/Devices/APIC/MMIOReadGC", STAMUNIT_OCCURENCES, "Number of APIC MMIO reads in GC."); 2520 PDMDevHlpSTAMRegister(pDevIns, &pDev->StatMMIOReadHC, STAMTYPE_COUNTER, "/Devices/APIC/MMIOReadHC", STAMUNIT_OCCURENCES, "Number of APIC MMIO reads in HC."); 2521 PDMDevHlpSTAMRegister(pDevIns, &pDev->StatMMIOWriteGC, STAMTYPE_COUNTER, "/Devices/APIC/MMIOWriteGC", STAMUNIT_OCCURENCES, "Number of APIC MMIO writes in GC."); 2522 PDMDevHlpSTAMRegister(pDevIns, &pDev->StatMMIOWriteHC, STAMTYPE_COUNTER, "/Devices/APIC/MMIOWriteHC", STAMUNIT_OCCURENCES, "Number of APIC MMIO writes in HC."); 2523 PDMDevHlpSTAMRegister(pDevIns, &pDev->StatClearedActiveIrq,STAMTYPE_COUNTER, "/Devices/APIC/MaskedActiveIRQ", STAMUNIT_OCCURENCES, "Number of cleared irqs."); 2526 2524 for (i = 0; i < cCpus; i++) { 2527 APICState *pApic = &p This->paLapicsR3[i];2525 APICState *pApic = &pDev->paLapicsR3[i]; 2528 2526 PDMDevHlpSTAMRegisterF(pDevIns, &pApic->StatTimerSetInitialCount, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, "Calls to apicTimerSetInitialCount.", "/Devices/APIC/%u/TimerSetInitialCount", i); 2529 2527 PDMDevHlpSTAMRegisterF(pDevIns, &pApic->StatTimerSetInitialCountArm, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES, "TMTimerSetRelative calls.", "/Devices/APIC/%u/TimerSetInitialCount/Arm", i);
Note:
See TracChangeset
for help on using the changeset viewer.