Changeset 37453 in vbox
- Timestamp:
- Jun 14, 2011 6:15:11 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 72260
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/DevAPIC.cpp
r37324 r37453 338 338 * Internal Functions * 339 339 *******************************************************************************/ 340 RT_C_DECLS_BEGIN341 PDMBOTHCBDECL(int) apicMMIORead(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, void *pv, unsigned cb);342 PDMBOTHCBDECL(int) apicMMIOWrite(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, void *pv, unsigned cb);343 PDMBOTHCBDECL(int) apicGetInterrupt(PPDMDEVINS pDevIns);344 PDMBOTHCBDECL(bool) apicHasPendingIrq(PPDMDEVINS pDevIns);345 PDMBOTHCBDECL(void) apicSetBase(PPDMDEVINS pDevIns, uint64_t val);346 PDMBOTHCBDECL(uint64_t) apicGetBase(PPDMDEVINS pDevIns);347 PDMBOTHCBDECL(void) apicSetTPR(PPDMDEVINS pDevIns, VMCPUID idCpu, uint8_t val);348 PDMBOTHCBDECL(uint8_t) apicGetTPR(PPDMDEVINS pDevIns, VMCPUID idCpu);349 PDMBOTHCBDECL(int) apicBusDeliverCallback(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode,350 uint8_t u8DeliveryMode, uint8_t iVector, uint8_t u8Polarity,351 uint8_t u8TriggerMode);352 PDMBOTHCBDECL(int) apicLocalInterrupt(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level);353 PDMBOTHCBDECL(int) apicWriteMSR(PPDMDEVINS pDevIns, VMCPUID iCpu, uint32_t u32Reg, uint64_t u64Value);354 PDMBOTHCBDECL(int) apicReadMSR(PPDMDEVINS pDevIns, VMCPUID iCpu, uint32_t u32Reg, uint64_t *pu64Value);355 PDMBOTHCBDECL(int) ioapicMMIORead(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, void *pv, unsigned cb);356 PDMBOTHCBDECL(int) ioapicMMIOWrite(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, void *pv, unsigned cb);357 PDMBOTHCBDECL(void) ioapicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel);358 PDMBOTHCBDECL(void) ioapicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue);359 360 340 static void apic_update_tpr(APICDeviceInfo *dev, APICState* s, uint32_t val); 361 RT_C_DECLS_END362 341 363 342 static void apic_eoi(APICDeviceInfo *dev, APICState* s); /* */ … … 720 699 return VERR_EM_INTERPRETER; 721 700 722 uint32_t index = (u32Reg - MSR_IA32_APIC_START) & 0xff; 723 APICState* apic = getLapicById(dev, idCpu); 724 uint64_t val = 0; 701 uint32_t index = (u32Reg - MSR_IA32_APIC_START) & 0xff; 702 APICState *apic = getLapicById(dev, idCpu); 703 uint64_t val = 0; 704 int rc = VINF_SUCCESS; 725 705 726 706 switch (index) … … 730 710 break; 731 711 case 0x03: /* version */ 732 val = APIC_HW_VERSION |733 ((APIC_LVT_NB - 1) << 16) /* Max LVT index */ |734 712 val = APIC_HW_VERSION 713 | ((APIC_LVT_NB - 1) << 16) /* Max LVT index */ 714 | (0 << 24) /* Support for EOI broadcast suppression */; 735 715 break; 736 716 case 0x08: … … 756 736 case 0x0f: 757 737 val = apic->spurious_vec; 758 break;738 break; 759 739 case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: 760 740 val = apic->isr[index & 7]; … … 804 784 } 805 785 *pu64Value = val; 806 return VINF_SUCCESS;786 return rc; 807 787 } 808 788 … … 1220 1200 } 1221 1201 1202 /** 1203 * May return to ring-3 to acquire the TM and PDM lock. 1204 */ 1222 1205 static uint32_t apic_get_current_count(APICDeviceInfo *dev, APICState *s) 1223 1206 { 1224 1207 int64_t d; 1225 1208 uint32_t val; 1209 1210 /* Acquire the timer lock w/ lock order kludge. */ 1211 PDMCritSectLeave(dev->CTX_SUFF(pCritSect)); 1212 TMTimerLock(s->CTX_SUFF(pTimer), VINF_SUCCESS); 1213 PDMCritSectEnter(dev->CTX_SUFF(pCritSect), VINF_SUCCESS); 1226 1214 1227 1215 d = (TMTimerGet(s->CTX_SUFF(pTimer)) - s->initial_count_load_time) >> … … 1237 1225 val = s->initial_count - d; 1238 1226 } 1227 1228 TMTimerUnlock(s->CTX_SUFF(pTimer)); 1229 1239 1230 return val; 1240 1231 } … … 1325 1316 { 1326 1317 STAM_COUNTER_INC(&pThis->StatTimerSetLvt); 1318 1319 /* Acquire the timer lock w/ lock order kludge. */ 1320 PDMCritSectLeave(dev->CTX_SUFF(pCritSect)); 1321 TMTimerLock(pThis->CTX_SUFF(pTimer), VINF_SUCCESS); 1322 PDMCritSectEnter(dev->CTX_SUFF(pCritSect), VINF_SUCCESS); 1327 1323 1328 1324 /* … … 1411 1407 else 1412 1408 STAM_COUNTER_INC(&pThis->StatTimerSetLvtNoRelevantChange); 1409 1410 TMTimerUnlock(pThis->CTX_SUFF(pTimer)); 1413 1411 } 1414 1412 … … 1428 1426 Assert(pThis->fTimerArmed); 1429 1427 Assert(PDMCritSectIsOwned(dev->pCritSectR3)); 1428 Assert(TMTimerIsLockOwner(pTimer)); 1430 1429 1431 1430 if (!(pThis->lvt[APIC_LVT_TIMER] & APIC_LVT_MASKED)) { … … 2378 2377 pThis->enmVersion = PDMAPICVERSION_APIC; 2379 2378 2379 /* Disable locking in this device. */ 2380 pDevIns->pCritSectR3 = PDMDevHlpCritSectGetNop(pDevIns); 2381 2380 2382 PVM pVM = PDMDevHlpGetVM(pDevIns); 2383 2381 2384 /* 2382 2385 * We are not freeing this memory, as it's automatically released when guest exits.
Note:
See TracChangeset
for help on using the changeset viewer.