- Timestamp:
- Apr 13, 2012 8:50:14 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 77458
- Location:
- trunk
- Files:
-
- 23 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/pdmapi.h
r40405 r40907 41 41 */ 42 42 43 VMMDECL(int) PDMGetInterrupt(PVMCPU pVCpu, uint8_t *pu8Interrupt);44 VMMDECL(int) PDMIsaSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level);45 VMM DECL(int) PDMIoApicSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level);46 VMM DECL(int) PDMIoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue);47 VMMDECL(bool) PDMHasIoApic(PVM pVM);48 VMMDECL(int) PDMApicHasPendingIrq(PVM pVM, bool *pfPending);49 VMMDECL(int) PDMApicSetBase(PVM pVM, uint64_t u64Base);50 VMMDECL(int) PDMApicGetBase(PVM pVM, uint64_t *pu64Base);51 VMMDECL(int) PDMApicSetTPR(PVMCPU pVCpu, uint8_t u8TPR);52 VMMDECL(int) PDMApicGetTPR(PVMCPU pVCpu, uint8_t *pu8TPR, bool *pfPending);53 VMMDECL(int) PDMApicWriteMSR(PVM pVM, VMCPUID iCpu, uint32_t u32Reg, uint64_t u64Value);54 VMMDECL(int) PDMApicReadMSR(PVM pVM, VMCPUID iCpu, uint32_t u32Reg, uint64_t *pu64Value);55 VMMDECL(int) PDMVMMDevHeapR3ToGCPhys(PVM pVM, RTR3PTR pv, RTGCPHYS *pGCPhys);56 VMMDECL(bool) PDMVMMDevHeapIsEnabled(PVM pVM);43 VMMDECL(int) PDMGetInterrupt(PVMCPU pVCpu, uint8_t *pu8Interrupt); 44 VMMDECL(int) PDMIsaSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level, uint32_t uTagSrc); 45 VMM_INT_DECL(int) PDMIoApicSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level, uint32_t uTagSrc); 46 VMM_INT_DECL(int) PDMIoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc); 47 VMMDECL(bool) PDMHasIoApic(PVM pVM); 48 VMMDECL(int) PDMApicHasPendingIrq(PVM pVM, bool *pfPending); 49 VMMDECL(int) PDMApicSetBase(PVM pVM, uint64_t u64Base); 50 VMMDECL(int) PDMApicGetBase(PVM pVM, uint64_t *pu64Base); 51 VMMDECL(int) PDMApicSetTPR(PVMCPU pVCpu, uint8_t u8TPR); 52 VMMDECL(int) PDMApicGetTPR(PVMCPU pVCpu, uint8_t *pu8TPR, bool *pfPending); 53 VMMDECL(int) PDMApicWriteMSR(PVM pVM, VMCPUID iCpu, uint32_t u32Reg, uint64_t u64Value); 54 VMMDECL(int) PDMApicReadMSR(PVM pVM, VMCPUID iCpu, uint32_t u32Reg, uint64_t *pu64Value); 55 VMMDECL(int) PDMVMMDevHeapR3ToGCPhys(PVM pVM, RTR3PTR pv, RTGCPHYS *pGCPhys); 56 VMMDECL(bool) PDMVMMDevHeapIsEnabled(PVM pVM); 57 57 58 58 -
trunk/include/VBox/vmm/pdmdev.h
r40416 r40907 552 552 * @param iIrq IRQ number to set. 553 553 * @param iLevel IRQ level. See the PDM_IRQ_LEVEL_* \#defines. 554 */ 555 DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel)); 554 * @param uTagSrc The IRQ tag and source (for tracing). 555 */ 556 DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc)); 556 557 557 558 /** … … 596 597 597 598 /** Current PDMPCIBUSREG version number. */ 598 #define PDM_PCIBUSREG_VERSION PDM_VERSION_MAKE(0xfffe, 2, 0)599 #define PDM_PCIBUSREG_VERSION PDM_VERSION_MAKE(0xfffe, 3, 0) 599 600 600 601 /** … … 612 613 * @param iIrq IRQ number to set. 613 614 * @param iLevel IRQ level. See the PDM_IRQ_LEVEL_* \#defines. 615 * @param uTagSrc The IRQ tag and source (for tracing). 614 616 * @thread EMT only. 615 617 */ 616 DECLRCCALLBACKMEMBER(void, pfnIsaSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel ));618 DECLRCCALLBACKMEMBER(void, pfnIsaSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)); 617 619 618 620 /** … … 622 624 * @param iIrq IRQ number to set. 623 625 * @param iLevel IRQ level. See the PDM_IRQ_LEVEL_* \#defines. 626 * @param uTagSrc The IRQ tag and source (for tracing). 624 627 * @thread EMT only. 625 628 */ 626 DECLRCCALLBACKMEMBER(void, pfnIoApicSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel ));629 DECLRCCALLBACKMEMBER(void, pfnIoApicSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)); 627 630 628 631 /** … … 630 633 * 631 634 * @param pDevIns PCI device instance. 632 * @param GC AddrPhysical address MSI request was written.635 * @param GCPhys Physical address MSI request was written. 633 636 * @param uValue Value written. 637 * @param uTagSrc The IRQ tag and source (for tracing). 634 638 * @thread EMT only. 635 639 */ 636 DECLRCCALLBACKMEMBER(void, pfnIoApicSendMsi,(PPDMDEVINS pDevIns, RTGCPHYS GC Addr, uint32_t uValue));640 DECLRCCALLBACKMEMBER(void, pfnIoApicSendMsi,(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc)); 637 641 638 642 … … 663 667 664 668 /** Current PDMPCIHLPRC version number. */ 665 #define PDM_PCIHLPRC_VERSION PDM_VERSION_MAKE(0xfffd, 2, 0)669 #define PDM_PCIHLPRC_VERSION PDM_VERSION_MAKE(0xfffd, 3, 0) 666 670 667 671 … … 680 684 * @param iIrq IRQ number to set. 681 685 * @param iLevel IRQ level. See the PDM_IRQ_LEVEL_* \#defines. 686 * @param uTagSrc The IRQ tag and source (for tracing). 682 687 * @thread EMT only. 683 688 */ 684 DECLR0CALLBACKMEMBER(void, pfnIsaSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel ));689 DECLR0CALLBACKMEMBER(void, pfnIsaSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)); 685 690 686 691 /** … … 690 695 * @param iIrq IRQ number to set. 691 696 * @param iLevel IRQ level. See the PDM_IRQ_LEVEL_* \#defines. 697 * @param uTagSrc The IRQ tag and source (for tracing). 692 698 * @thread EMT only. 693 699 */ 694 DECLR0CALLBACKMEMBER(void, pfnIoApicSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel ));700 DECLR0CALLBACKMEMBER(void, pfnIoApicSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)); 695 701 696 702 /** … … 698 704 * 699 705 * @param pDevIns PCI device instance. 700 * @param GC AddrPhysical address MSI request was written.706 * @param GCPhys Physical address MSI request was written. 701 707 * @param uValue Value written. 708 * @param uTagSrc The IRQ tag and source (for tracing). 702 709 * @thread EMT only. 703 710 */ 704 DECLR0CALLBACKMEMBER(void, pfnIoApicSendMsi,(PPDMDEVINS pDevIns, RTGCPHYS GC Addr, uint32_t uValue));711 DECLR0CALLBACKMEMBER(void, pfnIoApicSendMsi,(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc)); 705 712 706 713 … … 731 738 732 739 /** Current PDMPCIHLPR0 version number. */ 733 #define PDM_PCIHLPR0_VERSION PDM_VERSION_MAKE(0xfffc, 2, 0)740 #define PDM_PCIHLPR0_VERSION PDM_VERSION_MAKE(0xfffc, 3, 0) 734 741 735 742 /** … … 747 754 * @param iIrq IRQ number to set. 748 755 * @param iLevel IRQ level. See the PDM_IRQ_LEVEL_* \#defines. 749 * @ thread EMT only.750 */ 751 DECLR3CALLBACKMEMBER(void, pfnIsaSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel ));756 * @param uTagSrc The IRQ tag and source (for tracing). 757 */ 758 DECLR3CALLBACKMEMBER(void, pfnIsaSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)); 752 759 753 760 /** … … 757 764 * @param iIrq IRQ number to set. 758 765 * @param iLevel IRQ level. See the PDM_IRQ_LEVEL_* \#defines. 759 * @ thread EMT only.760 */ 761 DECLR3CALLBACKMEMBER(void, pfnIoApicSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel ));766 * @param uTagSrc The IRQ tag and source (for tracing). 767 */ 768 DECLR3CALLBACKMEMBER(void, pfnIoApicSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)); 762 769 763 770 /** … … 765 772 * 766 773 * @param pDevIns PCI device instance. 767 * @param GC AddrPhysical address MSI request was written.774 * @param GCPhys Physical address MSI request was written. 768 775 * @param uValue Value written. 769 * @ thread EMT only.770 */ 771 DECLR3CALLBACKMEMBER(void, pfnIoApicSendMsi,(PPDMDEVINS pDevIns, RTGCPHYS GC Addr, uint32_t uValue));776 * @param uTagSrc The IRQ tag and source (for tracing). 777 */ 778 DECLR3CALLBACKMEMBER(void, pfnIoApicSendMsi,(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc)); 772 779 773 780 /** … … 831 838 832 839 /** Current PDMPCIHLPR3 version number. */ 833 #define PDM_PCIHLPR3_VERSION PDM_VERSION_MAKE(0xfffb, 2, 0)840 #define PDM_PCIHLPR3_VERSION PDM_VERSION_MAKE(0xfffb, 3, 0) 834 841 835 842 … … 848 855 * @param iIrq IRQ number to set. 849 856 * @param iLevel IRQ level. See the PDM_IRQ_LEVEL_* \#defines. 850 */ 851 DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel)); 857 * @param uTagSrc The IRQ tag and source (for tracing). 858 */ 859 DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)); 852 860 853 861 /** … … 856 864 * @returns Pending interrupt number. 857 865 * @param pDevIns Device instance of the PIC. 858 */ 859 DECLR3CALLBACKMEMBER(int, pfnGetInterruptR3,(PPDMDEVINS pDevIns)); 866 * @param puTagSrc Where to return the IRQ tag and source. 867 */ 868 DECLR3CALLBACKMEMBER(int, pfnGetInterruptR3,(PPDMDEVINS pDevIns, uint32_t *puTagSrc)); 860 869 861 870 /** The name of the RC SetIrq entry point. */ … … 873 882 874 883 /** Current PDMPICREG version number. */ 875 #define PDM_PICREG_VERSION PDM_VERSION_MAKE(0xfffa, 1, 0)884 #define PDM_PICREG_VERSION PDM_VERSION_MAKE(0xfffa, 2, 0) 876 885 877 886 /** … … 924 933 925 934 /** Current PDMPICHLPRC version number. */ 926 #define PDM_PICHLPRC_VERSION PDM_VERSION_MAKE(0xfff9, 1, 0)935 #define PDM_PICHLPRC_VERSION PDM_VERSION_MAKE(0xfff9, 2, 0) 927 936 928 937 … … 1066 1075 * @returns Pending interrupt number. 1067 1076 * @param pDevIns Device instance of the APIC. 1068 */ 1069 DECLR3CALLBACKMEMBER(int, pfnGetInterruptR3,(PPDMDEVINS pDevIns)); 1077 * @param puTagSrc Where to return the tag source. 1078 */ 1079 DECLR3CALLBACKMEMBER(int, pfnGetInterruptR3,(PPDMDEVINS pDevIns, uint32_t *puTagSrc)); 1070 1080 1071 1081 /** … … 1156 1166 * @param u8Polarity See APIC implementation. 1157 1167 * @param u8TriggerMode See APIC implementation. 1168 * @param uTagSrc The IRQ tag and source (for tracing). 1158 1169 */ 1159 1170 DECLR3CALLBACKMEMBER(int, pfnBusDeliverR3,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode, 1160 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode)); 1161 1162 /** 1163 * Deliver a signal to CPU's local interrupt pins (LINT0/LINT1). Used for 1164 * virtual wire mode when interrupts from the PIC are passed through LAPIC. 1171 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc)); 1172 1173 /** 1174 * Deliver a signal to CPU's local interrupt pins (LINT0/LINT1). 1175 * 1176 * Used for virtual wire mode when interrupts from the PIC are passed through 1177 * LAPIC. 1165 1178 * 1166 1179 * @returns status code. 1167 1180 * @param pDevIns Device instance of the APIC. 1168 1181 * @param u8Pin Local pin number (0 or 1 for current CPUs). 1182 * @param u8Level The level. 1183 * @param uTagSrc The IRQ tag and source (for tracing). 1169 1184 */ 1170 1185 DECLR3CALLBACKMEMBER(int, pfnLocalInterruptR3,(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level)); … … 1217 1232 1218 1233 /** Current PDMAPICREG version number. */ 1219 #define PDM_APICREG_VERSION PDM_VERSION_MAKE(0xfff6, 1, 0)1234 #define PDM_APICREG_VERSION PDM_VERSION_MAKE(0xfff6, 2, 0) 1220 1235 1221 1236 … … 1527 1542 * @param iIrq IRQ number to set. 1528 1543 * @param iLevel IRQ level. See the PDM_IRQ_LEVEL_* \#defines. 1529 */ 1530 DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel)); 1531 1532 /** The name of the GC SetIrq entry point. */ 1544 * @param uTagSrc The IRQ tag and source (for tracing). 1545 */ 1546 DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)); 1547 1548 /** The name of the RC SetIrq entry point. */ 1533 1549 const char *pszSetIrqRC; 1534 1550 … … 1542 1558 * @param GCPhys Request address. 1543 1559 * @param uValue Request value. 1544 */ 1545 DECLR3CALLBACKMEMBER(void, pfnSendMsiR3,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue)); 1546 1547 /** The name of the GC SendMsi entry point. */ 1560 * @param uTagSrc The IRQ tag and source (for tracing). 1561 */ 1562 DECLR3CALLBACKMEMBER(void, pfnSendMsiR3,(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc)); 1563 1564 /** The name of the RC SendMsi entry point. */ 1548 1565 const char *pszSendMsiRC; 1549 1566 … … 1555 1572 1556 1573 /** Current PDMAPICREG version number. */ 1557 #define PDM_IOAPICREG_VERSION PDM_VERSION_MAKE(0xfff2, 2, 0)1574 #define PDM_IOAPICREG_VERSION PDM_VERSION_MAKE(0xfff2, 3, 0) 1558 1575 1559 1576 … … 1579 1596 * @param u8Polarity See APIC implementation. 1580 1597 * @param u8TriggerMode See APIC implementation. 1598 * @param uTagSrc The IRQ tag and source (for tracing). 1581 1599 */ 1582 1600 DECLRCCALLBACKMEMBER(int, pfnApicBusDeliver,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode, 1583 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode ));1601 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc)); 1584 1602 1585 1603 /** … … 1609 1627 1610 1628 /** Current PDMIOAPICHLPRC version number. */ 1611 #define PDM_IOAPICHLPRC_VERSION PDM_VERSION_MAKE(0xfff1, 1, 0)1629 #define PDM_IOAPICHLPRC_VERSION PDM_VERSION_MAKE(0xfff1, 2, 0) 1612 1630 1613 1631 … … 1633 1651 * @param u8Polarity See APIC implementation. 1634 1652 * @param u8TriggerMode See APIC implementation. 1653 * @param uTagSrc The IRQ tag and source (for tracing). 1635 1654 */ 1636 1655 DECLR0CALLBACKMEMBER(int, pfnApicBusDeliver,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode, 1637 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode ));1656 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc)); 1638 1657 1639 1658 /** … … 1663 1682 1664 1683 /** Current PDMIOAPICHLPR0 version number. */ 1665 #define PDM_IOAPICHLPR0_VERSION PDM_VERSION_MAKE(0xfff0, 1, 0)1684 #define PDM_IOAPICHLPR0_VERSION PDM_VERSION_MAKE(0xfff0, 2, 0) 1666 1685 1667 1686 /** … … 1686 1705 * @param u8Polarity See APIC implementation. 1687 1706 * @param u8TriggerMode See APIC implementation. 1707 * @param uTagSrc The IRQ tag and source (for tracing). 1688 1708 */ 1689 1709 DECLR3CALLBACKMEMBER(int, pfnApicBusDeliver,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode, 1690 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode ));1710 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc)); 1691 1711 1692 1712 /** … … 1738 1758 1739 1759 /** Current PDMIOAPICHLPR3 version number. */ 1740 #define PDM_IOAPICHLPR3_VERSION PDM_VERSION_MAKE(0xffef, 1, 0)1760 #define PDM_IOAPICHLPR3_VERSION PDM_VERSION_MAKE(0xffef, 2, 0) 1741 1761 1742 1762 … … 3925 3945 /** Tracing indicator. */ 3926 3946 uint32_t fTracing; 3927 #if HC_ARCH_BITS == 64 3947 /** The tracing ID of this device. */ 3948 uint32_t idTracing; 3949 #if HC_ARCH_BITS == 32 3928 3950 /** Align the internal data more naturally. */ 3929 uint32_t u32Padding;3951 uint32_t au32Padding[HC_ARCH_BITS == 32 ? 13 : 0]; 3930 3952 #endif 3931 3953 … … 3936 3958 PDMDEVINSINT s; 3937 3959 #endif 3938 uint8_t padding[HC_ARCH_BITS == 32 ? 64 + 0: 112 + 0x28];3960 uint8_t padding[HC_ARCH_BITS == 32 ? 72 : 112 + 0x28]; 3939 3961 } Internal; 3940 3962 … … 3945 3967 3946 3968 /** Current PDMDEVINS version number. */ 3947 #define PDM_DEVINS_VERSION PDM_VERSION_MAKE(0xffe4, 2, 0)3969 #define PDM_DEVINS_VERSION PDM_VERSION_MAKE(0xffe4, 3, 0) 3948 3970 3949 3971 /** Converts a pointer to the PDMDEVINS::IBase to a pointer to PDMDEVINS. */ -
trunk/include/VBox/vmm/pdmdrv.h
r40652 r40907 389 389 /** Tracing indicator. */ 390 390 uint32_t fTracing; 391 #if HC_ARCH_BITS == 64 391 /** The tracing ID of this device. */ 392 uint32_t idTracing; 393 #if HC_ARCH_BITS == 32 392 394 /** Align the internal data more naturally. */ 393 uint32_t u32Padding;395 uint32_t au32Padding[HC_ARCH_BITS == 32 ? 7 : 0]; 394 396 #endif 395 397 … … 409 411 410 412 /** Current DRVREG version number. */ 411 #define PDM_DRVINS_VERSION PDM_VERSION_MAKE(0xf0fe, 1, 0)413 #define PDM_DRVINS_VERSION PDM_VERSION_MAKE(0xf0fe, 2, 0) 412 414 413 415 /** Converts a pointer to the PDMDRVINS::IBase to a pointer to PDMDRVINS. */ -
trunk/include/VBox/vmm/pdmusb.h
r40416 r40907 694 694 uint32_t u32Version; 695 695 /** USB device instance number. */ 696 RTUINTiInstance;696 uint32_t iInstance; 697 697 /** The base interface of the device. 698 698 * The device constructor initializes this if it has any device level … … 731 731 /** Tracing indicator. */ 732 732 uint32_t fTracing; 733 /** The tracing ID of this device. */ 734 uint32_t idTracing; 735 733 736 /** Padding to make achInstanceData aligned at 32 byte boundary. */ 734 uint32_t au32Padding[HC_ARCH_BITS == 32 ? 4 : 1]; 737 uint32_t au32Padding[HC_ARCH_BITS == 32 ? 3 : 4]; 738 735 739 /** Device instance data. The size of this area is defined 736 740 * in the PDMUSBREG::cbInstanceData field. */ … … 739 743 740 744 /** Current USBINS version number. */ 741 #define PDM_USBINS_VERSION PDM_VERSION_MAKE(0xeefd, 1, 0)745 #define PDM_USBINS_VERSION PDM_VERSION_MAKE(0xeefd, 2, 0) 742 746 743 747 /** -
trunk/src/VBox/Devices/Bus/DevPCI.cpp
r40282 r40907 214 214 RT_C_DECLS_BEGIN 215 215 216 PDMBOTHCBDECL(void) pciSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel );217 PDMBOTHCBDECL(void) pcibridgeSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel );216 PDMBOTHCBDECL(void) pciSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTag); 217 PDMBOTHCBDECL(void) pcibridgeSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTag); 218 218 PDMBOTHCBDECL(int) pciIOPortAddressWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb); 219 219 PDMBOTHCBDECL(int) pciIOPortAddressRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb); … … 601 601 } 602 602 603 static void apic_set_irq(PPCIBUS pBus, uint8_t uDevFn, PCIDevice *pPciDev, int irq_num1, int iLevel, int acpi_irq )603 static void apic_set_irq(PPCIBUS pBus, uint8_t uDevFn, PCIDevice *pPciDev, int irq_num1, int iLevel, int acpi_irq, uint32_t uTagSrc) 604 604 { 605 605 /* This is only allowed to be called with a pointer to the host bus. */ … … 620 620 Log3(("apic_set_irq: %s: irq_num1=%d level=%d apic_irq=%d apic_level=%d irq_num1=%d\n", 621 621 R3STRING(pPciDev->name), irq_num1, iLevel, apic_irq, apic_level, irq_num)); 622 pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), apic_irq, apic_level );622 pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), apic_irq, apic_level, uTagSrc); 623 623 624 624 if ((iLevel & PDM_IRQ_LEVEL_FLIP_FLOP) == PDM_IRQ_LEVEL_FLIP_FLOP) { … … 628 628 Log3(("apic_set_irq: %s: irq_num1=%d level=%d apic_irq=%d apic_level=%d irq_num1=%d (flop)\n", 629 629 R3STRING(pPciDev->name), irq_num1, iLevel, apic_irq, apic_level, irq_num)); 630 pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), apic_irq, apic_level );630 pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), apic_irq, apic_level, uTagSrc); 631 631 } 632 632 } else { 633 633 Log3(("apic_set_irq: %s: irq_num1=%d level=%d acpi_irq=%d\n", 634 634 R3STRING(pPciDev->name), irq_num1, iLevel, acpi_irq)); 635 pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), acpi_irq, iLevel );635 pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), acpi_irq, iLevel, uTagSrc); 636 636 } 637 637 } … … 650 650 * @param iIrq IRQ number to set. 651 651 * @param iLevel IRQ level. 652 * @param uTagSrc The IRQ tag and source ID (for tracing). 652 653 * @remark uDevFn and pPciDev->devfn are not the same if the device is behind a bridge. 653 654 * In that case uDevFn will be the slot of the bridge which is needed to calculate the 654 655 * PIRQ value. 655 656 */ 656 static void pciSetIrqInternal(PPCIGLOBALS pGlobals, uint8_t uDevFn, PPCIDEVICE pPciDev, int iIrq, int iLevel )657 static void pciSetIrqInternal(PPCIGLOBALS pGlobals, uint8_t uDevFn, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc) 657 658 { 658 659 PPCIBUS pBus = &pGlobals->PciBus; … … 682 683 * PCI device configuration space). 683 684 */ 684 apic_set_irq(pBus, uDevFn, pPciDev, -1, iLevel, pPciDev->config[PCI_INTERRUPT_LINE] );685 apic_set_irq(pBus, uDevFn, pPciDev, -1, iLevel, pPciDev->config[PCI_INTERRUPT_LINE], uTagSrc); 685 686 else 686 apic_set_irq(pBus, uDevFn, pPciDev, iIrq, iLevel, -1 );687 apic_set_irq(pBus, uDevFn, pPciDev, iIrq, iLevel, -1, uTagSrc); 687 688 return; 688 689 } … … 732 733 pic_level |= pGlobals->acpi_irq_level; 733 734 734 Log3(("pciSetIrq: %s: iLevel=%d iIrq=%d pic_irq=%d pic_level=%d \n",735 R3STRING(pPciDev->name), iLevel, iIrq, pic_irq, pic_level ));736 pBus->CTX_SUFF(pPciHlp)->pfnIsaSetIrq(pBus->CTX_SUFF(pDevIns), pic_irq, pic_level );735 Log3(("pciSetIrq: %s: iLevel=%d iIrq=%d pic_irq=%d pic_level=%d uTagSrc=%#x\n", 736 R3STRING(pPciDev->name), iLevel, iIrq, pic_irq, pic_level, uTagSrc)); 737 pBus->CTX_SUFF(pPciHlp)->pfnIsaSetIrq(pBus->CTX_SUFF(pDevIns), pic_irq, pic_level, uTagSrc); 737 738 738 739 /** @todo optimize pci irq flip-flop some rainy day. */ 739 740 if ((iLevel & PDM_IRQ_LEVEL_FLIP_FLOP) == PDM_IRQ_LEVEL_FLIP_FLOP) 740 pciSetIrqInternal(pGlobals, uDevFn, pPciDev, iIrq, PDM_IRQ_LEVEL_LOW );741 pciSetIrqInternal(pGlobals, uDevFn, pPciDev, iIrq, PDM_IRQ_LEVEL_LOW, uTagSrc); 741 742 } 742 743 } … … 749 750 * @param iIrq IRQ number to set. 750 751 * @param iLevel IRQ level. 751 */ 752 PDMBOTHCBDECL(void) pciSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel) 753 { 754 pciSetIrqInternal(PDMINS_2_DATA(pDevIns, PPCIGLOBALS), pPciDev->devfn, pPciDev, iIrq, iLevel); 752 * @param uTagSrc The IRQ tag and source ID (for tracing). 753 */ 754 PDMBOTHCBDECL(void) pciSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc) 755 { 756 pciSetIrqInternal(PDMINS_2_DATA(pDevIns, PPCIGLOBALS), pPciDev->devfn, pPciDev, iIrq, iLevel, uTagSrc); 755 757 } 756 758 … … 2246 2248 * @param iIrq IRQ number to set. 2247 2249 * @param iLevel IRQ level. 2248 */ 2249 PDMBOTHCBDECL(void) pcibridgeSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel) 2250 * @param uTagSrc The IRQ tag and source ID (for tracing). 2251 */ 2252 PDMBOTHCBDECL(void) pcibridgeSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc) 2250 2253 { 2251 2254 /* … … 2273 2276 2274 2277 AssertMsg(pBus->iBus == 0, ("This is not the host pci bus iBus=%d\n", pBus->iBus)); 2275 pciSetIrqInternal(PCIBUS_2_PCIGLOBALS(pBus), uDevFnBridge, pPciDev, iIrqPinBridge, iLevel );2278 pciSetIrqInternal(PCIBUS_2_PCIGLOBALS(pBus), uDevFnBridge, pPciDev, iIrqPinBridge, iLevel, uTagSrc); 2276 2279 } 2277 2280 -
trunk/src/VBox/Devices/Bus/DevPciIch9.cpp
r40282 r40907 165 165 166 166 /* Prototypes */ 167 static void ich9pciSetIrqInternal(PICH9PCIGLOBALS pGlobals, uint8_t uDevFn, PPCIDEVICE pPciDev, int iIrq, int iLevel); 167 static void ich9pciSetIrqInternal(PICH9PCIGLOBALS pGlobals, uint8_t uDevFn, PPCIDEVICE pPciDev, 168 int iIrq, int iLevel, uint32_t uTagSrc); 168 169 #ifdef IN_RING3 169 170 static void ich9pcibridgeReset(PPDMDEVINS pDevIns); … … 192 193 } 193 194 194 PDMBOTHCBDECL(void) ich9pciSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel )195 { 196 ich9pciSetIrqInternal(PDMINS_2_DATA(pDevIns, PICH9PCIGLOBALS), pPciDev->devfn, pPciDev, iIrq, iLevel );197 } 198 199 PDMBOTHCBDECL(void) ich9pcibridgeSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel )195 PDMBOTHCBDECL(void) ich9pciSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc) 196 { 197 ich9pciSetIrqInternal(PDMINS_2_DATA(pDevIns, PICH9PCIGLOBALS), pPciDev->devfn, pPciDev, iIrq, iLevel, uTagSrc); 198 } 199 200 PDMBOTHCBDECL(void) ich9pcibridgeSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc) 200 201 { 201 202 /* … … 223 224 224 225 AssertMsgReturnVoid(pBus->iBus == 0, ("This is not the host pci bus iBus=%d\n", pBus->iBus)); 225 ich9pciSetIrqInternal(PCIROOTBUS_2_PCIGLOBALS(pBus), uDevFnBridge, pPciDev, iIrqPinBridge, iLevel );226 ich9pciSetIrqInternal(PCIROOTBUS_2_PCIGLOBALS(pBus), uDevFnBridge, pPciDev, iIrqPinBridge, iLevel, uTagSrc); 226 227 } 227 228 … … 504 505 } 505 506 506 static void ich9pciApicSetIrq(PICH9PCIBUS pBus, uint8_t uDevFn, PCIDevice *pPciDev, int irq_num1, int iLevel, int iForcedIrq) 507 static void ich9pciApicSetIrq(PICH9PCIBUS pBus, uint8_t uDevFn, PCIDevice *pPciDev, int irq_num1, int iLevel, 508 uint32_t uTagSrc, int iForcedIrq) 507 509 { 508 510 /* This is only allowed to be called with a pointer to the root bus. */ … … 522 524 apic_irq = irq_num + 0x10; 523 525 apic_level = pGlobals->uaPciApicIrqLevels[irq_num] != 0; 524 Log3(("ich9pciApicSetIrq: %s: irq_num1=%d level=%d apic_irq=%d apic_level=%d irq_num1=%d \n",525 R3STRING(pPciDev->name), irq_num1, iLevel, apic_irq, apic_level, irq_num ));526 pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), apic_irq, apic_level );526 Log3(("ich9pciApicSetIrq: %s: irq_num1=%d level=%d apic_irq=%d apic_level=%d irq_num1=%d uTagSrc=%#x\n", 527 R3STRING(pPciDev->name), irq_num1, iLevel, apic_irq, apic_level, irq_num, uTagSrc)); 528 pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), apic_irq, apic_level, uTagSrc); 527 529 528 530 if ((iLevel & PDM_IRQ_LEVEL_FLIP_FLOP) == PDM_IRQ_LEVEL_FLIP_FLOP) … … 535 537 pPciDev->Int.s.uIrqPinState = PDM_IRQ_LEVEL_LOW; 536 538 apic_level = pGlobals->uaPciApicIrqLevels[irq_num] != 0; 537 Log3(("ich9pciApicSetIrq: %s: irq_num1=%d level=%d apic_irq=%d apic_level=%d irq_num1=%d (flop)\n",538 R3STRING(pPciDev->name), irq_num1, iLevel, apic_irq, apic_level, irq_num ));539 pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), apic_irq, apic_level );539 Log3(("ich9pciApicSetIrq: %s: irq_num1=%d level=%d apic_irq=%d apic_level=%d irq_num1=%d uTagSrc=%#x (flop)\n", 540 R3STRING(pPciDev->name), irq_num1, iLevel, apic_irq, apic_level, irq_num, uTagSrc)); 541 pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), apic_irq, apic_level, uTagSrc); 540 542 } 541 543 } else { 542 Log3(("ich9pciApicSetIrq: (forced) %s: irq_num1=%d level=%d acpi_irq=%d\n", 543 R3STRING(pPciDev->name), irq_num1, iLevel, iForcedIrq)); 544 pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), iForcedIrq, iLevel); 545 } 546 } 547 548 static void ich9pciSetIrqInternal(PICH9PCIGLOBALS pGlobals, uint8_t uDevFn, PPCIDEVICE pPciDev, int iIrq, int iLevel) 544 Log3(("ich9pciApicSetIrq: (forced) %s: irq_num1=%d level=%d acpi_irq=%d uTagSrc=%#x\n", 545 R3STRING(pPciDev->name), irq_num1, iLevel, iForcedIrq, uTagSrc)); 546 pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), iForcedIrq, iLevel, uTagSrc); 547 } 548 } 549 550 static void ich9pciSetIrqInternal(PICH9PCIGLOBALS pGlobals, uint8_t uDevFn, PPCIDEVICE pPciDev, 551 int iIrq, int iLevel, uint32_t uTagSrc) 549 552 { 550 553 … … 554 557 { 555 558 PPDMDEVINS pDevIns = pGlobals->aPciBus.CTX_SUFF(pDevIns); 556 MsiNotify(pDevIns, pGlobals->aPciBus.CTX_SUFF(pPciHlp), pPciDev, iIrq, iLevel );559 MsiNotify(pDevIns, pGlobals->aPciBus.CTX_SUFF(pPciHlp), pPciDev, iIrq, iLevel, uTagSrc); 557 560 } 558 561 … … 560 563 { 561 564 PPDMDEVINS pDevIns = pGlobals->aPciBus.CTX_SUFF(pDevIns); 562 MsixNotify(pDevIns, pGlobals->aPciBus.CTX_SUFF(pPciHlp), pPciDev, iIrq, iLevel );565 MsixNotify(pDevIns, pGlobals->aPciBus.CTX_SUFF(pPciHlp), pPciDev, iIrq, iLevel, uTagSrc); 563 566 } 564 567 return; … … 582 585 * PCI device configuration space). 583 586 */ 584 ich9pciApicSetIrq(pBus, uDevFn, pPciDev, -1, iLevel, PCIDevGetInterruptLine(pPciDev));587 ich9pciApicSetIrq(pBus, uDevFn, pPciDev, -1, iLevel, uTagSrc, PCIDevGetInterruptLine(pPciDev)); 585 588 else 586 ich9pciApicSetIrq(pBus, uDevFn, pPciDev, iIrq, iLevel, -1);589 ich9pciApicSetIrq(pBus, uDevFn, pPciDev, iIrq, iLevel, uTagSrc, -1); 587 590 } 588 591 } -
trunk/src/VBox/Devices/Bus/MsiCommon.cpp
r36663 r40907 103 103 104 104 #ifdef IN_RING3 105 void MsiPciConfigWrite(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, uint32_t u32Address, uint32_t val, unsigned len) 105 void MsiPciConfigWrite(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, 106 uint32_t u32Address, uint32_t val, unsigned len) 106 107 { 107 108 int32_t iOff = u32Address - pDev->Int.s.u8MsiCapOffset; … … 169 170 { 170 171 Log(("msi: notify earlier masked pending vector: %d\n", uVector)); 171 MsiNotify(pDevIns, pPciHlp, pDev, uVector, PDM_IRQ_LEVEL_HIGH );172 MsiNotify(pDevIns, pPciHlp, pDev, uVector, PDM_IRQ_LEVEL_HIGH, 0 /*uTagSrc*/); 172 173 } 173 174 } … … 271 272 } 272 273 273 void MsiNotify(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, int iVector, int iLevel )274 void MsiNotify(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, int iVector, int iLevel, uint32_t uTagSrc) 274 275 { 275 276 AssertMsg(msiIsEnabled(pDev), ("Must be enabled to use that")); … … 304 305 305 306 Assert(pPciHlp->pfnIoApicSendMsi != NULL); 306 pPciHlp->pfnIoApicSendMsi(pDevIns, GCAddr, u32Value );307 } 307 pPciHlp->pfnIoApicSendMsi(pDevIns, GCAddr, u32Value, uTagSrc); 308 } -
trunk/src/VBox/Devices/Bus/MsiCommon.h
r36663 r40907 37 37 38 38 /* Device notification (aka interrupt). */ 39 void MsiNotify(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, int iVector, int iLevel );39 void MsiNotify(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, int iVector, int iLevel, uint32_t uTagSrc); 40 40 41 41 #ifdef IN_RING3 … … 54 54 55 55 /* Device notification (aka interrupt). */ 56 void MsixNotify(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, int iVector, int iLevel );56 void MsixNotify(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, int iVector, int iLevel, uint32_t uTagSrc); 57 57 58 58 #ifdef IN_RING3 -
trunk/src/VBox/Devices/Bus/MsixCommon.cpp
r39135 r40907 109 109 { 110 110 if (msixIsPending(pDev, iVector) && !msixIsVectorMasked(pDev, iVector)) 111 MsixNotify(pDevIns, pPciHlp, pDev, iVector, 1 /* iLevel */ );111 MsixNotify(pDevIns, pPciHlp, pDev, iVector, 1 /* iLevel */, 0 /*uTagSrc*/); 112 112 } 113 113 … … 239 239 } 240 240 241 void MsixNotify(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, int iVector, int iLevel )241 void MsixNotify(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, int iVector, int iLevel, uint32_t uTagSrc) 242 242 { 243 243 AssertMsg(msixIsEnabled(pDev), ("Must be enabled to use that")); … … 265 265 uint32_t u32Value = msixGetMsiData(pDev, iVector); 266 266 267 pPciHlp->pfnIoApicSendMsi(pDevIns, GCAddr, u32Value );267 pPciHlp->pfnIoApicSendMsi(pDevIns, GCAddr, u32Value, uTagSrc); 268 268 } 269 269 -
trunk/src/VBox/Devices/PC/DevAPIC.cpp
r40280 r40907 55 55 #include "VBoxDD2.h" 56 56 #include "DevApic.h" 57 57 58 58 59 /******************************************************************************* … … 338 339 /** Timer description timer. */ 339 340 R3PTRTYPE(char *) pszDesc; 341 342 /** The IRQ tags and source IDs for each (tracing purposes). */ 343 uint32_t auTags[256]; 344 340 345 # ifdef VBOX_WITH_STATISTICS 341 346 # if HC_ARCH_BITS == 32 … … 436 441 437 442 static void apic_init_ipi(APICDeviceInfo* pDev, APICState *s); 438 static void apic_set_irq(APICDeviceInfo* pDev, APICState *s, int vector_num, int trigger_mode );443 static void apic_set_irq(APICDeviceInfo* pDev, APICState *s, int vector_num, int trigger_mode, uint32_t uTagSrc); 439 444 static bool apic_update_irq(APICDeviceInfo* pDev, APICState *s); 440 445 … … 530 535 PCVMCPUSET pDstSet, uint8_t delivery_mode, 531 536 uint8_t vector_num, uint8_t polarity, 532 uint8_t trigger_mode )533 { 534 LogFlow(("apic_bus_deliver mask=%R[vmcpuset] mode=%x vector=%x polarity=%x trigger_mode=%x \n",535 pDstSet, delivery_mode, vector_num, polarity, trigger_mode ));537 uint8_t trigger_mode, uint32_t uTagSrc) 538 { 539 LogFlow(("apic_bus_deliver mask=%R[vmcpuset] mode=%x vector=%x polarity=%x trigger_mode=%x uTagSrc=%#x\n", 540 pDstSet, delivery_mode, vector_num, polarity, trigger_mode, uTagSrc)); 536 541 537 542 switch (delivery_mode) … … 543 548 { 544 549 APICState *pApic = getLapicById(pDev, idDstCpu); 545 apic_set_irq(pDev, pApic, vector_num, trigger_mode );550 apic_set_irq(pDev, pApic, vector_num, trigger_mode, uTagSrc); 546 551 } 547 552 return VINF_SUCCESS; … … 585 590 586 591 APIC_FOREACH_IN_SET_BEGIN(pDev, pDstSet); 587 apic_set_irq(pDev, pCurApic, vector_num, trigger_mode );592 apic_set_irq(pDev, pCurApic, vector_num, trigger_mode, uTagSrc); 588 593 APIC_FOREACH_END(); 589 594 return VINF_SUCCESS; … … 830 835 vector, 831 836 0 /* Polarity - conform to the bus */, 832 0 /* Trigger mode - edge */); 837 0 /* Trigger mode - edge */, 838 0 /*uTagSrc*/); 833 839 APIC_UNLOCK(pDev); 834 840 break; … … 1077 1083 PDMBOTHCBDECL(int) apicBusDeliverCallback(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, 1078 1084 uint8_t u8DeliveryMode, uint8_t iVector, uint8_t u8Polarity, 1079 uint8_t u8TriggerMode )1085 uint8_t u8TriggerMode, uint32_t uTagSrc) 1080 1086 { 1081 1087 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 1082 1088 Assert(PDMCritSectIsOwner(pDev->CTX_SUFF(pCritSect))); 1083 LogFlow(("apicBusDeliverCallback: pDevIns=%p u8Dest=%#x u8DestMode=%#x u8DeliveryMode=%#x iVector=%#x u8Polarity=%#x u8TriggerMode=%#x \n",1084 pDevIns, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode ));1089 LogFlow(("apicBusDeliverCallback: pDevIns=%p u8Dest=%#x u8DestMode=%#x u8DeliveryMode=%#x iVector=%#x u8Polarity=%#x u8TriggerMode=%#x uTagSrc=%#x\n", 1090 pDevIns, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode, uTagSrc)); 1085 1091 VMCPUSET DstSet; 1086 1092 return apic_bus_deliver(pDev, apic_get_delivery_bitmask(pDev, u8Dest, u8DestMode, &DstSet), 1087 u8DeliveryMode, iVector, u8Polarity, u8TriggerMode );1093 u8DeliveryMode, iVector, u8Polarity, u8TriggerMode, uTagSrc); 1088 1094 } 1089 1095 … … 1269 1275 } 1270 1276 1271 static void apic_set_irq(APICDeviceInfo *pDev, APICState* s, int vector_num, int trigger_mode) 1272 { 1273 LogFlow(("CPU%d: apic_set_irq vector=%x, trigger_mode=%x\n", s->phys_id, vector_num, trigger_mode)); 1277 static void apic_set_irq(APICDeviceInfo *pDev, APICState* s, int vector_num, int trigger_mode, uint32_t uTagSrc) 1278 { 1279 LogFlow(("CPU%d: apic_set_irq vector=%x trigger_mode=%x uTagSrc=%#x\n", s->phys_id, vector_num, trigger_mode, uTagSrc)); 1280 1274 1281 Apic256BitReg_SetBit(&s->irr, vector_num); 1275 1282 if (trigger_mode) … … 1277 1284 else 1278 1285 Apic256BitReg_ClearBit(&s->tmr, vector_num); 1286 1287 if (!s->auTags[vector_num]) 1288 s->auTags[vector_num] = uTagSrc; 1289 else 1290 s->auTags[vector_num] |= RT_BIT_32(31); 1291 1279 1292 apic_update_irq(pDev, s); 1280 1293 } … … 1368 1381 { 1369 1382 int dest_shorthand = (s->icr[0] >> 18) & 3; 1370 LogFlow(("apic_deliver dest=%x dest_mode=%x dest_shorthand=%x delivery_mode=%x vector_num=%x polarity=%x trigger_mode=%x \n", dest, dest_mode, dest_shorthand, delivery_mode, vector_num, polarity, trigger_mode));1383 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)); 1371 1384 1372 1385 VMCPUSET DstSet; … … 1420 1433 1421 1434 return apic_bus_deliver(pDev, &DstSet, delivery_mode, vector_num, 1422 polarity, trigger_mode );1423 } 1424 1425 1426 PDMBOTHCBDECL(int) apicGetInterrupt(PPDMDEVINS pDevIns )1435 polarity, trigger_mode, 0 /* uTagSrc*/); 1436 } 1437 1438 1439 PDMBOTHCBDECL(int) apicGetInterrupt(PPDMDEVINS pDevIns, uint32_t *puTagSrc) 1427 1440 { 1428 1441 APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); … … 1455 1468 if (s->tpr && (uint32_t)intno <= s->tpr) 1456 1469 { 1470 *puTagSrc = 0; 1457 1471 Log(("apic_get_interrupt: returns %d (sp)\n", s->spurious_vec & 0xff)); 1458 1472 return s->spurious_vec & 0xff; 1459 1473 } 1474 1460 1475 Apic256BitReg_ClearBit(&s->irr, intno); 1461 1476 Apic256BitReg_SetBit(&s->isr, intno); 1477 1478 *puTagSrc = s->auTags[intno]; 1479 s->auTags[intno] = 0; 1480 1462 1481 apic_update_irq(pDev, s); 1463 LogFlow(("CPU%d: apic_get_interrupt: returns %d\n", s->phys_id, intno)); 1482 1483 LogFlow(("CPU%d: apic_get_interrupt: returns %d / %#x\n", s->phys_id, intno, *puTagSrc)); 1464 1484 return intno; 1465 1485 } … … 1679 1699 if (!(pApic->lvt[APIC_LVT_TIMER] & APIC_LVT_MASKED)) { 1680 1700 LogFlow(("apic_timer: trigger irq\n")); 1681 apic_set_irq(pDev, pApic, pApic->lvt[APIC_LVT_TIMER] & 0xff, APIC_TRIGGER_EDGE );1701 apic_set_irq(pDev, pApic, pApic->lvt[APIC_LVT_TIMER] & 0xff, APIC_TRIGGER_EDGE, 0 /*uTagSrc*/); 1682 1702 1683 1703 if ( (pApic->lvt[APIC_LVT_TIMER] & APIC_LVT_TIMER_PERIODIC) -
trunk/src/VBox/Devices/PC/DevIoApic.cpp
r40280 r40907 87 87 uint32_t irr; 88 88 uint64_t ioredtbl[IOAPIC_NUM_PINS]; 89 /** The IRQ tags and source IDs for each pin (tracing purposes). */ 90 uint32_t auTagSrc[IOAPIC_NUM_PINS]; 89 91 90 92 /** The device instance - R3 Ptr. */ … … 157 159 else 158 160 vector = entry & 0xff; 161 uint32_t uTagSrc = pThis->auTagSrc[vector]; 162 pThis->auTagSrc[vector] = 0; 159 163 160 164 int rc = pThis->CTX_SUFF(pIoApicHlp)->pfnApicBusDeliver(pThis->CTX_SUFF(pDevIns), … … 164 168 vector, 165 169 polarity, 166 trig_mode); 170 trig_mode, 171 uTagSrc); 167 172 /* We must be sure that attempts to reschedule in R3 168 173 never get here */ … … 174 179 175 180 176 static void ioapic_set_irq(void *opaque, int vector, int level )181 static void ioapic_set_irq(void *opaque, int vector, int level, uint32_t uTagSrc) 177 182 { 178 183 IOAPICState *pThis = (IOAPICState*)opaque; … … 189 194 { 190 195 pThis->irr |= mask; 196 if (!pThis->auTagSrc[vector]) 197 pThis->auTagSrc[vector] = uTagSrc; 198 else 199 pThis->auTagSrc[vector] = RT_BIT_32(31); 200 191 201 ioapic_service(pThis); 202 192 203 if ((level & PDM_IRQ_LEVEL_FLIP_FLOP) == PDM_IRQ_LEVEL_FLIP_FLOP) 193 204 pThis->irr &= ~mask; … … 202 213 { 203 214 pThis->irr |= mask; 215 if (!pThis->auTagSrc[vector]) 216 pThis->auTagSrc[vector] = uTagSrc; 217 else 218 pThis->auTagSrc[vector] = RT_BIT_32(31); 219 204 220 ioapic_service(pThis); 205 221 } … … 372 388 } 373 389 374 PDMBOTHCBDECL(void) ioapicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel )390 PDMBOTHCBDECL(void) ioapicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc) 375 391 { 376 392 /* PDM lock is taken here; */ /** @todo add assertion */ 377 393 IOAPICState *pThis = PDMINS_2_DATA(pDevIns, IOAPICState *); 378 394 STAM_COUNTER_INC(&pThis->CTXSUFF(StatSetIrq)); 379 LogFlow(("ioapicSetIrq: iIrq=%d iLevel=%d \n", iIrq, iLevel));380 ioapic_set_irq(pThis, iIrq, iLevel );381 } 382 383 PDMBOTHCBDECL(void) ioapicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue )395 LogFlow(("ioapicSetIrq: iIrq=%d iLevel=%d uTagSrc=%#x\n", iIrq, iLevel, uTagSrc)); 396 ioapic_set_irq(pThis, iIrq, iLevel, uTagSrc); 397 } 398 399 PDMBOTHCBDECL(void) ioapicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc) 384 400 { 385 401 IOAPICState *pThis = PDMINS_2_DATA(pDevIns, IOAPICState *); … … 406 422 vector_num, 407 423 0 /* polarity, n/a */, 408 trigger_mode); 424 trigger_mode, 425 uTagSrc); 409 426 /* We must be sure that attempts to reschedule in R3 410 427 never get here */ -
trunk/src/VBox/Devices/PC/DevPIC.cpp
r40280 r40907 51 51 RT_C_DECLS_BEGIN 52 52 53 PDMBOTHCBDECL(void) picSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel );54 PDMBOTHCBDECL(int) picGetInterrupt(PPDMDEVINS pDevIns );53 PDMBOTHCBDECL(void) picSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc); 54 PDMBOTHCBDECL(int) picGetInterrupt(PPDMDEVINS pDevIns, uint32_t *puTagSrc); 55 55 PDMBOTHCBDECL(int) picIOPortRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb); 56 56 PDMBOTHCBDECL(int) picIOPortWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb); … … 109 109 uint8_t elcr_mask; 110 110 /** Pointer to the device instance, R3 Ptr. */ 111 PPDMDEVINSR3 pDevInsR3;111 PPDMDEVINSR3 pDevInsR3; 112 112 /** Pointer to the device instance, R0 Ptr. */ 113 PPDMDEVINSR0 pDevInsR0;113 PPDMDEVINSR0 pDevInsR0; 114 114 /** Pointer to the device instance, RC Ptr. */ 115 PPDMDEVINSRC pDevInsRC; 116 RTRCPTR Alignment0; /**< Structure size alignment. */ 115 PPDMDEVINSRC pDevInsRC; 116 RTRCPTR Alignment0; /**< Structure size alignment. */ 117 /** The IRQ tags and source IDs for each (tracing purposes). */ 118 uint32_t auTags[8]; 119 117 120 } PicState; 118 121 … … 164 167 165 168 /* set irq level. If an edge is detected, then the IRR is set to 1 */ 166 static inline void pic_set_irq1(PicState *s, int irq, int level )169 static inline void pic_set_irq1(PicState *s, int irq, int level, uint32_t uTagSrc) 167 170 { 168 171 int mask; … … 194 197 } 195 198 } 199 200 /* Save the tag. */ 201 if (level) 202 { 203 if (!s->auTags[irq]) 204 s->auTags[irq] = uTagSrc; 205 else 206 s->auTags[irq] |= RT_BIT_32(31); 207 } 208 196 209 DumpPICState(s, "pic_set_irq1"); 197 210 } … … 251 264 if (irq2 >= 0) { 252 265 /* if irq request by slave pic, signal master PIC */ 253 pic_set_irq1(&pics[0], 2, 1 );266 pic_set_irq1(&pics[0], 2, 1, pics[1].auTags[irq2]); 254 267 } else { 255 268 /* If not, clear the IR on the master PIC. */ 256 pic_set_irq1(&pics[0], 2, 0 );269 pic_set_irq1(&pics[0], 2, 0, 0 /*uTagSrc*/); 257 270 } 258 271 /* look at requested irq */ … … 352 365 * @param iIrq IRQ number to set. 353 366 * @param iLevel IRQ level. 354 */ 355 PDMBOTHCBDECL(void) picSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel) 367 * @param uTagSrc The IRQ tag and source ID (for tracing). 368 */ 369 PDMBOTHCBDECL(void) picSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc) 356 370 { 357 371 PDEVPIC pThis = PDMINS_2_DATA(pDevIns, PDEVPIC); … … 371 385 * line must be held high for a while to avoid spurious interrupts. 372 386 */ 373 pic_set_irq1(&pThis->aPics[iIrq >> 3], iIrq & 7, 0 );387 pic_set_irq1(&pThis->aPics[iIrq >> 3], iIrq & 7, 0, uTagSrc); 374 388 pic_update_irq(pThis); 375 389 } 376 pic_set_irq1(&pThis->aPics[iIrq >> 3], iIrq & 7, iLevel & PDM_IRQ_LEVEL_HIGH );390 pic_set_irq1(&pThis->aPics[iIrq >> 3], iIrq & 7, iLevel & PDM_IRQ_LEVEL_HIGH, uTagSrc); 377 391 pic_update_irq(pThis); 378 392 } … … 402 416 * @returns Pending interrupt number. 403 417 * @param pDevIns Device instance of the PICs. 404 */ 405 PDMBOTHCBDECL(int) picGetInterrupt(PPDMDEVINS pDevIns) 418 * @param puTagSrc Where to return the IRQ tag and source ID. 419 */ 420 PDMBOTHCBDECL(int) picGetInterrupt(PPDMDEVINS pDevIns, uint32_t *puTagSrc) 406 421 { 407 422 PDEVPIC pThis = PDMINS_2_DATA(pDevIns, PDEVPIC); … … 431 446 } 432 447 intno = pThis->aPics[1].irq_base + irq2; 433 Log2(("picGetInterrupt1: %x base=%x irq=%x\n", intno, pThis->aPics[1].irq_base, irq2)); 448 *puTagSrc = pThis->aPics[0].auTags[irq2]; 449 pThis->aPics[0].auTags[irq2] = 0; 450 Log2(("picGetInterrupt1: %x base=%x irq=%x uTagSrc=%#x\n", intno, pThis->aPics[1].irq_base, irq2, *puTagSrc)); 434 451 irq = irq2 + 8; 435 452 } 436 else { 453 else 454 { 437 455 intno = pThis->aPics[0].irq_base + irq; 438 Log2(("picGetInterrupt0: %x base=%x irq=%x\n", intno, pThis->aPics[0].irq_base, irq)); 456 *puTagSrc = pThis->aPics[0].auTags[irq]; 457 pThis->aPics[0].auTags[irq] = 0; 458 Log2(("picGetInterrupt0: %x base=%x irq=%x uTagSrc=%#x\n", intno, pThis->aPics[0].irq_base, irq, *puTagSrc)); 439 459 } 440 460 } … … 445 465 irq = 7; 446 466 intno = pThis->aPics[0].irq_base + irq; 467 *puTagSrc = 0; 447 468 } 448 469 pic_update_irq(pThis); -
trunk/src/VBox/VMM/Makefile.kmk
r40652 r40907 372 372 373 373 VMMRC_SOURCES = \ 374 VBoxVMM.d \ 374 375 VMMRC/VMMRC0.asm \ 375 376 VMMRC/VMMRCDeps.cpp \ -
trunk/src/VBox/VMM/VBoxVMM.d
r40832 r40907 30 30 /*^^VMM-ALT-TP: "%04x:%08llx rc=%d", (a_pCtx)->cs, (a_pCtx)->rip, (a_rc) */ 31 31 32 probe em__ff__high(struct VMCPU *a_pVCpu, u nsigned int a_fGlobal, unsigned int a_fLocal, int a_rc);32 probe em__ff__high(struct VMCPU *a_pVCpu, uint32_t a_fGlobal, uint32_t a_fLocal, int a_rc); 33 33 /*^^VMM-ALT-TP: "vm=%#x cpu=%#x rc=%d", (a_fGlobal), (a_fLocal), (a_rc) */ 34 34 35 probe em__ff__all(struct VMCPU *a_pVCpu, u nsigned int a_fGlobal, unsigned int a_fLocal, int a_rc);35 probe em__ff__all(struct VMCPU *a_pVCpu, uint32_t a_fGlobal, uint32_t a_fLocal, int a_rc); 36 36 /*^^VMM-ALT-TP: "vm=%#x cpu=%#x rc=%d", (a_fGlobal), (a_fLocal), (a_rc) */ 37 37 … … 39 39 /*^^VMM-ALT-TP: "%d", (a_rc) */ 40 40 41 probe em__ff__raw(struct VMCPU *a_pVCpu, u nsigned int a_fGlobal, unsigned int a_fLocal);41 probe em__ff__raw(struct VMCPU *a_pVCpu, uint32_t a_fGlobal, uint32_t a_fLocal); 42 42 /*^^VMM-ALT-TP: "vm=%#x cpu=%#x", (a_fGlobal), (a_fLocal) */ 43 43 … … 45 45 /*^^VMM-ALT-TP: "%d", (a_rc) */ 46 46 47 probe r0__gvmm__vm__created(void *a_pGVM, void *a_pVM, unsigned int a_Pid, void *a_hEMT0, unsigned int a_cCpus); 47 probe pdm__irq__get( struct VMCPU *a_pVCpu, uint32_t a_uTag, uint32_t a_idSource, uint32_t a_iIrq); 48 probe pdm__irq__high( struct VMCPU *a_pVCpu, uint32_t a_uTag, uint32_t a_idSource); 49 probe pdm__irq__low( struct VMCPU *a_pVCpu, uint32_t a_uTag, uint32_t a_idSource); 50 probe pdm__irq__hilo(struct VMCPU *a_pVCpu, uint32_t a_uTag, uint32_t a_idSource); 51 52 53 probe r0__gvmm__vm__created(void *a_pGVM, void *a_pVM, uint32_t a_Pid, void *a_hEMT0, uint32_t a_cCpus); 48 54 probe r0__hmsvm__vmexit(struct VMCPU *a_pVM, struct CPUMCTX *a_pCtx, uint64_t a_ExitCode, 49 55 uint64_t a_ExitInfo1, uint64_t a_ExitInfo2, uint64_t a_ExitIntInfo, -
trunk/src/VBox/VMM/VMMAll/PDMAll.cpp
r39402 r40907 31 31 #include <iprt/assert.h> 32 32 33 #include "PDMInline.h" 34 #include "dtrace/VBoxVMM.h" 35 36 33 37 34 38 /** … … 53 57 Assert(pVM->pdm.s.Apic.CTX_SUFF(pDevIns)); 54 58 Assert(pVM->pdm.s.Apic.CTX_SUFF(pfnGetInterrupt)); 55 int i = pVM->pdm.s.Apic.CTX_SUFF(pfnGetInterrupt)(pVM->pdm.s.Apic.CTX_SUFF(pDevIns)); 59 uint32_t uTagSrc; 60 int i = pVM->pdm.s.Apic.CTX_SUFF(pfnGetInterrupt)(pVM->pdm.s.Apic.CTX_SUFF(pDevIns), &uTagSrc); 56 61 AssertMsg(i <= 255 && i >= 0, ("i=%d\n", i)); 57 62 if (i >= 0) … … 59 64 pdmUnlock(pVM); 60 65 *pu8Interrupt = (uint8_t)i; 66 VBOXVMM_PDM_IRQ_GET(pVCpu, RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc), i); 61 67 return VINF_SUCCESS; 62 68 } … … 71 77 Assert(pVM->pdm.s.Pic.CTX_SUFF(pDevIns)); 72 78 Assert(pVM->pdm.s.Pic.CTX_SUFF(pfnGetInterrupt)); 73 int i = pVM->pdm.s.Pic.CTX_SUFF(pfnGetInterrupt)(pVM->pdm.s.Pic.CTX_SUFF(pDevIns)); 79 uint32_t uTagSrc; 80 int i = pVM->pdm.s.Pic.CTX_SUFF(pfnGetInterrupt)(pVM->pdm.s.Pic.CTX_SUFF(pDevIns), &uTagSrc); 74 81 AssertMsg(i <= 255 && i >= 0, ("i=%d\n", i)); 75 82 if (i >= 0) … … 77 84 pdmUnlock(pVM); 78 85 *pu8Interrupt = (uint8_t)i; 86 VBOXVMM_PDM_IRQ_GET(pVCpu, RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc), i); 79 87 return VINF_SUCCESS; 80 88 } … … 94 102 * @param pVM VM handle. 95 103 * @param u8Irq The IRQ line. 96 * @param u8Level The new level. 97 */ 98 VMMDECL(int) PDMIsaSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level) 104 * @param u8Level The new level. 105 * @param uTagSrc The IRQ tag and source tracer ID. 106 */ 107 VMMDECL(int) PDMIsaSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level, uint32_t uTagSrc) 99 108 { 100 109 pdmLock(pVM); 110 111 /** @todo put the IRQ13 code elsewhere to avoid this unnecessary bloat. */ 112 if (!uTagSrc && (u8Level & PDM_IRQ_LEVEL_HIGH)) /* FPU IRQ */ 113 { 114 if (u8Level == PDM_IRQ_LEVEL_HIGH) 115 VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), 0, 0); 116 else 117 VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), 0, 0); 118 } 101 119 102 120 int rc = VERR_PDM_NO_PIC_INSTANCE; … … 104 122 { 105 123 Assert(pVM->pdm.s.Pic.CTX_SUFF(pfnSetIrq)); 106 pVM->pdm.s.Pic.CTX_SUFF(pfnSetIrq)(pVM->pdm.s.Pic.CTX_SUFF(pDevIns), u8Irq, u8Level );124 pVM->pdm.s.Pic.CTX_SUFF(pfnSetIrq)(pVM->pdm.s.Pic.CTX_SUFF(pDevIns), u8Irq, u8Level, uTagSrc); 107 125 rc = VINF_SUCCESS; 108 126 } … … 112 130 Assert(pVM->pdm.s.IoApic.CTX_SUFF(pfnSetIrq)); 113 131 114 /* *132 /* 115 133 * Apply Interrupt Source Override rules. 116 134 * See ACPI 4.0 specification 5.2.12.4 and 5.2.12.5 for details on … … 124 142 u8Irq = 2; 125 143 126 pVM->pdm.s.IoApic.CTX_SUFF(pfnSetIrq)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), u8Irq, u8Level );144 pVM->pdm.s.IoApic.CTX_SUFF(pfnSetIrq)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), u8Irq, u8Level, uTagSrc); 127 145 rc = VINF_SUCCESS; 128 146 } 129 147 148 if (!uTagSrc && u8Level == PDM_IRQ_LEVEL_LOW) 149 VBOXVMM_PDM_IRQ_LOW(VMMGetCpu(pVM), 0, 0); 130 150 pdmUnlock(pVM); 131 151 return rc; … … 140 160 * @param u8Irq The IRQ line. 141 161 * @param u8Level The new level. 142 */ 143 VMMDECL(int) PDMIoApicSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level) 162 * @param uTagSrc The IRQ tag and source tracer ID. 163 */ 164 VMM_INT_DECL(int) PDMIoApicSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level, uint32_t uTagSrc) 144 165 { 145 166 if (pVM->pdm.s.IoApic.CTX_SUFF(pDevIns)) … … 147 168 Assert(pVM->pdm.s.IoApic.CTX_SUFF(pfnSetIrq)); 148 169 pdmLock(pVM); 149 pVM->pdm.s.IoApic.CTX_SUFF(pfnSetIrq)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), u8Irq, u8Level );170 pVM->pdm.s.IoApic.CTX_SUFF(pfnSetIrq)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), u8Irq, u8Level, uTagSrc); 150 171 pdmUnlock(pVM); 151 172 return VINF_SUCCESS; … … 161 182 * @param GCAddr Request address. 162 183 * @param u8Value Request value. 163 */ 164 VMMDECL(int) PDMIoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue) 184 * @param uTagSrc The IRQ tag and source tracer ID. 185 */ 186 VMM_INT_DECL(int) PDMIoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc) 165 187 { 166 188 if (pVM->pdm.s.IoApic.CTX_SUFF(pDevIns)) … … 168 190 Assert(pVM->pdm.s.IoApic.CTX_SUFF(pfnSendMsi)); 169 191 pdmLock(pVM); 170 pVM->pdm.s.IoApic.CTX_SUFF(pfnSendMsi)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), GCAddr, uValue );192 pVM->pdm.s.IoApic.CTX_SUFF(pfnSendMsi)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), GCAddr, uValue, uTagSrc); 171 193 pdmUnlock(pVM); 172 194 return VINF_SUCCESS; -
trunk/src/VBox/VMM/VMMR0/PDMR0Device.cpp
r39078 r40907 36 36 #include <iprt/assert.h> 37 37 #include <iprt/string.h> 38 39 #include "dtrace/VBoxVMM.h" 40 #include "PDMInline.h" 38 41 39 42 … … 56 59 * Internal Functions * 57 60 *******************************************************************************/ 58 static void pdmR0IsaSetIrq(PVM pVM, int iIrq, int iLevel); 59 static void pdmR0IoApicSetIrq(PVM pVM, int iIrq, int iLevel); 60 static void pdmR0IoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue); 61 static bool pdmR0IsaSetIrq(PVM pVM, int iIrq, int iLevel, uint32_t uTagSrc); 61 62 62 63 … … 71 72 PDMDEV_ASSERT_DEVINS(pDevIns); 72 73 LogFlow(("pdmR0DevHlp_PCISetIrq: caller=%p/%d: iIrq=%d iLevel=%d\n", pDevIns, pDevIns->iInstance, iIrq, iLevel)); 73 74 74 PVM pVM = pDevIns->Internal.s.pVMR0; 75 75 PPCIDEVICE pPciDev = pDevIns->Internal.s.pPciDeviceR0; 76 76 PPDMPCIBUS pPciBus = pDevIns->Internal.s.pPciBusR0; 77 78 pdmLock(pVM); 79 uint32_t uTagSrc; 80 if (iLevel & PDM_IRQ_LEVEL_HIGH) 81 { 82 pDevIns->Internal.s.uLastIrqTag = uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing); 83 if (iLevel == PDM_IRQ_LEVEL_HIGH) 84 VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 85 else 86 VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 87 } 88 else 89 uTagSrc = pDevIns->Internal.s.uLastIrqTag; 90 77 91 if ( pPciDev 78 92 && pPciBus 79 93 && pPciBus->pDevInsR0) 80 94 { 81 p dmLock(pVM);82 pPciBus->pfnSetIrqR0(pPciBus->pDevInsR0, pPciDev, iIrq, iLevel); 95 pPciBus->pfnSetIrqR0(pPciBus->pDevInsR0, pPciDev, iIrq, iLevel, uTagSrc); 96 83 97 pdmUnlock(pVM); 98 99 if (iLevel == PDM_IRQ_LEVEL_LOW) 100 VBOXVMM_PDM_IRQ_LOW(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 84 101 } 85 102 else 86 103 { 104 pdmUnlock(pVM); 105 87 106 /* queue for ring-3 execution. */ 88 107 PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueR0); 89 if (pTask) 90 { 91 pTask->enmOp = PDMDEVHLPTASKOP_PCI_SET_IRQ; 92 pTask->pDevInsR3 = PDMDEVINS_2_R3PTR(pDevIns); 93 pTask->u.SetIRQ.iIrq = iIrq; 94 pTask->u.SetIRQ.iLevel = iLevel; 95 96 PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0); 97 } 98 else 99 AssertMsgFailed(("We're out of devhlp queue items!!!\n")); 100 } 101 102 LogFlow(("pdmR0DevHlp_PCISetIrq: caller=%p/%d: returns void\n", pDevIns, pDevIns->iInstance)); 108 AssertReturnVoid(pTask); 109 110 pTask->enmOp = PDMDEVHLPTASKOP_PCI_SET_IRQ; 111 pTask->pDevInsR3 = PDMDEVINS_2_R3PTR(pDevIns); 112 pTask->u.SetIRQ.iIrq = iIrq; 113 pTask->u.SetIRQ.iLevel = iLevel; 114 pTask->u.SetIRQ.uTagSrc = uTagSrc; 115 116 PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0); 117 } 118 119 LogFlow(("pdmR0DevHlp_PCISetIrq: caller=%p/%d: returns void; uTagSrc=%#x\n", pDevIns, pDevIns->iInstance, uTagSrc)); 103 120 } 104 121 … … 109 126 PDMDEV_ASSERT_DEVINS(pDevIns); 110 127 LogFlow(("pdmR0DevHlp_ISASetIrq: caller=%p/%d: iIrq=%d iLevel=%d\n", pDevIns, pDevIns->iInstance, iIrq, iLevel)); 111 112 pdmR0IsaSetIrq(pDevIns->Internal.s.pVMR0, iIrq, iLevel); 113 114 LogFlow(("pdmR0DevHlp_ISASetIrq: caller=%p/%d: returns void\n", pDevIns, pDevIns->iInstance)); 128 PVM pVM = pDevIns->Internal.s.pVMR0; 129 130 pdmLock(pVM); 131 uint32_t uTagSrc; 132 if (iLevel & PDM_IRQ_LEVEL_HIGH) 133 { 134 pDevIns->Internal.s.uLastIrqTag = uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing); 135 if (iLevel == PDM_IRQ_LEVEL_HIGH) 136 VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 137 else 138 VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 139 } 140 else 141 uTagSrc = pDevIns->Internal.s.uLastIrqTag; 142 143 bool fRc = pdmR0IsaSetIrq(pVM, iIrq, iLevel, uTagSrc); 144 145 if (iLevel == PDM_IRQ_LEVEL_LOW && fRc) 146 VBOXVMM_PDM_IRQ_LOW(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 147 pdmUnlock(pVM); 148 LogFlow(("pdmR0DevHlp_ISASetIrq: caller=%p/%d: returns void; uTagSrc=%#x\n", pDevIns, pDevIns->iInstance, uTagSrc)); 115 149 } 116 150 … … 213 247 214 248 215 /** @ copydoc PDMDEVHLPR0::pdmR0DevHlp_PATMSetMMIOPatchInfo*/249 /** @interface_method_impl{PDMDEVHLPR0,pfnPATMSetMMIOPatchInfo} */ 216 250 static DECLCALLBACK(int) pdmR0DevHlp_PATMSetMMIOPatchInfo(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RTGCPTR pCachedData) 217 251 { … … 233 267 LogFlow(("pdmR0DevHlp_GetVM: caller='%p'/%d\n", pDevIns, pDevIns->iInstance)); 234 268 return pDevIns->Internal.s.pVMR0; 235 }236 237 238 /** @interface_method_impl{PDMDEVHLPR0,pfnCanEmulateIoBlock} */239 static DECLCALLBACK(bool) pdmR0DevHlp_CanEmulateIoBlock(PPDMDEVINS pDevIns)240 {241 PDMDEV_ASSERT_DEVINS(pDevIns);242 LogFlow(("pdmR0DevHlp_GetVM: caller='%p'/%d\n", pDevIns, pDevIns->iInstance));243 return HWACCMCanEmulateIoBlock(VMMGetCpu(pDevIns->Internal.s.pVMR0));244 269 } 245 270 … … 288 313 LogFlow(("pdmR3DevHlp_DBGFTraceBuf: caller='%p'/%d: returns %p\n", pDevIns, pDevIns->iInstance, hTraceBuf)); 289 314 return hTraceBuf; 315 } 316 317 318 /** @interface_method_impl{PDMDEVHLPR0,pfnCanEmulateIoBlock} */ 319 static DECLCALLBACK(bool) pdmR0DevHlp_CanEmulateIoBlock(PPDMDEVINS pDevIns) 320 { 321 PDMDEV_ASSERT_DEVINS(pDevIns); 322 LogFlow(("pdmR0DevHlp_GetVM: caller='%p'/%d\n", pDevIns, pDevIns->iInstance)); 323 return HWACCMCanEmulateIoBlock(VMMGetCpu(pDevIns->Internal.s.pVMR0)); 290 324 } 291 325 … … 568 602 /** @interface_method_impl{PDMIOAPICHLPR0,pfnApicBusDeliver} */ 569 603 static DECLCALLBACK(int) pdmR0IoApicHlp_ApicBusDeliver(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode, 570 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode )604 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc) 571 605 { 572 606 PDMDEV_ASSERT_DEVINS(pDevIns); 573 607 PVM pVM = pDevIns->Internal.s.pVMR0; 574 LogFlow(("pdmR0IoApicHlp_ApicBusDeliver: caller=%p/%d: u8Dest=%RX8 u8DestMode=%RX8 u8DeliveryMode=%RX8 iVector=%RX8 u8Polarity=%RX8 u8TriggerMode=%RX8 \n",575 pDevIns, pDevIns->iInstance, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode ));608 LogFlow(("pdmR0IoApicHlp_ApicBusDeliver: caller=%p/%d: u8Dest=%RX8 u8DestMode=%RX8 u8DeliveryMode=%RX8 iVector=%RX8 u8Polarity=%RX8 u8TriggerMode=%RX8 uTagSrc=%#x\n", 609 pDevIns, pDevIns->iInstance, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode, uTagSrc)); 576 610 Assert(pVM->pdm.s.Apic.pDevInsR0); 577 611 if (pVM->pdm.s.Apic.pfnBusDeliverR0) 578 return pVM->pdm.s.Apic.pfnBusDeliverR0(pVM->pdm.s.Apic.pDevInsR0, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode); 612 return pVM->pdm.s.Apic.pfnBusDeliverR0(pVM->pdm.s.Apic.pDevInsR0, u8Dest, u8DestMode, u8DeliveryMode, iVector, 613 u8Polarity, u8TriggerMode, uTagSrc); 579 614 return VINF_SUCCESS; 580 615 } … … 619 654 620 655 /** @interface_method_impl{PDMPCIHLPR0,pfnIsaSetIrq} */ 621 static DECLCALLBACK(void) pdmR0PciHlp_IsaSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel) 622 { 623 PDMDEV_ASSERT_DEVINS(pDevIns); 624 Log4(("pdmR0PciHlp_IsaSetIrq: iIrq=%d iLevel=%d\n", iIrq, iLevel)); 625 pdmR0IsaSetIrq(pDevIns->Internal.s.pVMR0, iIrq, iLevel); 656 static DECLCALLBACK(void) pdmR0PciHlp_IsaSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc) 657 { 658 PDMDEV_ASSERT_DEVINS(pDevIns); 659 Log4(("pdmR0PciHlp_IsaSetIrq: iIrq=%d iLevel=%d uTagSrc=%#x\n", iIrq, iLevel, uTagSrc)); 660 PVM pVM = pDevIns->Internal.s.pVMR0; 661 662 pdmLock(pVM); 663 pdmR0IsaSetIrq(pVM, iIrq, iLevel, uTagSrc); 664 pdmUnlock(pVM); 626 665 } 627 666 628 667 629 668 /** @interface_method_impl{PDMPCIHLPR0,pfnIoApicSetIrq} */ 630 static DECLCALLBACK(void) pdmR0PciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel) 631 { 632 PDMDEV_ASSERT_DEVINS(pDevIns); 633 Log4(("pdmR0PciHlp_IoApicSetIrq: iIrq=%d iLevel=%d\n", iIrq, iLevel)); 634 pdmR0IoApicSetIrq(pDevIns->Internal.s.pVMR0, iIrq, iLevel); 635 } 669 static DECLCALLBACK(void) pdmR0PciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc) 670 { 671 PDMDEV_ASSERT_DEVINS(pDevIns); 672 Log4(("pdmR0PciHlp_IoApicSetIrq: iIrq=%d iLevel=%d uTagSrc=%#x\n", iIrq, iLevel, uTagSrc)); 673 PVM pVM = pDevIns->Internal.s.pVMR0; 674 675 if (pVM->pdm.s.IoApic.pDevInsR0) 676 { 677 pdmLock(pVM); 678 pVM->pdm.s.IoApic.pfnSetIrqR0(pVM->pdm.s.IoApic.pDevInsR0, iIrq, iLevel, uTagSrc); 679 pdmUnlock(pVM); 680 } 681 else if (pVM->pdm.s.IoApic.pDevInsR3) 682 { 683 /* queue for ring-3 execution. */ 684 PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueR0); 685 if (pTask) 686 { 687 pTask->enmOp = PDMDEVHLPTASKOP_IOAPIC_SET_IRQ; 688 pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */ 689 pTask->u.SetIRQ.iIrq = iIrq; 690 pTask->u.SetIRQ.iLevel = iLevel; 691 pTask->u.SetIRQ.uTagSrc = uTagSrc; 692 693 PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0); 694 } 695 else 696 AssertMsgFailed(("We're out of devhlp queue items!!!\n")); 697 } 698 } 699 636 700 637 701 /** @interface_method_impl{PDMPCIHLPR0,pfnIoApicSendMsi} */ 638 static DECLCALLBACK(void) pdmR0PciHlp_IoApicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue) 639 { 640 PDMDEV_ASSERT_DEVINS(pDevIns); 641 Log4(("pdmR0PciHlp_IoApicSendMsi: Address=%p Value=%d\n", GCAddr, uValue)); 642 pdmR0IoApicSendMsi(pDevIns->Internal.s.pVMR0, GCAddr, uValue); 643 } 702 static DECLCALLBACK(void) pdmR0PciHlp_IoApicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc) 703 { 704 PDMDEV_ASSERT_DEVINS(pDevIns); 705 Log4(("pdmR0PciHlp_IoApicSendMsi: GCPhys=%p uValue=%d uTagSrc=%#x\n", GCPhys, uValue, uTagSrc)); 706 PVM pVM = pDevIns->Internal.s.pVMR0; 707 if (pVM->pdm.s.IoApic.pDevInsR0) 708 { 709 pdmLock(pVM); 710 pVM->pdm.s.IoApic.pfnSendMsiR0(pVM->pdm.s.IoApic.pDevInsR0, GCPhys, uValue, uTagSrc); 711 pdmUnlock(pVM); 712 } 713 else 714 { 715 AssertFatalMsgFailed(("Lazy bastards!")); 716 } 717 } 718 644 719 645 720 /** @interface_method_impl{PDMPCIHLPR0,pfnLock} */ … … 814 889 815 890 /** 816 * Sets an irq on the I/O APIC.891 * Sets an irq on the PIC and I/O APIC. 817 892 * 818 * @param pVM The VM handle. 819 * @param iIrq The irq. 820 * @param iLevel The new level. 821 */ 822 static void pdmR0IsaSetIrq(PVM pVM, int iIrq, int iLevel) 823 { 824 if ( ( pVM->pdm.s.IoApic.pDevInsR0 825 || !pVM->pdm.s.IoApic.pDevInsR3) 826 && ( pVM->pdm.s.Pic.pDevInsR0 827 || !pVM->pdm.s.Pic.pDevInsR3)) 828 { 829 pdmLock(pVM); 893 * @returns true if delivered, false if postponed. 894 * @param pVM The VM handle. 895 * @param iIrq The irq. 896 * @param iLevel The new level. 897 * @param uTagSrc The IRQ tag and source. 898 * 899 * @remarks The caller holds the PDM lock. 900 */ 901 static bool pdmR0IsaSetIrq(PVM pVM, int iIrq, int iLevel, uint32_t uTagSrc) 902 { 903 if (RT_LIKELY( ( pVM->pdm.s.IoApic.pDevInsR0 904 || !pVM->pdm.s.IoApic.pDevInsR3) 905 && ( pVM->pdm.s.Pic.pDevInsR0 906 || !pVM->pdm.s.Pic.pDevInsR3))) 907 { 830 908 if (pVM->pdm.s.Pic.pDevInsR0) 831 pVM->pdm.s.Pic.pfnSetIrqR0(pVM->pdm.s.Pic.pDevInsR0, iIrq, iLevel );909 pVM->pdm.s.Pic.pfnSetIrqR0(pVM->pdm.s.Pic.pDevInsR0, iIrq, iLevel, uTagSrc); 832 910 if (pVM->pdm.s.IoApic.pDevInsR0) 833 pVM->pdm.s.IoApic.pfnSetIrqR0(pVM->pdm.s.IoApic.pDevInsR0, iIrq, iLevel); 834 pdmUnlock(pVM); 835 } 836 else 837 { 838 /* queue for ring-3 execution. */ 839 PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueR0); 840 if (pTask) 841 { 842 pTask->enmOp = PDMDEVHLPTASKOP_ISA_SET_IRQ; 843 pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */ 844 pTask->u.SetIRQ.iIrq = iIrq; 845 pTask->u.SetIRQ.iLevel = iLevel; 846 847 PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0); 848 } 849 else 850 AssertMsgFailed(("We're out of devhlp queue items!!!\n")); 851 } 852 } 853 854 855 /** 856 * Sets an irq on the I/O APIC. 857 * 858 * @param pVM The VM handle. 859 * @param iIrq The irq. 860 * @param iLevel The new level. 861 */ 862 static void pdmR0IoApicSetIrq(PVM pVM, int iIrq, int iLevel) 863 { 864 if (pVM->pdm.s.IoApic.pDevInsR0) 865 { 866 pdmLock(pVM); 867 pVM->pdm.s.IoApic.pfnSetIrqR0(pVM->pdm.s.IoApic.pDevInsR0, iIrq, iLevel); 868 pdmUnlock(pVM); 869 } 870 else if (pVM->pdm.s.IoApic.pDevInsR3) 871 { 872 /* queue for ring-3 execution. */ 873 PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueR0); 874 if (pTask) 875 { 876 pTask->enmOp = PDMDEVHLPTASKOP_IOAPIC_SET_IRQ; 877 pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */ 878 pTask->u.SetIRQ.iIrq = iIrq; 879 pTask->u.SetIRQ.iLevel = iLevel; 880 881 PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0); 882 } 883 else 884 AssertMsgFailed(("We're out of devhlp queue items!!!\n")); 885 } 911 pVM->pdm.s.IoApic.pfnSetIrqR0(pVM->pdm.s.IoApic.pDevInsR0, iIrq, iLevel, uTagSrc); 912 return true; 913 } 914 915 /* queue for ring-3 execution. */ 916 PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueR0); 917 AssertReturn(pTask, false); 918 919 pTask->enmOp = PDMDEVHLPTASKOP_ISA_SET_IRQ; 920 pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */ 921 pTask->u.SetIRQ.iIrq = iIrq; 922 pTask->u.SetIRQ.iLevel = iLevel; 923 pTask->u.SetIRQ.uTagSrc = uTagSrc; 924 925 PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0); 926 return false; 886 927 } 887 928 … … 913 954 } 914 955 915 /**916 * Sends an MSI to I/O APIC.917 *918 * @param pVM The VM handle.919 * @param GCAddr Address of the message.920 * @param uValue Value of the message.921 */922 static void pdmR0IoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue)923 {924 if (pVM->pdm.s.IoApic.pDevInsR0)925 {926 pdmLock(pVM);927 pVM->pdm.s.IoApic.pfnSendMsiR0(pVM->pdm.s.IoApic.pDevInsR0, GCAddr, uValue);928 pdmUnlock(pVM);929 }930 } -
trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp
r40274 r40907 44 44 #include <iprt/thread.h> 45 45 46 #include "dtrace/VBoxVMM.h" 47 #include "PDMInline.h" 48 46 49 47 50 /******************************************************************************* … … 1342 1345 * Validate input. 1343 1346 */ 1344 /** @todo iIrq and iLevel checks. */ 1347 Assert(iIrq == 0); 1348 Assert((uint32_t)iLevel <= PDM_IRQ_LEVEL_FLIP_FLOP); 1345 1349 1346 1350 /* … … 1353 1357 Assert(pBus); 1354 1358 PVM pVM = pDevIns->Internal.s.pVMR3; 1359 1355 1360 pdmLock(pVM); 1356 pBus->pfnSetIrqR3(pBus->pDevInsR3, pPciDev, iIrq, iLevel); 1361 uint32_t uTagSrc; 1362 if (iLevel & PDM_IRQ_LEVEL_HIGH) 1363 { 1364 pDevIns->Internal.s.uLastIrqTag = uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing); 1365 if (iLevel == PDM_IRQ_LEVEL_HIGH) 1366 VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 1367 else 1368 VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 1369 } 1370 else 1371 uTagSrc = pDevIns->Internal.s.uLastIrqTag; 1372 1373 pBus->pfnSetIrqR3(pBus->pDevInsR3, pPciDev, iIrq, iLevel, uTagSrc); 1374 1375 if (iLevel == PDM_IRQ_LEVEL_LOW) 1376 VBOXVMM_PDM_IRQ_LOW(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 1357 1377 pdmUnlock(pVM); 1358 1378 } … … 1411 1431 * Validate input. 1412 1432 */ 1413 /** @todo iIrq and iLevel checks. */ 1414 1415 PVM pVM = pDevIns->Internal.s.pVMR3; 1416 PDMIsaSetIrq(pVM, iIrq, iLevel); /* (The API takes the lock.) */ 1433 Assert(iIrq < 16); 1434 Assert((uint32_t)iLevel <= PDM_IRQ_LEVEL_FLIP_FLOP); 1435 1436 PVM pVM = pDevIns->Internal.s.pVMR3; 1437 1438 /* 1439 * Do the job. 1440 */ 1441 pdmLock(pVM); 1442 uint32_t uTagSrc; 1443 if (iLevel & PDM_IRQ_LEVEL_HIGH) 1444 { 1445 pDevIns->Internal.s.uLastIrqTag = uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing); 1446 if (iLevel == PDM_IRQ_LEVEL_HIGH) 1447 VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 1448 else 1449 VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 1450 } 1451 else 1452 uTagSrc = pDevIns->Internal.s.uLastIrqTag; 1453 1454 PDMIsaSetIrq(pVM, iIrq, iLevel, uTagSrc); /* (The API takes the lock recursively.) */ 1455 1456 if (iLevel == PDM_IRQ_LEVEL_LOW) 1457 VBOXVMM_PDM_IRQ_LOW(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 1458 pdmUnlock(pVM); 1417 1459 1418 1460 LogFlow(("pdmR3DevHlp_ISASetIrq: caller='%s'/%d: returns void\n", pDevIns->pReg->szName, pDevIns->iInstance)); … … 3604 3646 { 3605 3647 case PDMDEVHLPTASKOP_ISA_SET_IRQ: 3606 PDMIsaSetIrq(pVM, pTask->u.SetIRQ.iIrq, pTask->u.SetIRQ.iLevel );3648 PDMIsaSetIrq(pVM, pTask->u.SetIRQ.iIrq, pTask->u.SetIRQ.iLevel, pTask->u.SetIRQ.uTagSrc); 3607 3649 break; 3608 3650 3609 3651 case PDMDEVHLPTASKOP_PCI_SET_IRQ: 3610 pdmR3DevHlp_PCISetIrq(pTask->pDevInsR3, pTask->u.SetIRQ.iIrq, pTask->u.SetIRQ.iLevel); 3652 { 3653 /* Same as pdmR3DevHlp_PCISetIrq, except we've got a tag already. */ 3654 PPDMDEVINS pDevIns = pTask->pDevInsR3; 3655 PPCIDEVICE pPciDev = pDevIns->Internal.s.pPciDeviceR3; 3656 if (pPciDev) 3657 { 3658 PPDMPCIBUS pBus = pDevIns->Internal.s.pPciBusR3; /** @todo the bus should be associated with the PCI device not the PDM device. */ 3659 Assert(pBus); 3660 3661 pdmLock(pVM); 3662 pBus->pfnSetIrqR3(pBus->pDevInsR3, pPciDev, pTask->u.SetIRQ.iIrq, 3663 pTask->u.SetIRQ.iLevel, pTask->u.SetIRQ.uTagSrc); 3664 pdmUnlock(pVM); 3665 } 3666 else 3667 AssertReleaseMsgFailed(("No PCI device registered!\n")); 3611 3668 break; 3669 } 3612 3670 3613 3671 case PDMDEVHLPTASKOP_IOAPIC_SET_IRQ: 3614 PDMIoApicSetIrq(pVM, pTask->u.SetIRQ.iIrq, pTask->u.SetIRQ.iLevel );3672 PDMIoApicSetIrq(pVM, pTask->u.SetIRQ.iIrq, pTask->u.SetIRQ.iLevel, pTask->u.SetIRQ.uTagSrc); 3615 3673 break; 3616 3674 -
trunk/src/VBox/VMM/VMMR3/PDMDevMiscHlp.cpp
r40274 r40907 35 35 #include <iprt/assert.h> 36 36 #include <iprt/thread.h> 37 38 39 #include "PDMInline.h" 40 #include "dtrace/VBoxVMM.h" 37 41 38 42 … … 378 382 /** @interface_method_impl{PDMIOAPICHLPR3,pfnApicBusDeliver} */ 379 383 static DECLCALLBACK(int) pdmR3IoApicHlp_ApicBusDeliver(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode, 380 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode )381 { 382 PDMDEV_ASSERT_DEVINS(pDevIns); 383 PVM pVM = pDevIns->Internal.s.pVMR3; 384 LogFlow(("pdmR3IoApicHlp_ApicBusDeliver: caller='%s'/%d: u8Dest=%RX8 u8DestMode=%RX8 u8DeliveryMode=%RX8 iVector=%RX8 u8Polarity=%RX8 u8TriggerMode=%RX8 \n",385 pDevIns->pReg->szName, pDevIns->iInstance, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode ));384 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc) 385 { 386 PDMDEV_ASSERT_DEVINS(pDevIns); 387 PVM pVM = pDevIns->Internal.s.pVMR3; 388 LogFlow(("pdmR3IoApicHlp_ApicBusDeliver: caller='%s'/%d: u8Dest=%RX8 u8DestMode=%RX8 u8DeliveryMode=%RX8 iVector=%RX8 u8Polarity=%RX8 u8TriggerMode=%RX8 uTagSrc=%#x\n", 389 pDevIns->pReg->szName, pDevIns->iInstance, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode, uTagSrc)); 386 390 if (pVM->pdm.s.Apic.pfnBusDeliverR3) 387 return pVM->pdm.s.Apic.pfnBusDeliverR3(pVM->pdm.s.Apic.pDevInsR3, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode );391 return pVM->pdm.s.Apic.pfnBusDeliverR3(pVM->pdm.s.Apic.pDevInsR3, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode, uTagSrc); 388 392 return VINF_SUCCESS; 389 393 } … … 462 466 463 467 /** @interface_method_impl{PDMPCIHLPR3,pfnIsaSetIrq} */ 464 static DECLCALLBACK(void) pdmR3PciHlp_IsaSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel) 465 { 466 PDMDEV_ASSERT_DEVINS(pDevIns); 467 Log4(("pdmR3PciHlp_IsaSetIrq: iIrq=%d iLevel=%d\n", iIrq, iLevel)); 468 PDMIsaSetIrq(pDevIns->Internal.s.pVMR3, iIrq, iLevel); 468 static DECLCALLBACK(void) pdmR3PciHlp_IsaSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc) 469 { 470 PDMDEV_ASSERT_DEVINS(pDevIns); 471 Log4(("pdmR3PciHlp_IsaSetIrq: iIrq=%d iLevel=%d uTagSrc=%#x\n", iIrq, iLevel, uTagSrc)); 472 PVM pVM = pDevIns->Internal.s.pVMR3; 473 PDMIsaSetIrq(pDevIns->Internal.s.pVMR3, iIrq, iLevel, uTagSrc); 469 474 } 470 475 471 476 /** @interface_method_impl{PDMPCIHLPR3,pfnIoApicSetIrq} */ 472 static DECLCALLBACK(void) pdmR3PciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel )473 { 474 PDMDEV_ASSERT_DEVINS(pDevIns); 475 Log4(("pdmR3PciHlp_IoApicSetIrq: iIrq=%d iLevel=%d \n", iIrq, iLevel));476 PDMIoApicSetIrq(pDevIns->Internal.s.pVMR3, iIrq, iLevel );477 static DECLCALLBACK(void) pdmR3PciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc) 478 { 479 PDMDEV_ASSERT_DEVINS(pDevIns); 480 Log4(("pdmR3PciHlp_IoApicSetIrq: iIrq=%d iLevel=%d uTagSrc=%#x\n", iIrq, iLevel, uTagSrc)); 481 PDMIoApicSetIrq(pDevIns->Internal.s.pVMR3, iIrq, iLevel, uTagSrc); 477 482 } 478 483 479 484 /** @interface_method_impl{PDMPCIHLPR3,pfnIoApicSendMsi} */ 480 static DECLCALLBACK(void) pdmR3PciHlp_IoApicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue )481 { 482 PDMDEV_ASSERT_DEVINS(pDevIns); 483 Log4(("pdmR3PciHlp_IoApicSendMsi: address=%p value=%x \n", GCAddr, uValue));484 PDMIoApicSendMsi(pDevIns->Internal.s.pVMR3, GCAddr, uValue );485 static DECLCALLBACK(void) pdmR3PciHlp_IoApicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc) 486 { 487 PDMDEV_ASSERT_DEVINS(pDevIns); 488 Log4(("pdmR3PciHlp_IoApicSendMsi: address=%p value=%x uTagSrc=%#x\n", GCAddr, uValue, uTagSrc)); 489 PDMIoApicSendMsi(pDevIns->Internal.s.pVMR3, GCAddr, uValue, uTagSrc); 485 490 } 486 491 … … 612 617 PDMDEV_ASSERT_DEVINS(pDevIns); 613 618 LogFlow(("pdmR3HpetHlp_SetIrq: caller='%s'/%d: iIrq=%d iLevel=%d\n", pDevIns->pReg->szName, pDevIns->iInstance, iIrq, iLevel)); 614 PDMIsaSetIrq(pDevIns->Internal.s.pVMR3, iIrq, iLevel); 619 PVM pVM = pDevIns->Internal.s.pVMR3; 620 621 pdmLock(pVM); 622 uint32_t uTagSrc; 623 if (iLevel & PDM_IRQ_LEVEL_HIGH) 624 { 625 pDevIns->Internal.s.uLastIrqTag = uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing); 626 if (iLevel == PDM_IRQ_LEVEL_HIGH) 627 VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 628 else 629 VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 630 } 631 else 632 uTagSrc = pDevIns->Internal.s.uLastIrqTag; 633 634 PDMIsaSetIrq(pVM, iIrq, iLevel, uTagSrc); /* (The API takes the lock recursively.) */ 635 636 if (iLevel == PDM_IRQ_LEVEL_LOW) 637 VBOXVMM_PDM_IRQ_LOW(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 638 pdmUnlock(pVM); 615 639 return 0; 616 640 } -
trunk/src/VBox/VMM/VMMRC/PDMRCDevice.cpp
r37410 r40907 34 34 #include <iprt/assert.h> 35 35 #include <iprt/string.h> 36 37 #include "dtrace/VBoxVMM.h" 38 #include "PDMInline.h" 36 39 37 40 … … 54 57 * Internal Functions * 55 58 *******************************************************************************/ 56 static void pdmRCIsaSetIrq(PVM pVM, int iIrq, int iLevel); 57 static void pdmRCIoApicSetIrq(PVM pVM, int iIrq, int iLevel); 58 static void pdmRCIoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue); 59 static bool pdmRCIsaSetIrq(PVM pVM, int iIrq, int iLevel, uint32_t uTagSrc); 60 59 61 60 62 /** @name Raw-Mode Context Device Helpers … … 71 73 PPCIDEVICE pPciDev = pDevIns->Internal.s.pPciDeviceRC; 72 74 PPDMPCIBUS pPciBus = pDevIns->Internal.s.pPciBusRC; 75 76 pdmLock(pVM); 77 uint32_t uTagSrc; 78 if (iLevel & PDM_IRQ_LEVEL_HIGH) 79 { 80 pDevIns->Internal.s.uLastIrqTag = uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing); 81 if (iLevel == PDM_IRQ_LEVEL_HIGH) 82 VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 83 else 84 VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 85 } 86 else 87 uTagSrc = pDevIns->Internal.s.uLastIrqTag; 88 73 89 if ( pPciDev 74 90 && pPciBus 75 91 && pPciBus->pDevInsRC) 76 92 { 77 p dmLock(pVM);78 pPciBus->pfnSetIrqRC(pPciBus->pDevInsRC, pPciDev, iIrq, iLevel); 93 pPciBus->pfnSetIrqRC(pPciBus->pDevInsRC, pPciDev, iIrq, iLevel, uTagSrc); 94 79 95 pdmUnlock(pVM); 96 97 if (iLevel == PDM_IRQ_LEVEL_LOW) 98 VBOXVMM_PDM_IRQ_LOW(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 80 99 } 81 100 else 82 101 { 102 pdmUnlock(pVM); 103 83 104 /* queue for ring-3 execution. */ 84 105 PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueRC); 85 if (pTask) 86 { 87 pTask->enmOp = PDMDEVHLPTASKOP_PCI_SET_IRQ; 88 pTask->pDevInsR3 = PDMDEVINS_2_R3PTR(pDevIns); 89 pTask->u.SetIRQ.iIrq = iIrq; 90 pTask->u.SetIRQ.iLevel = iLevel; 91 92 PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueRC, &pTask->Core, 0); 93 } 94 else 95 AssertMsgFailed(("We're out of devhlp queue items!!!\n")); 96 } 97 98 LogFlow(("pdmRCDevHlp_PCISetIrq: caller=%p/%d: returns void\n", pDevIns, pDevIns->iInstance)); 106 AssertReturnVoid(pTask); 107 108 pTask->enmOp = PDMDEVHLPTASKOP_PCI_SET_IRQ; 109 pTask->pDevInsR3 = PDMDEVINS_2_R3PTR(pDevIns); 110 pTask->u.SetIRQ.iIrq = iIrq; 111 pTask->u.SetIRQ.iLevel = iLevel; 112 pTask->u.SetIRQ.uTagSrc = uTagSrc; 113 114 PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueRC, &pTask->Core, 0); 115 } 116 117 LogFlow(("pdmRCDevHlp_PCISetIrq: caller=%p/%d: returns void; uTagSrc=%#x\n", pDevIns, pDevIns->iInstance, uTagSrc)); 99 118 } 100 119 … … 105 124 PDMDEV_ASSERT_DEVINS(pDevIns); 106 125 LogFlow(("pdmRCDevHlp_ISASetIrq: caller=%p/%d: iIrq=%d iLevel=%d\n", pDevIns, pDevIns->iInstance, iIrq, iLevel)); 107 108 pdmRCIsaSetIrq(pDevIns->Internal.s.pVMRC, iIrq, iLevel); 109 110 LogFlow(("pdmRCDevHlp_ISASetIrq: caller=%p/%d: returns void\n", pDevIns, pDevIns->iInstance)); 126 PVM pVM = pDevIns->Internal.s.pVMRC; 127 128 pdmLock(pVM); 129 uint32_t uTagSrc; 130 if (iLevel & PDM_IRQ_LEVEL_HIGH) 131 { 132 pDevIns->Internal.s.uLastIrqTag = uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing); 133 if (iLevel == PDM_IRQ_LEVEL_HIGH) 134 VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 135 else 136 VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 137 } 138 else 139 uTagSrc = pDevIns->Internal.s.uLastIrqTag; 140 141 bool fRc = pdmRCIsaSetIrq(pVM, iIrq, iLevel, uTagSrc); 142 143 if (iLevel == PDM_IRQ_LEVEL_LOW && fRc) 144 VBOXVMM_PDM_IRQ_LOW(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc)); 145 pdmUnlock(pVM); 146 LogFlow(("pdmRCDevHlp_ISASetIrq: caller=%p/%d: returns void; uTagSrc=%#x\n", pDevIns, pDevIns->iInstance, uTagSrc)); 111 147 } 112 148 … … 531 567 /** @interface_method_impl{PDMIOAPICHLPRC,pfnApicBusDeliver} */ 532 568 static DECLCALLBACK(int) pdmRCIoApicHlp_ApicBusDeliver(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode, 533 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode )569 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc) 534 570 { 535 571 PDMDEV_ASSERT_DEVINS(pDevIns); 536 572 PVM pVM = pDevIns->Internal.s.pVMRC; 537 LogFlow(("pdmRCIoApicHlp_ApicBusDeliver: caller=%p/%d: u8Dest=%RX8 u8DestMode=%RX8 u8DeliveryMode=%RX8 iVector=%RX8 u8Polarity=%RX8 u8TriggerMode=%RX8\n", 538 pDevIns, pDevIns->iInstance, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode)); 573 LogFlow(("pdmRCIoApicHlp_ApicBusDeliver: caller=%p/%d: u8Dest=%RX8 u8DestMode=%RX8 u8DeliveryMode=%RX8 iVector=%RX8 u8Polarity=%RX8 u8TriggerMode=%RX8 uTagSrc=%#x\n", 574 pDevIns, pDevIns->iInstance, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode, uTagSrc)); 575 Assert(pVM->pdm.s.Apic.pDevInsRC); 539 576 if (pVM->pdm.s.Apic.pfnBusDeliverRC) 540 return pVM->pdm.s.Apic.pfnBusDeliverRC(pVM->pdm.s.Apic.pDevInsRC, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode); 577 return pVM->pdm.s.Apic.pfnBusDeliverRC(pVM->pdm.s.Apic.pDevInsRC, u8Dest, u8DestMode, u8DeliveryMode, iVector, 578 u8Polarity, u8TriggerMode, uTagSrc); 541 579 return VINF_SUCCESS; 542 580 } … … 581 619 582 620 /** @interface_method_impl{PDMPCIHLPRC,pfnIsaSetIrq} */ 583 static DECLCALLBACK(void) pdmRCPciHlp_IsaSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel) 584 { 585 PDMDEV_ASSERT_DEVINS(pDevIns); 586 Log4(("pdmRCPciHlp_IsaSetIrq: iIrq=%d iLevel=%d\n", iIrq, iLevel)); 587 pdmRCIsaSetIrq(pDevIns->Internal.s.pVMRC, iIrq, iLevel); 621 static DECLCALLBACK(void) pdmRCPciHlp_IsaSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc) 622 { 623 PDMDEV_ASSERT_DEVINS(pDevIns); 624 Log4(("pdmRCPciHlp_IsaSetIrq: iIrq=%d iLevel=%d uTagSrc=%#x\n", iIrq, iLevel, uTagSrc)); 625 PVM pVM = pDevIns->Internal.s.pVMRC; 626 627 pdmLock(pVM); 628 pdmRCIsaSetIrq(pDevIns->Internal.s.pVMRC, iIrq, iLevel, uTagSrc); 629 pdmUnlock(pVM); 588 630 } 589 631 590 632 591 633 /** @interface_method_impl{PDMPCIHLPRC,pfnIoApicSetIrq} */ 592 static DECLCALLBACK(void) pdmRCPciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel) 593 { 594 PDMDEV_ASSERT_DEVINS(pDevIns); 595 Log4(("pdmRCPciHlp_IoApicSetIrq: iIrq=%d iLevel=%d\n", iIrq, iLevel)); 596 pdmRCIoApicSetIrq(pDevIns->Internal.s.pVMRC, iIrq, iLevel); 597 } 634 static DECLCALLBACK(void) pdmRCPciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc) 635 { 636 PDMDEV_ASSERT_DEVINS(pDevIns); 637 Log4(("pdmRCPciHlp_IoApicSetIrq: iIrq=%d iLevel=%d uTagSrc=%#x\n", iIrq, iLevel, uTagSrc)); 638 PVM pVM = pDevIns->Internal.s.pVMRC; 639 640 if (pVM->pdm.s.IoApic.pDevInsRC) 641 { 642 pdmLock(pVM); 643 pVM->pdm.s.IoApic.pfnSetIrqRC(pVM->pdm.s.IoApic.pDevInsRC, iIrq, iLevel, uTagSrc); 644 pdmUnlock(pVM); 645 } 646 else if (pVM->pdm.s.IoApic.pDevInsR3) 647 { 648 /* queue for ring-3 execution. */ 649 PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueRC); 650 if (pTask) 651 { 652 pTask->enmOp = PDMDEVHLPTASKOP_IOAPIC_SET_IRQ; 653 pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */ 654 pTask->u.SetIRQ.iIrq = iIrq; 655 pTask->u.SetIRQ.iLevel = iLevel; 656 pTask->u.SetIRQ.uTagSrc = uTagSrc; 657 658 PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueRC, &pTask->Core, 0); 659 } 660 else 661 AssertMsgFailed(("We're out of devhlp queue items!!!\n")); 662 } 663 } 664 598 665 599 666 /** @interface_method_impl{PDMPCIHLPRC,pfnIoApicSendMsi} */ 600 static DECLCALLBACK(void) pdmRCPciHlp_IoApicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue) 601 { 602 PDMDEV_ASSERT_DEVINS(pDevIns); 603 Log4(("pdmRCPciHlp_IoApicSendMsi: Address=%p Value=%d\n", GCAddr, uValue)); 604 pdmRCIoApicSendMsi(pDevIns->Internal.s.pVMRC, GCAddr, uValue); 667 static DECLCALLBACK(void) pdmRCPciHlp_IoApicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc) 668 { 669 PDMDEV_ASSERT_DEVINS(pDevIns); 670 Log4(("pdmRCPciHlp_IoApicSendMsi: GCPhys=%p uValue=%d uTagSrc=%#x\n", GCPhys, uValue, uTagSrc)); 671 PVM pVM = pDevIns->Internal.s.pVMRC; 672 673 if (pVM->pdm.s.IoApic.pDevInsRC) 674 { 675 pdmLock(pVM); 676 pVM->pdm.s.IoApic.pfnSendMsiRC(pVM->pdm.s.IoApic.pDevInsRC, GCPhys, uValue, uTagSrc); 677 pdmUnlock(pVM); 678 } 679 else 680 { 681 AssertFatalMsgFailed(("Lazy bastarts!")); 682 } 605 683 } 606 684 … … 764 842 765 843 /** 766 * Sets an irq on the I/O APIC.844 * Sets an irq on the PIC and I/O APIC. 767 845 * 768 * @param pVM The VM handle. 769 * @param iIrq The irq. 770 * @param iLevel The new level. 771 */ 772 static void pdmRCIsaSetIrq(PVM pVM, int iIrq, int iLevel) 773 { 774 if ( ( pVM->pdm.s.IoApic.pDevInsRC 775 || !pVM->pdm.s.IoApic.pDevInsR3) 776 && ( pVM->pdm.s.Pic.pDevInsRC 777 || !pVM->pdm.s.Pic.pDevInsR3)) 778 { 779 pdmLock(pVM); 846 * @returns true if delivered, false if postponed. 847 * @param pVM The VM handle. 848 * @param iIrq The irq. 849 * @param iLevel The new level. 850 * @param uTagSrc The IRQ tag and source. 851 * 852 * @remarks The caller holds the PDM lock. 853 */ 854 static bool pdmRCIsaSetIrq(PVM pVM, int iIrq, int iLevel, uint32_t uTagSrc) 855 { 856 if (RT_LIKELY( ( pVM->pdm.s.IoApic.pDevInsRC 857 || !pVM->pdm.s.IoApic.pDevInsR3) 858 && ( pVM->pdm.s.Pic.pDevInsRC 859 || !pVM->pdm.s.Pic.pDevInsR3))) 860 { 780 861 if (pVM->pdm.s.Pic.pDevInsRC) 781 pVM->pdm.s.Pic.pfnSetIrqRC(pVM->pdm.s.Pic.pDevInsRC, iIrq, iLevel );862 pVM->pdm.s.Pic.pfnSetIrqRC(pVM->pdm.s.Pic.pDevInsRC, iIrq, iLevel, uTagSrc); 782 863 if (pVM->pdm.s.IoApic.pDevInsRC) 783 pVM->pdm.s.IoApic.pfnSetIrqRC(pVM->pdm.s.IoApic.pDevInsRC, iIrq, iLevel); 784 pdmUnlock(pVM); 785 } 786 else 787 { 788 /* queue for ring-3 execution. */ 789 PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueRC); 790 if (pTask) 791 { 792 pTask->enmOp = PDMDEVHLPTASKOP_ISA_SET_IRQ; 793 pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */ 794 pTask->u.SetIRQ.iIrq = iIrq; 795 pTask->u.SetIRQ.iLevel = iLevel; 796 797 PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueRC, &pTask->Core, 0); 798 } 799 else 800 AssertMsgFailed(("We're out of devhlp queue items!!!\n")); 801 } 802 } 803 804 805 /** 806 * Sets an irq on the I/O APIC. 807 * 808 * @param pVM The VM handle. 809 * @param iIrq The irq. 810 * @param iLevel The new level. 811 */ 812 static void pdmRCIoApicSetIrq(PVM pVM, int iIrq, int iLevel) 813 { 814 if (pVM->pdm.s.IoApic.pDevInsRC) 815 { 816 pdmLock(pVM); 817 pVM->pdm.s.IoApic.pfnSetIrqRC(pVM->pdm.s.IoApic.pDevInsRC, iIrq, iLevel); 818 pdmUnlock(pVM); 819 } 820 else if (pVM->pdm.s.IoApic.pDevInsR3) 821 { 822 /* queue for ring-3 execution. */ 823 PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueRC); 824 if (pTask) 825 { 826 pTask->enmOp = PDMDEVHLPTASKOP_IOAPIC_SET_IRQ; 827 pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */ 828 pTask->u.SetIRQ.iIrq = iIrq; 829 pTask->u.SetIRQ.iLevel = iLevel; 830 831 PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueRC, &pTask->Core, 0); 832 } 833 else 834 AssertMsgFailed(("We're out of devhlp queue items!!!\n")); 835 } 836 } 837 838 839 /** 840 * Sends an MSI to I/O APIC. 841 * 842 * @param pVM The VM handle. 843 * @param GCAddr Address of the message. 844 * @param uValue Value of the message. 845 */ 846 static void pdmRCIoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue) 847 { 848 if (pVM->pdm.s.IoApic.pDevInsRC) 849 { 850 pdmLock(pVM); 851 pVM->pdm.s.IoApic.pfnSendMsiRC(pVM->pdm.s.IoApic.pDevInsRC, GCAddr, uValue); 852 pdmUnlock(pVM); 853 } 854 } 864 pVM->pdm.s.IoApic.pfnSetIrqRC(pVM->pdm.s.IoApic.pDevInsRC, iIrq, iLevel, uTagSrc); 865 return true; 866 } 867 868 /* queue for ring-3 execution. */ 869 PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueRC); 870 AssertReturn(pTask, false); 871 872 pTask->enmOp = PDMDEVHLPTASKOP_ISA_SET_IRQ; 873 pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */ 874 pTask->u.SetIRQ.iIrq = iIrq; 875 pTask->u.SetIRQ.iLevel = iLevel; 876 pTask->u.SetIRQ.uTagSrc = uTagSrc; 877 878 PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueRC, &pTask->Core, 0); 879 return false; 880 } 881 -
trunk/src/VBox/VMM/include/PDMInternal.h
r40652 r40907 149 149 /** Flags, see PDMDEVINSINT_FLAGS_XXX. */ 150 150 uint32_t fIntFlags; 151 /** The last IRQ tag (for tracing it thru clearing). */ 152 uint32_t uLastIrqTag; 153 /** Size padding. */ 154 uint32_t u32Padding; 151 155 } PDMDEVINSINT; 152 156 … … 454 458 PPDMDEVINSR3 pDevInsR3; 455 459 /** @copydoc PDMPICREG::pfnSetIrqR3 */ 456 DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel ));460 DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)); 457 461 /** @copydoc PDMPICREG::pfnGetInterruptR3 */ 458 DECLR3CALLBACKMEMBER(int, pfnGetInterruptR3,(PPDMDEVINS pDevIns ));462 DECLR3CALLBACKMEMBER(int, pfnGetInterruptR3,(PPDMDEVINS pDevIns, uint32_t *puTagSrc)); 459 463 460 464 /** Pointer to the PIC device instance - R0. */ 461 465 PPDMDEVINSR0 pDevInsR0; 462 466 /** @copydoc PDMPICREG::pfnSetIrqR3 */ 463 DECLR0CALLBACKMEMBER(void, pfnSetIrqR0,(PPDMDEVINS pDevIns, int iIrq, int iLevel ));467 DECLR0CALLBACKMEMBER(void, pfnSetIrqR0,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)); 464 468 /** @copydoc PDMPICREG::pfnGetInterruptR3 */ 465 DECLR0CALLBACKMEMBER(int, pfnGetInterruptR0,(PPDMDEVINS pDevIns ));469 DECLR0CALLBACKMEMBER(int, pfnGetInterruptR0,(PPDMDEVINS pDevIns, uint32_t *puTagSrc)); 466 470 467 471 /** Pointer to the PIC device instance - RC. */ 468 472 PPDMDEVINSRC pDevInsRC; 469 473 /** @copydoc PDMPICREG::pfnSetIrqR3 */ 470 DECLRCCALLBACKMEMBER(void, pfnSetIrqRC,(PPDMDEVINS pDevIns, int iIrq, int iLevel ));474 DECLRCCALLBACKMEMBER(void, pfnSetIrqRC,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)); 471 475 /** @copydoc PDMPICREG::pfnGetInterruptR3 */ 472 DECLRCCALLBACKMEMBER(int, pfnGetInterruptRC,(PPDMDEVINS pDevIns ));476 DECLRCCALLBACKMEMBER(int, pfnGetInterruptRC,(PPDMDEVINS pDevIns, uint32_t *puTagSrc)); 473 477 /** Alignment padding. */ 474 478 RTRCPTR RCPtrPadding; … … 484 488 PPDMDEVINSR3 pDevInsR3; 485 489 /** @copydoc PDMAPICREG::pfnGetInterruptR3 */ 486 DECLR3CALLBACKMEMBER(int, pfnGetInterruptR3,(PPDMDEVINS pDevIns ));490 DECLR3CALLBACKMEMBER(int, pfnGetInterruptR3,(PPDMDEVINS pDevIns, uint32_t *puTagSrc)); 487 491 /** @copydoc PDMAPICREG::pfnHasPendingIrqR3 */ 488 492 DECLR3CALLBACKMEMBER(bool, pfnHasPendingIrqR3,(PPDMDEVINS pDevIns)); … … 501 505 /** @copydoc PDMAPICREG::pfnBusDeliverR3 */ 502 506 DECLR3CALLBACKMEMBER(int, pfnBusDeliverR3,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode, 503 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode ));507 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc)); 504 508 /** @copydoc PDMAPICREG::pfnLocalInterruptR3 */ 505 509 DECLR3CALLBACKMEMBER(int, pfnLocalInterruptR3,(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level)); … … 508 512 PPDMDEVINSR0 pDevInsR0; 509 513 /** @copydoc PDMAPICREG::pfnGetInterruptR3 */ 510 DECLR0CALLBACKMEMBER(int, pfnGetInterruptR0,(PPDMDEVINS pDevIns ));514 DECLR0CALLBACKMEMBER(int, pfnGetInterruptR0,(PPDMDEVINS pDevIns, uint32_t *puTagSrc)); 511 515 /** @copydoc PDMAPICREG::pfnHasPendingIrqR3 */ 512 516 DECLR0CALLBACKMEMBER(bool, pfnHasPendingIrqR0,(PPDMDEVINS pDevIns)); … … 525 529 /** @copydoc PDMAPICREG::pfnBusDeliverR3 */ 526 530 DECLR0CALLBACKMEMBER(int, pfnBusDeliverR0,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode, 527 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode ));531 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc)); 528 532 /** @copydoc PDMAPICREG::pfnLocalInterruptR3 */ 529 533 DECLR0CALLBACKMEMBER(int, pfnLocalInterruptR0,(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level)); … … 532 536 PPDMDEVINSRC pDevInsRC; 533 537 /** @copydoc PDMAPICREG::pfnGetInterruptR3 */ 534 DECLRCCALLBACKMEMBER(int, pfnGetInterruptRC,(PPDMDEVINS pDevIns ));538 DECLRCCALLBACKMEMBER(int, pfnGetInterruptRC,(PPDMDEVINS pDevIns, uint32_t *puTagSrc)); 535 539 /** @copydoc PDMAPICREG::pfnHasPendingIrqR3 */ 536 540 DECLRCCALLBACKMEMBER(bool, pfnHasPendingIrqRC,(PPDMDEVINS pDevIns)); … … 549 553 /** @copydoc PDMAPICREG::pfnBusDeliverR3 */ 550 554 DECLRCCALLBACKMEMBER(int, pfnBusDeliverRC,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode, 551 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode ));555 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc)); 552 556 /** @copydoc PDMAPICREG::pfnLocalInterruptR3 */ 553 557 DECLRCCALLBACKMEMBER(int, pfnLocalInterruptRC,(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level)); … … 565 569 PPDMDEVINSR3 pDevInsR3; 566 570 /** @copydoc PDMIOAPICREG::pfnSetIrqR3 */ 567 DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel ));571 DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)); 568 572 /** @copydoc PDMIOAPICREG::pfnSendMsiR3 */ 569 DECLR3CALLBACKMEMBER(void, pfnSendMsiR3,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue ));573 DECLR3CALLBACKMEMBER(void, pfnSendMsiR3,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc)); 570 574 571 575 /** Pointer to the PIC device instance - R0. */ 572 576 PPDMDEVINSR0 pDevInsR0; 573 577 /** @copydoc PDMIOAPICREG::pfnSetIrqR3 */ 574 DECLR0CALLBACKMEMBER(void, pfnSetIrqR0,(PPDMDEVINS pDevIns, int iIrq, int iLevel ));578 DECLR0CALLBACKMEMBER(void, pfnSetIrqR0,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)); 575 579 /** @copydoc PDMIOAPICREG::pfnSendMsiR3 */ 576 DECLR0CALLBACKMEMBER(void, pfnSendMsiR0,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue ));580 DECLR0CALLBACKMEMBER(void, pfnSendMsiR0,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc)); 577 581 578 582 /** Pointer to the APIC device instance - RC Ptr. */ 579 583 PPDMDEVINSRC pDevInsRC; 580 584 /** @copydoc PDMIOAPICREG::pfnSetIrqR3 */ 581 DECLRCCALLBACKMEMBER(void, pfnSetIrqRC,(PPDMDEVINS pDevIns, int iIrq, int iLevel ));585 DECLRCCALLBACKMEMBER(void, pfnSetIrqRC,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)); 582 586 /** @copydoc PDMIOAPICREG::pfnSendMsiR3 */ 583 DECLRCCALLBACKMEMBER(void, pfnSendMsiRC,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue ));587 DECLRCCALLBACKMEMBER(void, pfnSendMsiRC,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc)); 584 588 585 589 uint8_t Alignment[4]; … … 601 605 PPDMDEVINSR3 pDevInsR3; 602 606 /** @copydoc PDMPCIBUSREG::pfnSetIrqR3 */ 603 DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel ));607 DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc)); 604 608 /** @copydoc PDMPCIBUSREG::pfnRegisterR3 */ 605 609 DECLR3CALLBACKMEMBER(int, pfnRegisterR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, const char *pszName, int iDev)); … … 622 626 R0PTRTYPE(PPDMDEVINS) pDevInsR0; 623 627 /** @copydoc PDMPCIBUSREG::pfnSetIrqR3 */ 624 DECLR0CALLBACKMEMBER(void, pfnSetIrqR0,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel ));628 DECLR0CALLBACKMEMBER(void, pfnSetIrqR0,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc)); 625 629 626 630 /** Pointer to PCI Bus device instance. */ 627 631 PPDMDEVINSRC pDevInsRC; 628 632 /** @copydoc PDMPCIBUSREG::pfnSetIrqR3 */ 629 DECLRCCALLBACKMEMBER(void, pfnSetIrqRC,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel ));633 DECLRCCALLBACKMEMBER(void, pfnSetIrqRC,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc)); 630 634 } PDMPCIBUS; 631 635 … … 892 896 /** The new level. */ 893 897 int iLevel; 898 /** The IRQ tag and source. */ 899 uint32_t uTagSrc; 894 900 } SetIRQ; 901 902 /** Expanding the structure.. */ 903 uint64_t au64[2]; 895 904 } u; 896 905 } PDMDEVHLPTASK; … … 1006 1015 * See PDM_QUEUE_FLUSH_FLAG_ACTIVE and PDM_QUEUE_FLUSH_FLAG_PENDING. */ 1007 1016 uint32_t volatile fQueueFlushing; 1008 /** Alignment padding. */1009 uint32_t u 32Padding2;1017 /** The current IRQ tag (tracing purposes). */ 1018 uint32_t uIrqTag; 1010 1019 1011 1020 /** @name VMM device heap -
trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp
r40274 r40907 162 162 do \ 163 163 { \ 164 printf("info: %s::%s offset %#x (%d) sizeof %d\n", #strct, #member, (int)RT_OFFSETOF(strct, member), (int)RT_OFFSETOF(strct, member), (int)RT_SIZEOFMEMB(strct, member)); \ 165 } while (0) 166 164 printf("info: %10s::%-24s offset %#6x (%6d) sizeof %4d\n", #strct, #member, (int)RT_OFFSETOF(strct, member), (int)RT_OFFSETOF(strct, member), (int)RT_SIZEOFMEMB(strct, member)); \ 165 } while (0) 167 166 168 167 … … 336 335 337 336 /* pdm */ 337 PRINT_OFFSET(PDMDEVINS, Internal); 338 PRINT_OFFSET(PDMDEVINS, achInstanceData); 338 339 CHECK_MEMBER_ALIGNMENT(PDMDEVINS, achInstanceData, 64); 339 340 CHECK_PADDING(PDMDEVINS, Internal, 1); 340 CHECK_MEMBER_ALIGNMENT(PDMUSBINS, achInstanceData, 16); 341 342 PRINT_OFFSET(PDMUSBINS, Internal); 343 PRINT_OFFSET(PDMUSBINS, achInstanceData); 344 CHECK_MEMBER_ALIGNMENT(PDMUSBINS, achInstanceData, 32); 341 345 CHECK_PADDING(PDMUSBINS, Internal, 1); 342 CHECK_MEMBER_ALIGNMENT(PDMDRVINS, achInstanceData, 16); 346 347 PRINT_OFFSET(PDMDRVINS, Internal); 348 PRINT_OFFSET(PDMDRVINS, achInstanceData); 349 CHECK_MEMBER_ALIGNMENT(PDMDRVINS, achInstanceData, 32); 343 350 CHECK_PADDING(PDMDRVINS, Internal, 1); 351 344 352 CHECK_PADDING2(PDMCRITSECT); 345 353 -
trunk/src/recompiler/VBoxREMWrapper.cpp
r40829 r40907 763 763 { REMPARMDESC_FLAGS_INT, sizeof(PVM), NULL }, 764 764 { REMPARMDESC_FLAGS_INT, sizeof(uint8_t), NULL }, 765 { REMPARMDESC_FLAGS_INT, sizeof(uint8_t), NULL } 765 { REMPARMDESC_FLAGS_INT, sizeof(uint8_t), NULL }, 766 { REMPARMDESC_FLAGS_INT, sizeof(uint32_t), NULL } 766 767 }; 767 768 static const REMPARMDESC g_aArgsPDMR3CritSectInit[] = -
trunk/src/recompiler/VBoxRecompiler.c
r40282 r40907 4452 4452 void cpu_set_ferr(CPUX86State *env) 4453 4453 { 4454 int rc = PDMIsaSetIrq(env->pVM, 13, 1 );4454 int rc = PDMIsaSetIrq(env->pVM, 13, 1, 0 /*uTagSrc*/); 4455 4455 LogFlow(("cpu_set_ferr: rc=%d\n", rc)); NOREF(rc); 4456 4456 }
Note:
See TracChangeset
for help on using the changeset viewer.