- Timestamp:
- Oct 28, 2009 9:58:41 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 54037
- Location:
- trunk
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/pdmdev.h
r23988 r24125 1043 1043 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode)); 1044 1044 1045 /** 1046 * Deliver a signal to CPU's local interrupt pins (LINT0/LINT1). Used for 1047 * virtual wire mode when interrupts from the PIC are passed through LAPIC. 1048 * 1049 * @returns status code. 1050 * @param pDevIns Device instance of the APIC. 1051 * @param u8Pin Local pin number (0 or 1 for current CPUs). 1052 */ 1053 DECLR3CALLBACKMEMBER(int, pfnLocalInterruptR3,(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level)); 1054 1045 1055 /** The name of the RC GetInterrupt entry point. */ 1046 1056 const char *pszGetInterruptRC; … … 1061 1071 /** The name of the RC BusDeliver entry point. */ 1062 1072 const char *pszBusDeliverRC; 1073 /** The name of the RC LocalInterrupt entry point. */ 1074 const char *pszLocalInterruptRC; 1063 1075 1064 1076 /** The name of the R0 GetInterrupt entry point. */ … … 1080 1092 /** The name of the R0 BusDeliver entry point. */ 1081 1093 const char *pszBusDeliverR0; 1094 /** The name of the R0 LocalInterrupt entry point. */ 1095 const char *pszLocalInterruptR0; 1082 1096 1083 1097 } PDMAPICREG; … … 1119 1133 /** SMI. */ 1120 1134 PDMAPICIRQ_SMI, 1135 /** ExtINT (HW interrupt via PIC). */ 1136 PDMAPICIRQ_EXTINT, 1121 1137 /** The usual 32-bit paranoia. */ 1122 1138 PDMAPICIRQ_32BIT_HACK = 0x7fffffff … … 1145 1161 * 1146 1162 * @param pDevIns Device instance of the APIC. 1163 * @param enmType IRQ type. 1147 1164 * @param idCpu Virtual CPU to clear flag upon. 1148 1165 */ 1149 DECLRCCALLBACKMEMBER(void, pfnClearInterruptFF,(PPDMDEVINS pDevIns, VMCPUID idCpu));1166 DECLRCCALLBACKMEMBER(void, pfnClearInterruptFF,(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu)); 1150 1167 1151 1168 /** … … 1214 1231 * 1215 1232 * @param pDevIns Device instance of the APIC. 1233 * @param enmType IRQ type. 1216 1234 * @param idCpu Virtual CPU to clear flag upon. 1217 1235 */ 1218 DECLR0CALLBACKMEMBER(void, pfnClearInterruptFF,(PPDMDEVINS pDevIns, VMCPUID idCpu));1236 DECLR0CALLBACKMEMBER(void, pfnClearInterruptFF,(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu)); 1219 1237 1220 1238 /** … … 1282 1300 * 1283 1301 * @param pDevIns Device instance of the APIC. 1302 * @param enmType IRQ type. 1284 1303 * @param idCpu Virtual CPU to clear flag upon. 1285 1304 */ 1286 DECLR3CALLBACKMEMBER(void, pfnClearInterruptFF,(PPDMDEVINS pDevIns, VMCPUID idCpu));1305 DECLR3CALLBACKMEMBER(void, pfnClearInterruptFF,(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu)); 1287 1306 1288 1307 /** -
trunk/src/VBox/Devices/PC/DevAPIC.cpp
r24082 r24125 390 390 uint8_t u8DeliveryMode, uint8_t iVector, uint8_t u8Polarity, 391 391 uint8_t u8TriggerMode); 392 PDMBOTHCBDECL(int) apicLocalInterrupt(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level); 392 393 PDMBOTHCBDECL(int) apicWriteMSR(PPDMDEVINS pDevIns, VMCPUID iCpu, uint32_t u32Reg, uint64_t u64Value); 393 394 PDMBOTHCBDECL(int) apicReadMSR(PPDMDEVINS pDevIns, VMCPUID iCpu, uint32_t u32Reg, uint64_t *pu64Value); … … 446 447 } 447 448 448 DECLINLINE(void) cpuClearInterrupt(APICDeviceInfo* dev, APICState *s )449 DECLINLINE(void) cpuClearInterrupt(APICDeviceInfo* dev, APICState *s, PDMAPICIRQ enmType = PDMAPICIRQ_HARDWARE) 449 450 { 450 451 LogFlow(("apic: clear interrupt flag\n")); 451 dev->CTX_SUFF(pApicHlp)->pfnClearInterruptFF(dev->CTX_SUFF(pDevIns), 452 dev->CTX_SUFF(pApicHlp)->pfnClearInterruptFF(dev->CTX_SUFF(pDevIns), enmType, 452 453 getCpuFromLapic(dev, s)); 453 454 } … … 961 962 return apic_bus_deliver(dev, apic_get_delivery_bitmask(dev, u8Dest, u8DestMode), 962 963 u8DeliveryMode, iVector, u8Polarity, u8TriggerMode); 964 } 965 966 /** 967 * Local interrupt delivery, for devices attached to the CPU's LINT0/LINT1 pin. 968 * Normally used for 8259A PIC and NMI. 969 */ 970 PDMBOTHCBDECL(int) apicLocalInterrupt(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level) 971 { 972 APICDeviceInfo *dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 973 APICState *s = getLapicById(dev, 0); 974 975 Assert(PDMCritSectIsOwner(dev->CTX_SUFF(pCritSect))); 976 LogFlow(("apicLocalInterrupt: pDevIns=%p u8Pin=%x\n", pDevIns, u8Pin)); 977 978 /* If LAPIC is disabled, go straight to the CPU. */ 979 if (!(s->spurious_vec & APIC_SV_ENABLE)) 980 { 981 LogFlow(("apicLocalInterrupt: LAPIC disabled, delivering directly to CPU core.\n")); 982 if (u8Level) 983 cpuSetInterrupt(dev, s, PDMAPICIRQ_EXTINT); 984 else 985 cpuClearInterrupt(dev, s, PDMAPICIRQ_EXTINT); 986 987 return VINF_SUCCESS; 988 } 989 990 /* If LAPIC is enabled, interrupts are subject to LVT programming. */ 991 if (u8Pin > 1) 992 { 993 /* There are only two local interrupt pins. */ 994 AssertMsgFailed(("Invalid LAPIC pin %d\n", u8Pin)); 995 return VERR_INVALID_PARAMETER; 996 } 997 998 /* NB: We currently only deliver local interrupts to the first CPU. In theory they 999 * should be delivered to all CPUs and it is the guest's responsibility to ensure 1000 * no more than one CPU has the interrupt unmasked. 1001 */ 1002 uint32_t u32Lvec; 1003 1004 u32Lvec = s->lvt[APIC_LVT_LINT0 + u8Pin]; /* Fetch corresponding LVT entry. */ 1005 /* Drop int if entry is masked. May not be correct for level-triggered interrupts. */ 1006 if (!(u32Lvec & APIC_LVT_MASKED)) 1007 { uint8_t u8Delivery; 1008 PDMAPICIRQ enmType; 1009 1010 u8Delivery = (u32Lvec >> 8) & 7; 1011 switch (u8Delivery) 1012 { 1013 case APIC_DM_EXTINT: 1014 Assert(u8Pin == 0); /* PIC should be wired to LINT0. */ 1015 enmType = PDMAPICIRQ_EXTINT; 1016 break; 1017 case APIC_DM_NMI: 1018 Assert(u8Pin == 0); /* NMI should be wired to LINT1. */ 1019 enmType = PDMAPICIRQ_NMI; 1020 break; 1021 case APIC_DM_SMI: 1022 enmType = PDMAPICIRQ_SMI; 1023 break; 1024 1025 } 1026 LogFlow(("apicLocalInterrupt: setting local interrupt type %d\n", enmType)); 1027 cpuSetInterrupt(dev, s, enmType); 1028 } 1029 return VINF_SUCCESS; 963 1030 } 964 1031 … … 2744 2811 ApicReg.pfnReadMSRR3 = apicReadMSR; 2745 2812 ApicReg.pfnBusDeliverR3 = apicBusDeliverCallback; 2813 ApicReg.pfnLocalInterruptR3 = apicLocalInterrupt; 2746 2814 if (fGCEnabled) { 2747 2815 ApicReg.pszGetInterruptRC = "apicGetInterrupt"; … … 2754 2822 ApicReg.pszReadMSRRC = "apicReadMSR"; 2755 2823 ApicReg.pszBusDeliverRC = "apicBusDeliverCallback"; 2824 ApicReg.pszLocalInterruptRC = "apicLocalInterrupt"; 2756 2825 } else { 2757 2826 ApicReg.pszGetInterruptRC = NULL; … … 2764 2833 ApicReg.pszReadMSRRC = NULL; 2765 2834 ApicReg.pszBusDeliverRC = NULL; 2835 ApicReg.pszLocalInterruptRC = NULL; 2766 2836 } 2767 2837 if (fR0Enabled) { … … 2775 2845 ApicReg.pszReadMSRR0 = "apicReadMSR"; 2776 2846 ApicReg.pszBusDeliverR0 = "apicBusDeliverCallback"; 2847 ApicReg.pszLocalInterruptR0 = "apicLocalInterrupt"; 2777 2848 } else { 2778 2849 ApicReg.pszGetInterruptR0 = NULL; … … 2785 2856 ApicReg.pszReadMSRR0 = NULL; 2786 2857 ApicReg.pszBusDeliverR0 = NULL; 2858 ApicReg.pszLocalInterruptR0 = NULL; 2787 2859 } 2788 2860 -
trunk/src/VBox/VMM/PDM.cpp
r23716 r24125 424 424 pVM->pdm.s.Apic.pfnGetTPRRC += offDelta; 425 425 pVM->pdm.s.Apic.pfnBusDeliverRC += offDelta; 426 pVM->pdm.s.Apic.pfnLocalInterruptRC += offDelta; 426 427 pVM->pdm.s.Apic.pfnWriteMSRRC += offDelta; 427 428 pVM->pdm.s.Apic.pfnReadMSRRC += offDelta; -
trunk/src/VBox/VMM/PDMDevHlp.cpp
r23915 r24125 1618 1618 VM_ASSERT_EMT(pDevIns->Internal.s.pVMR3); 1619 1619 LogFlow(("pdmR3DevHlp_APICRegister: caller='%s'/%d: pApicReg=%p:{.u32Version=%#x, .pfnGetInterruptR3=%p, .pfnSetBaseR3=%p, .pfnGetBaseR3=%p, " 1620 ".pfnSetTPRR3=%p, .pfnGetTPRR3=%p, .pfnWriteMSR3=%p, .pfnReadMSR3=%p, .pfnBusDeliverR3=%p, pszGetInterruptRC=%p:{%s}, pszSetBaseRC=%p:{%s}, pszGetBaseRC=%p:{%s}, "1621 ".pszSetTPRRC=%p:{%s}, .pszGetTPRRC=%p:{%s}, .pszWriteMSRRC=%p:{%s}, .pszReadMSRRC=%p:{%s}, .pszBusDeliverRC=%p:{%s} } ppApicHlpR3=%p\n",1620 ".pfnSetTPRR3=%p, .pfnGetTPRR3=%p, .pfnWriteMSR3=%p, .pfnReadMSR3=%p, .pfnBusDeliverR3=%p, .pfnLocalInterruptR3=%p, pszGetInterruptRC=%p:{%s}, pszSetBaseRC=%p:{%s}, pszGetBaseRC=%p:{%s}, " 1621 ".pszSetTPRRC=%p:{%s}, .pszGetTPRRC=%p:{%s}, .pszWriteMSRRC=%p:{%s}, .pszReadMSRRC=%p:{%s}, .pszBusDeliverRC=%p:{%s}, .pszLocalInterruptRC=%p:{%s}} ppApicHlpR3=%p\n", 1622 1622 pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, pApicReg, pApicReg->u32Version, pApicReg->pfnGetInterruptR3, pApicReg->pfnSetBaseR3, 1623 pApicReg->pfnGetBaseR3, pApicReg->pfnSetTPRR3, pApicReg->pfnGetTPRR3, pApicReg->pfnWriteMSRR3, pApicReg->pfnReadMSRR3, pApicReg->pfnBusDeliverR3, pApicReg->p szGetInterruptRC,1623 pApicReg->pfnGetBaseR3, pApicReg->pfnSetTPRR3, pApicReg->pfnGetTPRR3, pApicReg->pfnWriteMSRR3, pApicReg->pfnReadMSRR3, pApicReg->pfnBusDeliverR3, pApicReg->pfnLocalInterruptR3, pApicReg->pszGetInterruptRC, 1624 1624 pApicReg->pszGetInterruptRC, pApicReg->pszSetBaseRC, pApicReg->pszSetBaseRC, pApicReg->pszGetBaseRC, pApicReg->pszGetBaseRC, 1625 1625 pApicReg->pszSetTPRRC, pApicReg->pszSetTPRRC, pApicReg->pszGetTPRRC, pApicReg->pszGetTPRRC, pApicReg->pszWriteMSRRC, pApicReg->pszWriteMSRRC, pApicReg->pszReadMSRRC, pApicReg->pszReadMSRRC, pApicReg->pszBusDeliverRC, 1626 pApicReg->pszBusDeliverRC, p pApicHlpR3));1626 pApicReg->pszBusDeliverRC, pApicReg->pszLocalInterruptRC, pApicReg->pszLocalInterruptRC, ppApicHlpR3)); 1627 1627 1628 1628 /* … … 1643 1643 || !pApicReg->pfnWriteMSRR3 1644 1644 || !pApicReg->pfnReadMSRR3 1645 || !pApicReg->pfnBusDeliverR3) 1645 || !pApicReg->pfnBusDeliverR3 1646 || !pApicReg->pfnLocalInterruptR3) 1646 1647 { 1647 1648 Assert(pApicReg->pfnGetInterruptR3); … … 1654 1655 Assert(pApicReg->pfnReadMSRR3); 1655 1656 Assert(pApicReg->pfnBusDeliverR3); 1657 Assert(pApicReg->pfnLocalInterruptR3); 1656 1658 LogFlow(("pdmR3DevHlp_APICRegister: caller='%s'/%d: returns %Rrc (R3 callbacks)\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, VERR_INVALID_PARAMETER)); 1657 1659 return VERR_INVALID_PARAMETER; … … 1665 1667 || pApicReg->pszWriteMSRRC 1666 1668 || pApicReg->pszReadMSRRC 1667 || pApicReg->pszBusDeliverRC) 1669 || pApicReg->pszBusDeliverRC 1670 || pApicReg->pszLocalInterruptRC) 1668 1671 && ( !VALID_PTR(pApicReg->pszGetInterruptRC) 1669 1672 || !VALID_PTR(pApicReg->pszHasPendingIrqRC) … … 1674 1677 || !VALID_PTR(pApicReg->pszWriteMSRRC) 1675 1678 || !VALID_PTR(pApicReg->pszReadMSRRC) 1676 || !VALID_PTR(pApicReg->pszBusDeliverRC)) 1679 || !VALID_PTR(pApicReg->pszBusDeliverRC) 1680 || !VALID_PTR(pApicReg->pszLocalInterruptRC)) 1677 1681 ) 1678 1682 { … … 1686 1690 Assert(VALID_PTR(pApicReg->pszWriteMSRRC)); 1687 1691 Assert(VALID_PTR(pApicReg->pszBusDeliverRC)); 1692 Assert(VALID_PTR(pApicReg->pszLocalInterruptRC)); 1688 1693 LogFlow(("pdmR3DevHlp_APICRegister: caller='%s'/%d: returns %Rrc (RC callbacks)\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, VERR_INVALID_PARAMETER)); 1689 1694 return VERR_INVALID_PARAMETER; … … 1697 1702 || pApicReg->pszWriteMSRR0 1698 1703 || pApicReg->pszReadMSRR0 1699 || pApicReg->pszBusDeliverR0) 1704 || pApicReg->pszBusDeliverR0 1705 || pApicReg->pszLocalInterruptR0) 1700 1706 && ( !VALID_PTR(pApicReg->pszGetInterruptR0) 1701 1707 || !VALID_PTR(pApicReg->pszHasPendingIrqR0) … … 1706 1712 || !VALID_PTR(pApicReg->pszReadMSRR0) 1707 1713 || !VALID_PTR(pApicReg->pszWriteMSRR0) 1708 || !VALID_PTR(pApicReg->pszBusDeliverR0)) 1714 || !VALID_PTR(pApicReg->pszBusDeliverR0) 1715 || !VALID_PTR(pApicReg->pszLocalInterruptR0)) 1709 1716 ) 1710 1717 { … … 1718 1725 Assert(VALID_PTR(pApicReg->pszWriteMSRR0)); 1719 1726 Assert(VALID_PTR(pApicReg->pszBusDeliverR0)); 1727 Assert(VALID_PTR(pApicReg->pszLocalInterruptR0)); 1720 1728 LogFlow(("pdmR3DevHlp_APICRegister: caller='%s'/%d: returns %Rrc (R0 callbacks)\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, VERR_INVALID_PARAMETER)); 1721 1729 return VERR_INVALID_PARAMETER; … … 1786 1794 rc = PDMR3LdrGetSymbolRCLazy(pVM, pDevIns->pDevReg->szRCMod, pApicReg->pszBusDeliverRC, &pVM->pdm.s.Apic.pfnBusDeliverRC); 1787 1795 AssertMsgRC(rc, ("%s::%s rc=%Rrc\n", pDevIns->pDevReg->szRCMod, pApicReg->pszBusDeliverRC, rc)); 1796 } 1797 if (RT_SUCCESS(rc)) 1798 { 1799 rc = PDMR3LdrGetSymbolRCLazy(pVM, pDevIns->pDevReg->szRCMod, pApicReg->pszLocalInterruptRC, &pVM->pdm.s.Apic.pfnLocalInterruptRC); 1800 AssertMsgRC(rc, ("%s::%s rc=%Rrc\n", pDevIns->pDevReg->szRCMod, pApicReg->pszLocalInterruptRC, rc)); 1788 1801 } 1789 1802 if (RT_FAILURE(rc)) … … 1806 1819 pVM->pdm.s.Apic.pfnReadMSRRC = 0; 1807 1820 pVM->pdm.s.Apic.pfnBusDeliverRC = 0; 1821 pVM->pdm.s.Apic.pfnLocalInterruptRC = 0; 1808 1822 } 1809 1823 … … 1854 1868 rc = PDMR3LdrGetSymbolR0Lazy(pVM, pDevIns->pDevReg->szR0Mod, pApicReg->pszBusDeliverR0, &pVM->pdm.s.Apic.pfnBusDeliverR0); 1855 1869 AssertMsgRC(rc, ("%s::%s rc=%Rrc\n", pDevIns->pDevReg->szR0Mod, pApicReg->pszBusDeliverR0, rc)); 1870 } 1871 if (RT_SUCCESS(rc)) 1872 { 1873 rc = PDMR3LdrGetSymbolR0Lazy(pVM, pDevIns->pDevReg->szR0Mod, pApicReg->pszLocalInterruptR0, &pVM->pdm.s.Apic.pfnLocalInterruptR0); 1874 AssertMsgRC(rc, ("%s::%s rc=%Rrc\n", pDevIns->pDevReg->szR0Mod, pApicReg->pszLocalInterruptR0, rc)); 1856 1875 } 1857 1876 if (RT_FAILURE(rc)) … … 1874 1893 pVM->pdm.s.Apic.pfnReadMSRR0 = 0; 1875 1894 pVM->pdm.s.Apic.pfnBusDeliverR0 = 0; 1895 pVM->pdm.s.Apic.pfnLocalInterruptR0 = 0; 1876 1896 pVM->pdm.s.Apic.pDevInsR0 = 0; 1877 1897 } … … 1890 1910 pVM->pdm.s.Apic.pfnReadMSRR3 = pApicReg->pfnReadMSRR3; 1891 1911 pVM->pdm.s.Apic.pfnBusDeliverR3 = pApicReg->pfnBusDeliverR3; 1912 pVM->pdm.s.Apic.pfnLocalInterruptR3 = pApicReg->pfnLocalInterruptR3; 1892 1913 Log(("PDM: Registered APIC device '%s'/%d pDevIns=%p\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, pDevIns)); 1893 1914 -
trunk/src/VBox/VMM/PDMDevMiscHlp.cpp
r23901 r24125 48 48 PDMDEV_ASSERT_DEVINS(pDevIns); 49 49 PVM pVM = pDevIns->Internal.s.pVMR3; 50 51 if (pVM->pdm.s.Apic.pfnLocalInterruptR3) 52 { 53 LogFlow(("pdmR3PicHlp_SetInterruptFF: caller='%s'/%d: Setting local interrupt on LAPIC\n", 54 pDevIns->pDevReg->szDeviceName, pDevIns->iInstance)); 55 /* Raise the LAPIC's LINT0 line instead of signaling the CPU directly. */ 56 pVM->pdm.s.Apic.pfnLocalInterruptR3(pVM->pdm.s.Apic.pDevInsR3, 0, 1); 57 return; 58 } 59 50 60 PVMCPU pVCpu = &pVM->aCpus[0]; /* for PIC we always deliver to CPU 0, MP use APIC */ 51 61 … … 65 75 PVM pVM = pDevIns->Internal.s.pVMR3; 66 76 PVMCPU pVCpu = &pVM->aCpus[0]; /* for PIC we always deliver to CPU 0, MP use APIC */ 77 78 if (pVM->pdm.s.Apic.pfnLocalInterruptR3) 79 { 80 /* Raise the LAPIC's LINT0 line instead of signaling the CPU directly. */ 81 LogFlow(("pdmR3PicHlp_ClearInterruptFF: caller='%s'/%d: Clearing local interrupt on LAPIC\n", 82 pDevIns->pDevReg->szDeviceName, pDevIns->iInstance)); 83 /* Lower the LAPIC's LINT0 line instead of signaling the CPU directly. */ 84 pVM->pdm.s.Apic.pfnLocalInterruptR3(pVM->pdm.s.Apic.pDevInsR3, 0, 0); 85 return; 86 } 67 87 68 88 LogFlow(("pdmR3PicHlp_ClearInterruptFF: caller='%s'/%d: VM_FF_INTERRUPT_PIC %d -> 0\n", … … 167 187 VMCPU_FF_SET(pVCpu, VMCPU_FF_INTERRUPT_SMI); 168 188 break; 189 case PDMAPICIRQ_EXTINT: 190 VMCPU_FF_SET(pVCpu, VMCPU_FF_INTERRUPT_PIC); 191 break; 169 192 default: 170 193 AssertMsgFailed(("enmType=%d\n", enmType)); … … 177 200 178 201 /** @copydoc PDMAPICHLPR3::pfnClearInterruptFF */ 179 static DECLCALLBACK(void) pdmR3ApicHlp_ClearInterruptFF(PPDMDEVINS pDevIns, VMCPUID idCpu)202 static DECLCALLBACK(void) pdmR3ApicHlp_ClearInterruptFF(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu) 180 203 { 181 204 PDMDEV_ASSERT_DEVINS(pDevIns); … … 188 211 pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, idCpu, VMCPU_FF_ISSET(pVCpu, VMCPU_FF_INTERRUPT_APIC))); 189 212 190 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_APIC); 213 /* Note: NMI/SMI can't be cleared. */ 214 switch (enmType) 215 { 216 case PDMAPICIRQ_HARDWARE: 217 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_APIC); 218 break; 219 case PDMAPICIRQ_EXTINT: 220 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_PIC); 221 break; 222 default: 223 AssertMsgFailed(("enmType=%d\n", enmType)); 224 break; 225 } 191 226 REMR3NotifyInterruptClear(pVM, pVCpu); 192 227 } -
trunk/src/VBox/VMM/PDMInternal.h
r23584 r24125 438 438 DECLR3CALLBACKMEMBER(int, pfnBusDeliverR3,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode, 439 439 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode)); 440 /** @copydoc PDMAPICREG::pfnLocalInterruptR3 */ 441 DECLR3CALLBACKMEMBER(int, pfnLocalInterruptR3,(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level)); 440 442 441 443 /** Pointer to the APIC device instance - R0 Ptr. */ … … 460 462 DECLR0CALLBACKMEMBER(int, pfnBusDeliverR0,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode, 461 463 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode)); 464 /** @copydoc PDMAPICREG::pfnLocalInterruptR3 */ 465 DECLR0CALLBACKMEMBER(int, pfnLocalInterruptR0,(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level)); 462 466 463 467 /** Pointer to the APIC device instance - RC Ptr. */ … … 482 486 DECLRCCALLBACKMEMBER(int, pfnBusDeliverRC,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode, 483 487 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode)); 488 /** @copydoc PDMAPICREG::pfnLocalInterruptR3 */ 489 DECLRCCALLBACKMEMBER(int, pfnLocalInterruptRC,(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level)); 490 484 491 } PDMAPIC; 485 492 -
trunk/src/VBox/VMM/VMMGC/PDMGCDevice.cpp
r22890 r24125 87 87 */ 88 88 static DECLCALLBACK(void) pdmRCApicHlp_SetInterruptFF(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu); 89 static DECLCALLBACK(void) pdmRCApicHlp_ClearInterruptFF(PPDMDEVINS pDevIns, VMCPUID idCpu);89 static DECLCALLBACK(void) pdmRCApicHlp_ClearInterruptFF(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu); 90 90 static DECLCALLBACK(void) pdmRCApicHlp_ChangeFeature(PPDMDEVINS pDevIns, PDMAPICVERSION enmVersion); 91 91 static DECLCALLBACK(int) pdmRCApicHlp_Lock(PPDMDEVINS pDevIns, int rc); … … 441 441 442 442 /** @copydoc PDMAPICHLPRC::pfnClearInterruptFF */ 443 static DECLCALLBACK(void) pdmRCApicHlp_ClearInterruptFF(PPDMDEVINS pDevIns, VMCPUID idCpu)443 static DECLCALLBACK(void) pdmRCApicHlp_ClearInterruptFF(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu) 444 444 { 445 445 PDMDEV_ASSERT_DEVINS(pDevIns); … … 451 451 LogFlow(("pdmRCApicHlp_ClearInterruptFF: caller=%p/%d: VM_FF_INTERRUPT %d -> 0\n", 452 452 pDevIns, pDevIns->iInstance, VMCPU_FF_ISSET(pVCpu, VMCPU_FF_INTERRUPT_APIC))); 453 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_APIC); 453 454 /* Note: NMI/SMI can't be cleared. */ 455 switch (enmType) 456 { 457 case PDMAPICIRQ_HARDWARE: 458 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_APIC); 459 break; 460 case PDMAPICIRQ_EXTINT: 461 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_PIC); 462 break; 463 default: 464 AssertMsgFailed(("enmType=%d\n", enmType)); 465 break; 466 } 454 467 } 455 468 -
trunk/src/VBox/VMM/VMMR0/PDMR0Device.cpp
r22890 r24125 90 90 */ 91 91 static DECLCALLBACK(void) pdmR0ApicHlp_SetInterruptFF(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu); 92 static DECLCALLBACK(void) pdmR0ApicHlp_ClearInterruptFF(PPDMDEVINS pDevIns, VMCPUID idCpu);92 static DECLCALLBACK(void) pdmR0ApicHlp_ClearInterruptFF(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu); 93 93 static DECLCALLBACK(void) pdmR0ApicHlp_ChangeFeature(PPDMDEVINS pDevIns, PDMAPICVERSION enmVersion); 94 94 static DECLCALLBACK(int) pdmR0ApicHlp_Lock(PPDMDEVINS pDevIns, int rc); … … 475 475 476 476 /** @copydoc PDMAPICHLPR0::pfnClearInterruptFF */ 477 static DECLCALLBACK(void) pdmR0ApicHlp_ClearInterruptFF(PPDMDEVINS pDevIns, VMCPUID idCpu)477 static DECLCALLBACK(void) pdmR0ApicHlp_ClearInterruptFF(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu) 478 478 { 479 479 PDMDEV_ASSERT_DEVINS(pDevIns); … … 485 485 LogFlow(("pdmR0ApicHlp_ClearInterruptFF: caller=%p/%d: VM_FF_INTERRUPT %d -> 0\n", 486 486 pDevIns, pDevIns->iInstance, VMCPU_FF_ISSET(pVCpu, VMCPU_FF_INTERRUPT_APIC))); 487 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_APIC); 487 488 /* Note: NMI/SMI can't be cleared. */ 489 switch (enmType) 490 { 491 case PDMAPICIRQ_HARDWARE: 492 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_APIC); 493 break; 494 case PDMAPICIRQ_EXTINT: 495 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_PIC); 496 break; 497 default: 498 AssertMsgFailed(("enmType=%d\n", enmType)); 499 break; 500 } 488 501 } 489 502
Note:
See TracChangeset
for help on using the changeset viewer.