Changeset 81703 in vbox for trunk/src/VBox/Devices/Network
- Timestamp:
- Nov 6, 2019 11:51:57 AM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 134465
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DevVirtioNet.cpp
r81696 r81703 396 396 } 397 397 398 static DECLCALLBACK(uint32_t) vnetIoCb_GetHostFeatures(void *pvState) 399 { 400 RT_NOREF_PV(pvState); 398 /** 399 * @interface_method_impl{VPCIIOCALLBACKS,pfnGetHostFeatures} 400 */ 401 static DECLCALLBACK(uint32_t) vnetIoCb_GetHostFeatures(PVPCISTATE pVPciState) 402 { 403 RT_NOREF_PV(pVPciState); 401 404 402 405 /* We support: … … 429 432 } 430 433 431 static DECLCALLBACK(uint32_t) vnetIoCb_GetHostMinimalFeatures(void *pvState) 432 { 433 RT_NOREF_PV(pvState); 434 /** 435 * @interface_method_impl{VPCIIOCALLBACKS,pfnGetHostMinimalFeatures} 436 */ 437 static DECLCALLBACK(uint32_t) vnetIoCb_GetHostMinimalFeatures(PVPCISTATE pVPciState) 438 { 439 RT_NOREF_PV(pVPciState); 434 440 return VNET_F_MAC; 435 441 } 436 442 437 static DECLCALLBACK(void) vnetIoCb_SetHostFeatures(void *pvState, uint32_t fFeatures) 438 { 443 /** 444 * @interface_method_impl{VPCIIOCALLBACKS,pfnSetHostFeatures} 445 */ 446 static DECLCALLBACK(void) vnetIoCb_SetHostFeatures(PVPCISTATE pVPciState, uint32_t fFeatures) 447 { 448 PVNETSTATE pThis = RT_FROM_MEMBER(pVPciState, VNETSTATE, VPCI); 439 449 /** @todo Nothing to do here yet */ 440 PVNETSTATE pThis = (PVNETSTATE)pvState;441 450 LogFlow(("%s vnetIoCb_SetHostFeatures: uFeatures=%x\n", INSTANCE(pThis), fFeatures)); 442 451 vnetPrintFeatures(pThis, fFeatures, "The guest negotiated the following features"); 443 452 } 444 453 445 static DECLCALLBACK(int) vnetIoCb_GetConfig(void *pvState, uint32_t offCfg, uint32_t cb, void *data) 446 { 447 PVNETSTATE pThis = (PVNETSTATE)pvState; 454 /** 455 * @interface_method_impl{VPCIIOCALLBACKS,pfnGetConfig} 456 */ 457 static DECLCALLBACK(int) vnetIoCb_GetConfig(PVPCISTATE pVPciState, uint32_t offCfg, uint32_t cb, void *data) 458 { 459 PVNETSTATE pThis = RT_FROM_MEMBER(pVPciState, VNETSTATE, VPCI); 448 460 if (offCfg + cb > sizeof(struct VNetPCIConfig)) 449 461 { … … 455 467 } 456 468 457 static DECLCALLBACK(int) vnetIoCb_SetConfig(void *pvState, uint32_t offCfg, uint32_t cb, void *data) 458 { 459 PVNETSTATE pThis = (PVNETSTATE)pvState; 469 /** 470 * @interface_method_impl{VPCIIOCALLBACKS,pfnSetConfig} 471 */ 472 static DECLCALLBACK(int) vnetIoCb_SetConfig(PVPCISTATE pVPciState, uint32_t offCfg, uint32_t cb, void *data) 473 { 474 PVNETSTATE pThis = RT_FROM_MEMBER(pVPciState, VNETSTATE, VPCI); 460 475 if (offCfg + cb > sizeof(struct VNetPCIConfig)) 461 476 { 462 477 Log(("%s vnetIoCb_SetConfig: Write beyond the config structure is attempted (offCfg=%#x cb=%x).\n", INSTANCE(pThis), offCfg, cb)); 463 478 if (offCfg < sizeof(struct VNetPCIConfig)) 464 memcpy((uint8_t *)&pThis->config + offCfg, data, 465 sizeof(struct VNetPCIConfig) - offCfg); 479 memcpy((uint8_t *)&pThis->config + offCfg, data, sizeof(struct VNetPCIConfig) - offCfg); 466 480 return VINF_SUCCESS; 467 481 } … … 471 485 472 486 /** 487 * @interface_method_impl{VPCIIOCALLBACKS,pfnReset} 488 * 473 489 * Hardware reset. Revert all registers to initial values. 474 * 475 * @param pThis The device state structure. 476 */ 477 static DECLCALLBACK(int) vnetIoCb_Reset(void *pvState) 478 { 479 PVNETSTATE pThis = (PVNETSTATE)pvState; 490 */ 491 static DECLCALLBACK(int) vnetIoCb_Reset(PVPCISTATE pVPciState) 492 { 493 PVNETSTATE pThis = RT_FROM_MEMBER(pVPciState, VNETSTATE, VPCI); 480 494 Log(("%s Reset triggered\n", INSTANCE(pThis))); 481 495 … … 610 624 611 625 /** 626 * @interface_method_impl{VPCIIOCALLBACKS,pfnReady} 627 * 612 628 * This function is called when the driver becomes ready. 613 * 614 * @param pThis The device state structure. 615 */ 616 static DECLCALLBACK(void) vnetIoCb_Ready(void *pvState) 617 { 618 PVNETSTATE pThis = (PVNETSTATE)pvState; 629 */ 630 static DECLCALLBACK(void) vnetIoCb_Ready(PVPCISTATE pVPciState) 631 { 632 PVNETSTATE pThis = RT_FROM_MEMBER(pVPciState, VNETSTATE, VPCI); 619 633 Log(("%s Driver became ready, waking up RX thread...\n", INSTANCE(pThis))); 620 634 /** … … 655 669 PDMBOTHCBDECL(int) vnetIOPortIn(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT port, uint32_t *pu32, unsigned cb) 656 670 { 657 return vpciIOPortIn(pDevIns, pvUser, port, pu32, cb, &g_IOCallbacks); 671 PVNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PVNETSTATE); 672 RT_NOREF(pvUser); 673 return vpciIOPortIn(pDevIns, &pThis->VPCI, port, pu32, cb, &g_IOCallbacks); 658 674 } 659 675 … … 664 680 PDMBOTHCBDECL(int) vnetIOPortOut(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT port, uint32_t u32, unsigned cb) 665 681 { 666 return vpciIOPortOut(pDevIns, pvUser, port, u32, cb, &g_IOCallbacks); 682 PVNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PVNETSTATE); 683 RT_NOREF(pvUser); 684 return vpciIOPortOut(pDevIns, &pThis->VPCI, port, u32, cb, &g_IOCallbacks); 667 685 } 668 686 … … 1118 1136 } 1119 1137 1120 static DECLCALLBACK(void) vnetR3QueueReceive( void *pvState, PVQUEUE pQueue)1121 { 1122 RT_NOREF(pQueue);1123 PVNETSTATE pThis = (PVNETSTATE)pvState;1138 static DECLCALLBACK(void) vnetR3QueueReceive(PPDMDEVINS pDevIns, PVPCISTATE pVPciState, PVQUEUE pQueue) 1139 { 1140 PVNETSTATE pThis = RT_FROM_MEMBER(pVPciState, VNETSTATE, VPCI); 1141 RT_NOREF(pThis, pQueue); 1124 1142 Log(("%s Receive buffers has been added, waking up receive thread.\n", INSTANCE(pThis))); 1125 vnetR3WakeupReceive(p This->VPCI.CTX_SUFF(pDevIns));1143 vnetR3WakeupReceive(pDevIns); 1126 1144 } 1127 1145 … … 1429 1447 # ifdef VNET_TX_DELAY 1430 1448 1431 static DECLCALLBACK(void) vnetR3QueueTransmit(void *pvState, PVQUEUE pQueue) 1432 { 1433 PVNETSTATE pThis = (PVNETSTATE)pvState; 1449 static DECLCALLBACK(void) vnetR3QueueTransmit(PPDMDEVINS pDevIns, PVPCISTATE pVPciState, PVQUEUE pQueue) 1450 { 1451 PVNETSTATE pThis = RT_FROM_MEMBER(pVPciState, VNETSTATE, VPCI); 1452 RT_NOREF(pDevIns); 1434 1453 1435 1454 if (TMTimerIsActive(pThis->CTX_SUFF(pTxTimer))) … … 1513 1532 while (pThread->enmState == PDMTHREADSTATE_RUNNING) 1514 1533 { 1515 rc = SUPSemEventWaitNoResume(pThis->pSupDrvSession, pThis->hTxEvent, RT_INDEFINITE_WAIT);1534 rc = PDMDevHlpSUPSemEventWaitNoResume(pDevIns, pThis->hTxEvent, RT_INDEFINITE_WAIT); 1516 1535 if (RT_UNLIKELY(pThread->enmState != PDMTHREADSTATE_RUNNING)) 1517 1536 break; … … 1538 1557 * @param pThread The send thread. 1539 1558 */ 1540 static DECLCALLBACK(int) vnetTxThreadWakeUp(PPDMDEVINS pDevIns, PPDMTHREAD pThread) 1541 { 1542 RT_NOREF(pDevIns); 1559 static DECLCALLBACK(int) vnetR3TxThreadWakeUp(PPDMDEVINS pDevIns, PPDMTHREAD pThread) 1560 { 1543 1561 PVNETSTATE pThis = (PVNETSTATE)pThread->pvUser; 1544 return SUPSemEventSignal(pThis->pSupDrvSession, pThis->hTxEvent);1562 return PDMDevHlpSUPSemEventSignal(pDevIns, pThis->hTxEvent); 1545 1563 } 1546 1564 1547 1565 static int vnetR3CreateTxThreadAndEvent(PPDMDEVINS pDevIns, PVNETSTATE pThis) 1548 1566 { 1549 int rc = SUPSemEventCreate(pThis->pSupDrvSession, &pThis->hTxEvent);1567 int rc = PDMDevHlpSUPSemEventCreate(pDevIns, &pThis->hTxEvent); 1550 1568 if (RT_FAILURE(rc)) 1551 return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS, 1552 N_("VNET: Failed to create SUP event semaphore")); 1569 return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS, N_("VNET: Failed to create SUP event semaphore")); 1570 1553 1571 rc = PDMDevHlpThreadCreate(pDevIns, &pThis->pTxThread, pThis, vnetR3TxThread, 1554 vnet TxThreadWakeUp, 0, RTTHREADTYPE_IO, INSTANCE(pThis));1572 vnetR3TxThreadWakeUp, 0, RTTHREADTYPE_IO, INSTANCE(pThis)); 1555 1573 if (RT_FAILURE(rc)) 1556 return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS, 1557 N_("VNET: Failed to create worker thread %s"), INSTANCE(pThis)); 1574 return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS, N_("VNET: Failed to create worker thread %s"), INSTANCE(pThis)); 1558 1575 return VINF_SUCCESS; 1559 1576 } 1560 1577 1561 static void vnetR3DestroyTxThreadAndEvent(P VNETSTATE pThis)1578 static void vnetR3DestroyTxThreadAndEvent(PPDMDEVINS pDevIns, PVNETSTATE pThis) 1562 1579 { 1563 1580 if (pThis->pTxThread) … … 1572 1589 if (pThis->hTxEvent != NIL_SUPSEMEVENT) 1573 1590 { 1574 SUPSemEventClose(pThis->pSupDrvSession, pThis->hTxEvent);1591 PDMDevHlpSUPSemEventClose(pDevIns, pThis->hTxEvent); 1575 1592 pThis->hTxEvent = NIL_SUPSEMEVENT; 1576 1593 } 1577 1594 } 1578 1595 1579 static DECLCALLBACK(void) vnetR3QueueTransmit( void *pvState, PVQUEUE pQueue)1580 { 1581 PVNETSTATE pThis = (PVNETSTATE)pvState;1596 static DECLCALLBACK(void) vnetR3QueueTransmit(PPDMDEVINS pDevIns, PVPCISTATE pVPciState, PVQUEUE pQueue) 1597 { 1598 PVNETSTATE pThis = RT_FROM_MEMBER(pVPciState, VNETSTATE, VPCI); 1582 1599 1583 1600 Log(("vnetR3QueueTransmit: disable kicking and wake up TX thread\n")); 1584 1601 vringSetNotification(&pThis->VPCI, &pQueue->VRing, false); 1585 SUPSemEventSignal(pThis->pSupDrvSession, pThis->hTxEvent);1602 PDMDevHlpSUPSemEventSignal(pDevIns, pThis->hTxEvent); 1586 1603 } 1587 1604 … … 1735 1752 1736 1753 1737 static DECLCALLBACK(void) vnetR3QueueControl(void *pvState, PVQUEUE pQueue) 1738 { 1739 PVNETSTATE pThis = (PVNETSTATE)pvState; 1740 uint8_t u8Ack; 1754 static DECLCALLBACK(void) vnetR3QueueControl(PPDMDEVINS pDevIns, PVPCISTATE pVPciState, PVQUEUE pQueue) 1755 { 1756 PVNETSTATE pThis = RT_FROM_MEMBER(pVPciState, VNETSTATE, VPCI); 1741 1757 VQUEUEELEM elem; 1742 1758 while (vqueueGet(&pThis->VPCI, pQueue, &elem)) … … 1756 1772 } 1757 1773 1774 uint8_t bAck; 1758 1775 VNETCTLHDR CtlHdr; 1759 PDMDevHlpPhysRead(pThis->VPCI.CTX_SUFF(pDevIns), 1760 elem.aSegsOut[0].addr, 1761 &CtlHdr, sizeof(CtlHdr)); 1776 PDMDevHlpPhysRead(pDevIns, elem.aSegsOut[0].addr, &CtlHdr, sizeof(CtlHdr)); 1762 1777 switch (CtlHdr.u8Class) 1763 1778 { 1764 1779 case VNET_CTRL_CLS_RX_MODE: 1765 u8Ack = vnetR3ControlRx(pThis, &CtlHdr, &elem);1780 bAck = vnetR3ControlRx(pThis, &CtlHdr, &elem); 1766 1781 break; 1767 1782 case VNET_CTRL_CLS_MAC: 1768 u8Ack = vnetR3ControlMac(pThis, &CtlHdr, &elem);1783 bAck = vnetR3ControlMac(pThis, &CtlHdr, &elem); 1769 1784 break; 1770 1785 case VNET_CTRL_CLS_VLAN: 1771 u8Ack = vnetR3ControlVlan(pThis, &CtlHdr, &elem);1786 bAck = vnetR3ControlVlan(pThis, &CtlHdr, &elem); 1772 1787 break; 1773 1788 default: 1774 u8Ack = VNET_ERROR; 1775 } 1776 Log(("%s Processed control message %u, ack=%u.\n", INSTANCE(pThis), CtlHdr.u8Class, u8Ack)); 1777 PDMDevHlpPCIPhysWrite(pThis->VPCI.CTX_SUFF(pDevIns), 1778 elem.aSegsIn[elem.nIn - 1].addr, 1779 &u8Ack, sizeof(u8Ack)); 1780 1781 vqueuePut(&pThis->VPCI, pQueue, &elem, sizeof(u8Ack)); 1789 bAck = VNET_ERROR; 1790 } 1791 Log(("%s Processed control message %u, ack=%u.\n", INSTANCE(pThis), CtlHdr.u8Class, bAck)); 1792 PDMDevHlpPCIPhysWrite(pDevIns, elem.aSegsIn[elem.nIn - 1].addr, &bAck, sizeof(bAck)); 1793 1794 vqueuePut(&pThis->VPCI, pQueue, &elem, sizeof(bAck)); 1782 1795 vqueueSync(&pThis->VPCI, pQueue); 1783 1796 } … … 2007 2020 } 2008 2021 2009 vnetR3DestroyTxThreadAndEvent(pThis); 2022 vnetR3DestroyTxThreadAndEvent(pDevIns, pThis); 2023 2010 2024 /* 2011 * Zero someimportant members.2025 * Zero important members. 2012 2026 */ 2013 2027 pThis->pDrvBase = NULL; … … 2124 2138 2125 2139 #ifdef VNET_TX_DELAY 2126 LogRel(("TxTimer stats (avg/min/max): %7d usec %7d usec %7d usec\n", 2127 pThis->u32AvgDiff, pThis->u32MinDiff, pThis->u32MaxDiff)); 2128 #endif /* VNET_TX_DELAY */ 2140 LogRel(("TxTimer stats (avg/min/max): %7d usec %7d usec %7d usec\n", pThis->u32AvgDiff, pThis->u32MinDiff, pThis->u32MaxDiff)); 2141 #endif 2142 2129 2143 Log(("%s Destroying instance\n", INSTANCE(pThis))); 2130 2144 if (pThis->hEventMoreRxDescAvail != NIL_RTSEMEVENT) … … 2156 2170 */ 2157 2171 pThis->hEventMoreRxDescAvail = NIL_RTSEMEVENT; 2172 #ifndef VNET_TX_DELAY 2173 pThis->hTxEvent = NIL_SUPSEMEVENT; 2174 pThis->pTxThread = NULL; 2175 #endif 2158 2176 2159 2177 /* Do our own locking. */ … … 2190 2208 Assert(pThis->cMsLinkUpDelay <= 300000); /* less than 5 minutes */ 2191 2209 if (pThis->cMsLinkUpDelay > 5000 || pThis->cMsLinkUpDelay < 100) 2192 LogRel(("%s WARNING! Link up delay is set to %u seconds!\n", 2193 INSTANCE(pThis), pThis->cMsLinkUpDelay / 1000)); 2194 Log(("%s Link up delay is set to %u seconds\n", 2195 INSTANCE(pThis), pThis->cMsLinkUpDelay / 1000)); 2196 2197 vnetPrintFeatures(pThis, vnetIoCb_GetHostFeatures(pThis), "Device supports the following features"); 2210 LogRel(("%s WARNING! Link up delay is set to %u seconds!\n", INSTANCE(pThis), pThis->cMsLinkUpDelay / 1000)); 2211 Log(("%s Link up delay is set to %u seconds\n", INSTANCE(pThis), pThis->cMsLinkUpDelay / 1000)); 2212 2213 vnetPrintFeatures(pThis, vnetIoCb_GetHostFeatures(&pThis->VPCI), "Device supports the following features"); 2198 2214 2199 2215 /* Initialize PCI config space */ … … 2244 2260 AssertRCReturn(rc, rc); 2245 2261 2246 #ifndef VNET_TX_DELAY 2247 pThis->pSupDrvSession = PDMDevHlpGetSupDrvSession(pDevIns); 2248 pThis->hTxEvent = NIL_SUPSEMEVENT; 2249 pThis->pTxThread = NULL; 2250 #else /* VNET_TX_DELAY */ 2262 #ifdef VNET_TX_DELAY 2251 2263 /* Create Transmit Delay Timer */ 2252 2264 rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, vnetR3TxTimer, pThis, TMTIMER_FLAGS_NO_CRIT_SECT, … … 2286 2298 AssertRCReturn(rc, rc); 2287 2299 2288 rc = vnetIoCb_Reset( pThis);2300 rc = vnetIoCb_Reset(&pThis->VPCI); 2289 2301 AssertRCReturn(rc, rc); 2290 2302
Note:
See TracChangeset
for help on using the changeset viewer.