Changeset 82146 in vbox for trunk/src/VBox/Devices/Network
- Timestamp:
- Nov 24, 2019 11:16:54 AM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 134956
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DevPCNet.cpp
r82144 r82146 107 107 #define MAX_FRAME 1536 108 108 109 #define PCNETSTATE_2_DEVINS(pPCnet) ((pPCnet)->CTX_SUFF(pDevIns)) 110 #define PCNET_INST_NR (PCNETSTATE_2_DEVINS(pThis)->iInstance) 109 #define PCNET_INST_NR (pThis->iInstance) 111 110 112 111 /** @name Bus configuration registers … … 309 308 typedef struct PCNETSTATE 310 309 { 311 /** Pointer to the device instance - R3. */312 PPDMDEVINSR3 pDevInsR3;313 /** Pointer to the connector of the attached network driver - R3. */314 PPDMINETWORKUPR3 pDrvR3;315 /** Pointer to the attached network driver. */316 R3PTRTYPE(PPDMIBASE) pDrvBase;317 /** LUN\#0 + status LUN: The base interface. */318 PDMIBASE IBase;319 /** LUN\#0: The network port interface. */320 PDMINETWORKDOWN INetworkDown;321 /** LUN\#0: The network config port interface. */322 PDMINETWORKCONFIG INetworkConfig;323 324 /** Pointer to the device instance - R0. */325 PPDMDEVINSR0 pDevInsR0;326 /** Pointer to the connector of the attached network driver - R0. */327 PPDMINETWORKUPR0 pDrvR0;328 329 /** Pointer to the device instance - RC. */330 PPDMDEVINSRC pDevInsRC;331 /** Pointer to the connector of the attached network driver - RC. */332 PPDMINETWORKUPRC pDrvRC;333 334 310 /** Software Interrupt timer - R3. */ 335 311 TMTIMERHANDLE hTimerSoftInt; … … 359 335 uint16_t aBCR[BCR_MAX_RAP]; 360 336 uint16_t aMII[MII_MAX_REG]; 337 361 338 /** Holds the bits which were really seen by the guest. Relevant are bits 362 339 * 8..14 (IDON, TINT, RINT, MERR, MISS, CERR, BABL). We don't allow the … … 364 341 * seen by the guest. */ 365 342 uint16_t u16CSR0LastSeenByGuest; 366 /** Last time we polled the queues */367 uint64_t u64LastPoll;368 369 /** The loopback transmit buffer (avoid stack allocations). */370 uint8_t abLoopBuf[4096];371 /** The recv buffer. */372 uint8_t abRecvBuf[4096];373 374 343 /** The configured IRQ for ISA operation. */ 375 344 uint8_t uIsaIrq; 376 345 /** Alignment padding. */ 377 uint8_t Alignment2[3]; 346 uint8_t Alignment2[1+4]; 347 348 /** Last time we polled the queues */ 349 uint64_t u64LastPoll; 378 350 379 351 /** Size of a RX/TX descriptor (8 or 16 bytes according to SWSTYLE */ … … 390 362 391 363 /** Number of times we've reported the link down. */ 392 RTUINTcLinkDownReported;364 uint32_t cLinkDownReported; 393 365 /** The configured MAC address. */ 394 366 RTMAC MacConfigured; 367 /** Set if PCNETSTATER3::pDrvR3 is not NULL. */ 368 bool fDriverAttached; 395 369 /** Alignment padding. */ 396 uint8_t Alignment3[2];370 uint8_t bAlignment3; 397 371 398 372 /** The LED. */ 399 373 PDMLED Led; 400 /** Status LUN: The LED ports. */401 PDMILEDPORTS ILeds;402 /** Partner of ILeds. */403 R3PTRTYPE(PPDMILEDCONNECTORS) pLedsConnector;404 374 405 375 /** Access critical section. */ … … 421 391 RTGCPHYS32 RDRAPhysOld; 422 392 uint32_t cbRDRAOld; 423 424 DECLRCCALLBACKMEMBER(int, pfnEMInterpretInstructionRC, (PVM pVM, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, uint32_t *pcbSize));425 DECLR0CALLBACKMEMBER(int, pfnEMInterpretInstructionR0, (PVM pVM, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, uint32_t *pcbSize));426 393 #endif 427 394 … … 437 404 /** MS to wait before we enable the link. */ 438 405 uint32_t cMsLinkUpDelay; 439 /** Alignment padding. */440 uint32_t Alignment6;406 /** The device instance number (for logging). */ 407 uint32_t iInstance; 441 408 442 409 /** PCI Region \#0: I/O ports offset 0x10-0x1f. */ … … 451 418 /** ISA I/O ports offset 0x00-0x0f. */ 452 419 IOMIOPORTHANDLE hIoPortsIsaAProm; 420 421 /** The loopback transmit buffer (avoid stack allocations). */ 422 uint8_t abLoopBuf[4096]; 423 /** The recv buffer. */ 424 uint8_t abRecvBuf[4096]; 453 425 454 426 STAMCOUNTER StatReceiveBytes; … … 506 478 #endif /* VBOX_WITH_STATISTICS */ 507 479 } PCNETSTATE; 508 //AssertCompileMemberAlignment(PCNETSTATE, StatReceiveBytes, 8); 509 /** Pointer to a PCnet state structure. */ 480 /** Pointer to a shared PCnet state structure. */ 510 481 typedef PCNETSTATE *PPCNETSTATE; 482 483 484 /** 485 * PCNET state for ring-3. 486 * 487 * @implements PDMIBASE 488 * @implements PDMINETWORKDOWN 489 * @implements PDMINETWORKCONFIG 490 * @implements PDMILEDPORTS 491 */ 492 typedef struct PCNETSTATER3 493 { 494 /** Pointer to the device instance. */ 495 PPDMDEVINSR3 pDevIns; 496 /** Pointer to the connector of the attached network driver. */ 497 PPDMINETWORKUPR3 pDrv; 498 /** Pointer to the attached network driver. */ 499 R3PTRTYPE(PPDMIBASE) pDrvBase; 500 /** LUN\#0 + status LUN: The base interface. */ 501 PDMIBASE IBase; 502 /** LUN\#0: The network port interface. */ 503 PDMINETWORKDOWN INetworkDown; 504 /** LUN\#0: The network config port interface. */ 505 PDMINETWORKCONFIG INetworkConfig; 506 507 /** Status LUN: The LED ports. */ 508 PDMILEDPORTS ILeds; 509 /** Partner of ILeds. */ 510 R3PTRTYPE(PPDMILEDCONNECTORS) pLedsConnector; 511 } PCNETSTATER3; 512 /** Pointer to a PCnet state structure for ring-3. */ 513 typedef PCNETSTATER3 *PPCNETSTATER3; 514 515 516 /** 517 * PCNET state for ring-0. 518 */ 519 typedef struct PCNETSTATER0 520 { 521 /** Pointer to the connector of the attached network driver. */ 522 PPDMINETWORKUPR0 pDrv; 523 #ifdef PCNET_NO_POLLING 524 DECLR0CALLBACKMEMBER(int, pfnEMInterpretInstructionR0, (PVM pVM, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, uint32_t *pcbSize)); 525 #endif 526 } PCNETSTATER0; 527 /** Pointer to a PCnet state structure for ring-0. */ 528 typedef PCNETSTATER0 *PPCNETSTATER0; 529 530 531 /** 532 * PCNET state for raw-mode. 533 */ 534 typedef struct PCNETSTATERC 535 { 536 /** Pointer to the connector of the attached network driver. */ 537 PPDMINETWORKUPRC pDrv; 538 #ifdef PCNET_NO_POLLING 539 DECLRCCALLBACKMEMBER(int, pfnEMInterpretInstructionRC, (PVM pVM, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, uint32_t *pcbSize)); 540 #endif 541 } PCNETSTATERC; 542 /** Pointer to a PCnet state structure for raw-mode. */ 543 typedef PCNETSTATERC *PPCNETSTATERC; 544 545 546 /** The PCnet state structure for the current context. */ 547 typedef CTX_SUFF(PCNETSTATE) PCNETSTATECC; 548 /** Pointer to a PCnet state structure for the current context. */ 549 typedef CTX_SUFF(PPCNETSTATE) PPCNETSTATECC; 550 511 551 512 552 /** @todo All structs: big endian? */ … … 641 681 * Internal Functions * 642 682 *********************************************************************************************************************************/ 683 static void pcnetPollRxTx(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC); 684 static void pcnetPollTimer(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC); 685 static void pcnetUpdateIrq(PPDMDEVINS pDevIns, PPCNETSTATE pThis); 686 static uint32_t pcnetBCRReadU16(PPCNETSTATE pThis, uint32_t u32RAP); 687 static VBOXSTRICTRC pcnetBCRWriteU16(PPDMDEVINS pDevIns, PPCNETSTATE pThis, uint32_t u32RAP, uint32_t val); 688 #ifndef PCNET_NO_POLLING 689 static void pcnetPollTimerStart(PPDMDEVINS pDevIns, PPCNETSTATE pThis); 690 #endif 691 static int pcnetXmitPending(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC, bool fOnWorkerThread); 692 #ifdef PCNET_NO_POLLING 693 # ifndef IN_RING3 694 RT_C_DECLS_BEGIN 695 DECLEXPORT(FNPGMRZPHYSPFHANDLER) pcnetHandleRingWritePf; 696 RT_C_DECLS_END 697 # endif 698 #endif 699 643 700 #define PRINT_TMD(T) Log10(( \ 644 701 "TMD0 : TBADR=%#010x\n" \ … … 673 730 (R)->rmd2.zeros)) 674 731 675 #ifndef PCNET_NO_POLLING676 static void pcnetPollTimerStart(PPDMDEVINS pDevIns, PPCNETSTATE pThis);677 #endif678 static int pcnetXmitPending(PPCNETSTATE pThis, bool fOnWorkerThread);679 #ifdef PCNET_NO_POLLING680 # ifndef IN_RING3681 RT_C_DECLS_BEGIN682 DECLEXPORT(FNPGMRZPHYSPFHANDLER) pcnetHandleRingWritePf;683 RT_C_DECLS_END684 # endif685 #endif686 687 732 688 733 … … 694 739 DECLINLINE(bool) pcnetIsLinkUp(PPCNETSTATE pThis) 695 740 { 696 return pThis-> pDrvR3&& !pThis->fLinkTempDown && pThis->fLinkUp;741 return pThis->fDriverAttached && !pThis->fLinkTempDown && pThis->fLinkUp; 697 742 } 698 743 … … 701 746 * 702 747 * @returns nothing. 703 * @param pThis Pointer to the BusLogic device instance 748 * @param pDevIns The device instance. 749 * @param pThis Pointer to the PCNet device instance 704 750 * @param GCPhys Guest physical memory address 705 751 * @param pvBuf Host side buffer address 706 752 * @param cbWrite Number of bytes to write 707 753 */ 708 static void pcnetPhysWrite(PP CNETSTATE pThis, RTGCPHYS GCPhys, const void *pvBuf, size_t cbWrite)754 static void pcnetPhysWrite(PPDMDEVINS pDevIns, PPCNETSTATE pThis, RTGCPHYS GCPhys, const void *pvBuf, size_t cbWrite) 709 755 { 710 756 if (!PCNET_IS_ISA(pThis)) 711 PDMDevHlpPCIPhysWrite(p This->CTX_SUFF(pDevIns), GCPhys, pvBuf, cbWrite);757 PDMDevHlpPCIPhysWrite(pDevIns, GCPhys, pvBuf, cbWrite); 712 758 else 713 PDMDevHlpPhysWrite(p This->CTX_SUFF(pDevIns), GCPhys, pvBuf, cbWrite);759 PDMDevHlpPhysWrite(pDevIns, GCPhys, pvBuf, cbWrite); 714 760 } 715 761 … … 718 764 * Make sure we read the own flag first. 719 765 * 766 * @param pDevIns The device instance. 720 767 * @param pThis adapter private data 721 768 * @param addr physical address of the descriptor … … 723 770 * @return true if we own the descriptor, false otherwise 724 771 */ 725 DECLINLINE(bool) pcnetTmdLoad(PPCNETSTATE pThis, TMD *tmd, RTGCPHYS32 addr, bool fRetIfNotOwn) 726 { 727 PPDMDEVINS pDevIns = PCNETSTATE_2_DEVINS(pThis); 772 DECLINLINE(bool) pcnetTmdLoad(PPDMDEVINS pDevIns, PPCNETSTATE pThis, TMD *tmd, RTGCPHYS32 addr, bool fRetIfNotOwn) 773 { 728 774 uint8_t ownbyte; 729 775 … … 775 821 * Make sure that all data are transmitted before we clear the own flag. 776 822 */ 777 DECLINLINE(void) pcnetTmdStorePassHost(PP CNETSTATE pThis, TMD *tmd, RTGCPHYS32 addr)823 DECLINLINE(void) pcnetTmdStorePassHost(PPDMDEVINS pDevIns, PPCNETSTATE pThis, TMD *tmd, RTGCPHYS32 addr) 778 824 { 779 825 STAM_PROFILE_ADV_START(&pThis->CTX_SUFF_Z(StatTmdStore), a); … … 786 832 xda[3] = ((uint32_t *)tmd)[2] >> 16; 787 833 xda[1] |= 0x8000; 788 pcnetPhysWrite(p This, addr, (void*)&xda[0], sizeof(xda));834 pcnetPhysWrite(pDevIns, pThis, addr, (void*)&xda[0], sizeof(xda)); 789 835 xda[1] &= ~0x8000; 790 pcnetPhysWrite(p This, addr+3, (uint8_t*)xda + 3, 1);836 pcnetPhysWrite(pDevIns, pThis, addr+3, (uint8_t*)xda + 3, 1); 791 837 } 792 838 else if (RT_LIKELY(BCR_SWSTYLE(pThis) != 3)) 793 839 { 794 840 ((uint32_t*)tmd)[1] |= 0x80000000; 795 pcnetPhysWrite(p This, addr, (void*)tmd, 12);841 pcnetPhysWrite(pDevIns, pThis, addr, (void*)tmd, 12); 796 842 ((uint32_t*)tmd)[1] &= ~0x80000000; 797 pcnetPhysWrite(p This, addr+7, (uint8_t*)tmd + 7, 1);843 pcnetPhysWrite(pDevIns, pThis, addr+7, (uint8_t*)tmd + 7, 1); 798 844 } 799 845 else … … 804 850 xda[2] = ((uint32_t *)tmd)[0]; 805 851 xda[1] |= 0x80000000; 806 pcnetPhysWrite(p This, addr, (void*)&xda[0], sizeof(xda));852 pcnetPhysWrite(pDevIns, pThis, addr, (void*)&xda[0], sizeof(xda)); 807 853 xda[1] &= ~0x80000000; 808 pcnetPhysWrite(p This, addr+7, (uint8_t*)xda + 7, 1);854 pcnetPhysWrite(pDevIns, pThis, addr+7, (uint8_t*)xda + 7, 1); 809 855 } 810 856 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatTmdStore), a); … … 813 859 /** 814 860 * Load receive message descriptor 861 * 815 862 * Make sure we read the own flag first. 816 863 * 817 * @param pThis adapter private data 818 * @param addr physical address of the descriptor 819 * @param fRetIfNotOwn return immediately after reading the own flag if we don't own the descriptor 820 * @return true if we own the descriptor, false otherwise 821 */ 822 DECLINLINE(bool) pcnetRmdLoad(PPCNETSTATE pThis, RMD *rmd, RTGCPHYS32 addr, bool fRetIfNotOwn) 823 { 824 PPDMDEVINS pDevIns = PCNETSTATE_2_DEVINS(pThis); 864 * @param pDevIns The device instance. 865 * @param pThis Adapter private data. 866 * @param addr Physical address of the descriptor. 867 * @param fRetIfNotOwn Return immediately after reading the own flag if we 868 * don't own the descriptor. 869 * @returns true if we own the descriptor, false otherwise 870 */ 871 DECLINLINE(bool) pcnetRmdLoad(PPDMDEVINS pDevIns, PPCNETSTATE pThis, RMD *rmd, RTGCPHYS32 addr, bool fRetIfNotOwn) 872 { 825 873 uint8_t ownbyte; 826 874 … … 872 920 * Make sure that all data are transmitted before we clear the own flag. 873 921 */ 874 DECLINLINE(void) pcnetRmdStorePassHost(PP CNETSTATE pThis, RMD *rmd, RTGCPHYS32 addr)922 DECLINLINE(void) pcnetRmdStorePassHost(PPDMDEVINS pDevIns, PPCNETSTATE pThis, RMD *rmd, RTGCPHYS32 addr) 875 923 { 876 924 if (RT_UNLIKELY(BCR_SWSTYLE(pThis) == 0)) … … 882 930 rda[3] = ((uint32_t *)rmd)[2] & 0xffff; 883 931 rda[1] |= 0x8000; 884 pcnetPhysWrite(p This, addr, (void*)&rda[0], sizeof(rda));932 pcnetPhysWrite(pDevIns, pThis, addr, (void*)&rda[0], sizeof(rda)); 885 933 rda[1] &= ~0x8000; 886 pcnetPhysWrite(p This, addr+3, (uint8_t*)rda + 3, 1);934 pcnetPhysWrite(pDevIns, pThis, addr+3, (uint8_t*)rda + 3, 1); 887 935 } 888 936 else if (RT_LIKELY(BCR_SWSTYLE(pThis) != 3)) 889 937 { 890 938 ((uint32_t*)rmd)[1] |= 0x80000000; 891 pcnetPhysWrite(p This, addr, (void*)rmd, 12);939 pcnetPhysWrite(pDevIns, pThis, addr, (void*)rmd, 12); 892 940 ((uint32_t*)rmd)[1] &= ~0x80000000; 893 pcnetPhysWrite(p This, addr+7, (uint8_t*)rmd + 7, 1);941 pcnetPhysWrite(pDevIns, pThis, addr+7, (uint8_t*)rmd + 7, 1); 894 942 } 895 943 else … … 900 948 rda[2] = ((uint32_t *)rmd)[0]; 901 949 rda[1] |= 0x80000000; 902 pcnetPhysWrite(p This, addr, (void*)&rda[0], sizeof(rda));950 pcnetPhysWrite(pDevIns, pThis, addr, (void*)&rda[0], sizeof(rda)); 903 951 rda[1] &= ~0x80000000; 904 pcnetPhysWrite(p This, addr+7, (uint8_t*)rda + 7, 1);952 pcnetPhysWrite(pDevIns, pThis, addr+7, (uint8_t*)rda + 7, 1); 905 953 } 906 954 } … … 911 959 * pages later when we shouldn't schedule to EMT. Temporarily hack. 912 960 */ 913 static void pcnetDescTouch(PPCNETSTATE pThis, RTGCPHYS32 addr) 914 { 915 PPDMDEVINS pDevIns = PCNETSTATE_2_DEVINS(pThis); 961 static void pcnetDescTouch(PPDMDEVINS pDevIns, PPCNETSTATE pThis, RTGCPHYS32 addr) 962 { 916 963 uint8_t aBuf[16]; 917 964 size_t cbDesc; … … 921 968 cbDesc = 16; 922 969 PDMDevHlpPhysRead(pDevIns, addr, aBuf, cbDesc); 923 pcnetPhysWrite(p This, addr, aBuf, cbDesc);970 pcnetPhysWrite(pDevIns, pThis, addr, aBuf, cbDesc); 924 971 } 925 972 #endif /* IN_RING3 */ … … 1144 1191 #define htons(x) ( (((x) & 0xff00) >> 8) | (((x) & 0x00ff) << 8) ) 1145 1192 1146 static void pcnetPollRxTx(PPCNETSTATE pThis);1147 static void pcnetPollTimer(PPDMDEVINS pDevIns, PPCNETSTATE pThis);1148 static void pcnetUpdateIrq(PPCNETSTATE pThis);1149 static uint32_t pcnetBCRReadU16(PPCNETSTATE pThis, uint32_t u32RAP);1150 static VBOXSTRICTRC pcnetBCRWriteU16(PPDMDEVINS pDevIns, PPCNETSTATE pThis, uint32_t u32RAP, uint32_t val);1151 1193 1152 1194 … … 1185 1227 1186 1228 /* Check if we can do something now */ 1187 pcnetPollRxTx(p This);1188 pcnetUpdateIrq(p This);1229 pcnetPollRxTx(pDevIns, pThis, pThisCC); 1230 pcnetUpdateIrq(pDevIns, pThis); 1189 1231 1190 1232 PDMCritSectLeave(&pThis->CritSect); … … 1237 1279 AssertReleaseRC(rc); 1238 1280 /* Check if we can do something now */ 1239 pcnetPollRxTx(p This);1240 pcnetUpdateIrq(p This);1281 pcnetPollRxTx(pDevIns, pThis, pThisCC); 1282 pcnetUpdateIrq(pDevIns, pThis); 1241 1283 PDMCritSectLeave(&pThis->CritSect); 1242 1284 } … … 1306 1348 * - csr5 (only written by pcnetSoftReset(), pcnetStop or by the driver guest) 1307 1349 */ 1308 static void pcnetUpdateIrq(PP CNETSTATE pThis)1350 static void pcnetUpdateIrq(PPDMDEVINS pDevIns, PPCNETSTATE pThis) 1309 1351 { 1310 1352 int iISR = 0; … … 1388 1430 { 1389 1431 Log(("#%d INTA=%d\n", PCNET_INST_NR, iISR)); 1390 PDMDevHlpPCISetIrq( PCNETSTATE_2_DEVINS(pThis), 0, iISR);1432 PDMDevHlpPCISetIrq(pDevIns, 0, iISR); 1391 1433 } 1392 1434 else 1393 1435 { 1394 1436 Log(("#%d IRQ=%d, state=%d\n", PCNET_INST_NR, pThis->uIsaIrq, iISR)); 1395 PDMDevHlpISASetIrq( PCNETSTATE_2_DEVINS(pThis), pThis->uIsaIrq, iISR);1437 PDMDevHlpISASetIrq(pDevIns, pThis->uIsaIrq, iISR); 1396 1438 } 1397 1439 pThis->iISR = iISR; … … 1405 1447 static void pcnetR3UpdateRingHandlers(PPCNETSTATE pThis) 1406 1448 { 1407 PPDMDEVINS pDevIns = PCNETSTATE_2_DEVINS(pThis);1449 PPDMDEVINS pDevIns = pDevIns; 1408 1450 int rc; 1409 1451 … … 1460 1502 RT_ALIGN(pcnetTdraAddr(pThis, 0), PAGE_SIZE) - 1, 1461 1503 pThis->hNoPollingHandlerType, 1462 p This->CTX_SUFF(pDevIns)->pvInstanceDataR3,1463 p This->CTX_SUFF(pDevIns)->pvInstanceDataR0,1464 p This->CTX_SUFF(pDevIns)->pvInstanceDataRC,1504 pDevIns->pvInstanceDataR3, 1505 pDevIns->pvInstanceDataR0, 1506 pDevIns->pvInstanceDataRC, 1465 1507 "PCnet transmit ring write access handler"); 1466 1508 AssertRC(rc); … … 1486 1528 # endif /* PCNET_NO_POLLING */ 1487 1529 1488 static void pcnetR3Init(PPCNETSTATE pThis) 1489 { 1490 PPDMDEVINS pDevIns = PCNETSTATE_2_DEVINS(pThis); 1530 static void pcnetR3Init(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC) 1531 { 1491 1532 Log(("#%d pcnetR3Init: init_addr=%#010x\n", PCNET_INST_NR, PHYSADDR(pThis, CSR_IADR(pThis)))); 1492 1533 … … 1536 1577 RTGCPHYS32 rdaddr = PHYSADDR(pThis, pcnetRdraAddr(pThis, i)); 1537 1578 1538 pcnetDescTouch(p This, rdaddr);1579 pcnetDescTouch(pDevIns, pThis, rdaddr); 1539 1580 /* At this time it is not guaranteed that the buffers are already initialized. */ 1540 if (pcnetRmdLoad(p This, &rmd, rdaddr, false))1581 if (pcnetRmdLoad(pDevIns, pThis, &rmd, rdaddr, false)) 1541 1582 { 1542 1583 uint32_t cbBuf = 4096U-rmd.rmd1.bcnt; … … 1549 1590 RTGCPHYS32 tdaddr = PHYSADDR(pThis, pcnetTdraAddr(pThis, i)); 1550 1591 1551 pcnetDescTouch(p This, tdaddr);1592 pcnetDescTouch(pDevIns, pThis, tdaddr); 1552 1593 } 1553 1594 … … 1562 1603 pThis->fSignalRxMiss = (cbRxBuffers == 0 || cbRxBuffers >= 32*_1K); 1563 1604 1564 if (pThis ->pDrvR3)1565 pThis ->pDrvR3->pfnSetPromiscuousMode(pThis->pDrvR3, CSR_PROM(pThis));1605 if (pThisCC->pDrv) 1606 pThisCC->pDrv->pfnSetPromiscuousMode(pThisCC->pDrv, CSR_PROM(pThis)); 1566 1607 1567 1608 CSR_RCVRC(pThis) = CSR_RCVRL(pThis); … … 1617 1658 * Stop RX/TX operation. 1618 1659 */ 1619 static void pcnetStop(PPDMDEVINS pDevIns, PPCNETSTATE pThis )1660 static void pcnetStop(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC) 1620 1661 { 1621 1662 Log(("#%d pcnetStop:\n", PCNET_INST_NR)); … … 1623 1664 pThis->aCSR[4] &= ~0x02c2; 1624 1665 pThis->aCSR[5] &= ~0x0011; 1625 pcnetPollTimer(pDevIns, pThis );1666 pcnetPollTimer(pDevIns, pThis, pThisCC); 1626 1667 } 1627 1668 … … 1648 1689 * 1649 1690 * @param pDevIns The device instance. 1691 * @param pThis The shared PCnet state data. 1650 1692 * @param fSkipCurrent if true, don't scan the current RDTE. 1651 1693 */ 1652 static void pcnetRdtePoll(PP CNETSTATE pThis, bool fSkipCurrent=false)1694 static void pcnetRdtePoll(PPDMDEVINS pDevIns, PPCNETSTATE pThis, bool fSkipCurrent=false) 1653 1695 { 1654 1696 STAM_PROFILE_ADV_START(&pThis->CTX_SUFF_Z(StatRdtePoll), a); … … 1673 1715 CSR_CRDA(pThis) = CSR_CRBA(pThis) = 0; 1674 1716 CSR_CRBC(pThis) = CSR_CRST(pThis) = 0; 1675 if (!pcnetRmdLoad(p This, &rmd, PHYSADDR(pThis, addr), true))1717 if (!pcnetRmdLoad(pDevIns, pThis, &rmd, PHYSADDR(pThis, addr), true)) 1676 1718 { 1677 1719 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatRdtePoll), a); … … 1685 1727 CSR_CRST(pThis) = ((uint32_t *)&rmd)[1] >> 16; /* Receive Status */ 1686 1728 if (pThis->fMaybeOutOfSpace) 1687 pcnetWakeupReceive( PCNETSTATE_2_DEVINS(pThis));1729 pcnetWakeupReceive(pDevIns); 1688 1730 } 1689 1731 else … … 1709 1751 CSR_NRDA(pThis) = CSR_NRBA(pThis) = 0; 1710 1752 CSR_NRBC(pThis) = 0; 1711 if (!pcnetRmdLoad(p This, &rmd, PHYSADDR(pThis, addr), true))1753 if (!pcnetRmdLoad(pDevIns, pThis, &rmd, PHYSADDR(pThis, addr), true)) 1712 1754 { 1713 1755 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatRdtePoll), a); … … 1750 1792 * @return true if transmit descriptors available 1751 1793 */ 1752 static int pcnetTdtePoll(PP CNETSTATE pThis, TMD *tmd)1794 static int pcnetTdtePoll(PPDMDEVINS pDevIns, PPCNETSTATE pThis, TMD *tmd) 1753 1795 { 1754 1796 STAM_PROFILE_ADV_START(&pThis->CTX_SUFF_Z(StatTdtePoll), a); … … 1757 1799 RTGCPHYS32 cxda = pcnetTdraAddr(pThis, CSR_XMTRC(pThis)); 1758 1800 1759 if (!pcnetTmdLoad(p This, tmd, PHYSADDR(pThis, cxda), true))1801 if (!pcnetTmdLoad(pDevIns, pThis, tmd, PHYSADDR(pThis, cxda), true)) 1760 1802 { 1761 1803 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatTdtePoll), a); … … 1798 1840 * @return true if transmit descriptors available 1799 1841 */ 1800 static int pcnetCalcPacketLen(PP CNETSTATE pThis, unsigned cb)1842 static int pcnetCalcPacketLen(PPDMDEVINS pDevIns, PPCNETSTATE pThis, unsigned cb) 1801 1843 { 1802 1844 TMD tmd; … … 1819 1861 RTGCPHYS32 addrDesc = pcnetTdraAddr(pThis, iDesc); 1820 1862 1821 if (!pcnetTmdLoad(p This, &tmd, PHYSADDR(pThis, addrDesc), true))1863 if (!pcnetTmdLoad(pDevIns, pThis, &tmd, PHYSADDR(pThis, addrDesc), true)) 1822 1864 { 1823 1865 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatTxLenCalc), a); … … 1850 1892 * Write data into guest receive buffers. 1851 1893 */ 1852 static void pcnetReceiveNoSync(PPCNETSTATE pThis, const uint8_t *buf, size_t cbToRecv, bool fAddFCS, bool fLoopback) 1853 { 1854 PPDMDEVINS pDevIns = PCNETSTATE_2_DEVINS(pThis); 1855 int is_padr = 0, is_bcast = 0, is_ladr = 0; 1894 static void pcnetReceiveNoSync(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC, 1895 const uint8_t *buf, size_t cbToRecv, bool fAddFCS, bool fLoopback) 1896 { 1897 int is_padr = 0; 1898 int is_bcast = 0; 1899 int is_ladr = 0; 1856 1900 unsigned iRxDesc; 1857 1901 int cbPacket; … … 1885 1929 { 1886 1930 if (HOST_IS_OWNER(CSR_CRST(pThis))) 1887 pcnetRdtePoll(p This);1931 pcnetRdtePoll(pDevIns, pThis); 1888 1932 if (RT_UNLIKELY(HOST_IS_OWNER(CSR_CRST(pThis)))) 1889 1933 { … … 1898 1942 { 1899 1943 RMD rmd; 1900 pcnetRmdLoad(p This, &rmd, PHYSADDR(pThis, GCPhys), false);1944 pcnetRmdLoad(pDevIns, pThis, &rmd, PHYSADDR(pThis, GCPhys), false); 1901 1945 LogRel((" %#010x\n", rmd.rmd1)); 1902 1946 GCPhys += cb; … … 1962 2006 #endif 1963 2007 1964 pcnetRmdLoad(p This, &rmd, PHYSADDR(pThis, crda), false);2008 pcnetRmdLoad(pDevIns, pThis, &rmd, PHYSADDR(pThis, crda), false); 1965 2009 /*if (!CSR_LAPPEN(pThis))*/ 1966 2010 rmd.rmd1.stp = 1; … … 1983 2027 */ 1984 2028 PDMCritSectLeave(&pThis->CritSect); 1985 pcnetPhysWrite(p This, rbadr, src, cbBuf);2029 pcnetPhysWrite(pDevIns, pThis, rbadr, src, cbBuf); 1986 2030 int rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY); 1987 2031 AssertReleaseRC(rc); … … 2013 2057 * to quit and write error status into the last descriptor we own. 2014 2058 */ 2015 if (!pcnetRmdLoad(p This, &next_rmd, PHYSADDR(pThis, next_crda), true))2059 if (!pcnetRmdLoad(pDevIns, pThis, &next_rmd, PHYSADDR(pThis, next_crda), true)) 2016 2060 break; 2017 2061 2018 2062 /* Write back current descriptor, clear the own bit. */ 2019 pcnetRmdStorePassHost(p This, &rmd, PHYSADDR(pThis, crda));2063 pcnetRmdStorePassHost(pDevIns, pThis, &rmd, PHYSADDR(pThis, crda)); 2020 2064 2021 2065 /* Switch to the next descriptor */ … … 2030 2074 * handler associated with it. See above for additional comments. */ 2031 2075 PDMCritSectLeave(&pThis->CritSect); 2032 pcnetPhysWrite(p This, rbadr2, src, cbBuf);2076 pcnetPhysWrite(pDevIns, pThis, rbadr2, src, cbBuf); 2033 2077 rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY); 2034 2078 AssertReleaseRC(rc); … … 2073 2117 2074 2118 /* write back, clear the own bit */ 2075 pcnetRmdStorePassHost(p This, &rmd, PHYSADDR(pThis, crda));2119 pcnetRmdStorePassHost(pDevIns, pThis, &rmd, PHYSADDR(pThis, crda)); 2076 2120 2077 2121 pThis->aCSR[0] |= 0x0400; 2078 2122 2079 Log(("#%d RCVRC=%d CRDA=%#010x\n", PCNET_INST_NR, 2080 CSR_RCVRC(pThis), PHYSADDR(pThis, CSR_CRDA(pThis)))); 2123 Log(("#%d RCVRC=%d CRDA=%#010x\n", PCNET_INST_NR, CSR_RCVRC(pThis), PHYSADDR(pThis, CSR_CRDA(pThis)))); 2081 2124 #ifdef LOG_ENABLED 2082 2125 PRINT_RMD(&rmd); … … 2091 2134 * ``transmit polling will take place following receive activities'' */ 2092 2135 if (!fLoopback) 2093 pcnetPollRxTx(p This);2094 pcnetUpdateIrq(p This);2136 pcnetPollRxTx(pDevIns, pThis, pThisCC); 2137 pcnetUpdateIrq(pDevIns, pThis); 2095 2138 } 2096 2139 … … 2103 2146 static DECLCALLBACK(void) pcnetR3XmitTaskCallback(PPDMDEVINS pDevIns, void *pvUser) 2104 2147 { 2105 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 2148 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 2149 PPCNETSTATECC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PPCNETSTATECC); 2106 2150 NOREF(pvUser); 2107 2151 … … 2109 2153 * Transmit as much as we can. 2110 2154 */ 2111 pcnetXmitPending(p This, true /*fOnWorkerThread*/);2155 pcnetXmitPending(pDevIns, pThis, pThisCC, true /*fOnWorkerThread*/); 2112 2156 } 2113 2157 #endif /* IN_RING3 */ … … 2118 2162 * 2119 2163 * @returns See PPDMINETWORKUP::pfnAllocBuf. 2120 * @param pThis The device instance.2164 * @param pThis The shared PCNet state data. 2121 2165 * @param cbMin The minimum buffer size. 2122 2166 * @param fLoopback Set if we're in loopback mode. … … 2125 2169 * Always set. 2126 2170 */ 2127 DECLINLINE(int) pcnetXmitAllocBuf(PPCNETSTATE pThis, size_t cbMin, bool fLoopback,2171 DECLINLINE(int) pcnetXmitAllocBuf(PPCNETSTATE pThis, PPCNETSTATECC pThisCC, size_t cbMin, bool fLoopback, 2128 2172 PPDMSCATTERGATHER pSgLoop, PPPDMSCATTERGATHER ppSgBuf) 2129 2173 { … … 2145 2189 else 2146 2190 { 2147 PPDMINETWORKUP pDrv = pThis ->CTX_SUFF(pDrv);2191 PPDMINETWORKUP pDrv = pThisCC->pDrv; 2148 2192 if (RT_LIKELY(pDrv)) 2149 2193 { … … 2166 2210 * Frees an unsent buffer. 2167 2211 * 2168 * @param pThis The device instance.2212 * @param pThisCC The PCNet state data for the current context. 2169 2213 * @param fLoopback Set if we're in loopback mode. 2170 2214 * @param pSgBuf The SG to free. Can be NULL. 2171 2215 */ 2172 DECLINLINE(void) pcnetXmitFreeBuf(PPCNETSTATE pThis, bool fLoopback, PPDMSCATTERGATHER pSgBuf)2216 DECLINLINE(void) pcnetXmitFreeBuf(PPCNETSTATECC pThisCC, bool fLoopback, PPDMSCATTERGATHER pSgBuf) 2173 2217 { 2174 2218 if (pSgBuf) … … 2178 2222 else 2179 2223 { 2180 PPDMINETWORKUP pDrv = pThis ->CTX_SUFF(pDrv);2224 PPDMINETWORKUP pDrv = pThisCC->pDrv; 2181 2225 if (RT_LIKELY(pDrv)) 2182 2226 pDrv->pfnFreeBuf(pDrv, pSgBuf); … … 2192 2236 * 2193 2237 * @returns See PDMINETWORKUP::pfnSendBuf. 2194 * @param pThis The device instance. 2238 * @param pDevIns The device instance. 2239 * @param pThis The shared PCNet state data. 2240 * @param pThisCC The PCNet state data for the current context. 2195 2241 * @param fLoopback Set if we're in loopback mode. 2196 2242 * @param pSgBuf The SG to send. … … 2198 2244 * if an EMT. 2199 2245 */ 2200 DECLINLINE(int) pcnetXmitSendBuf(PPCNETSTATE pThis, bool fLoopback, PPDMSCATTERGATHER pSgBuf, bool fOnWorkerThread) 2246 DECLINLINE(int) pcnetXmitSendBuf(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC, bool fLoopback, 2247 PPDMSCATTERGATHER pSgBuf, bool fOnWorkerThread) 2201 2248 { 2202 2249 int rc; … … 2207 2254 pThis->Led.Asserted.s.fReading = pThis->Led.Actual.s.fReading = 1; 2208 2255 if (HOST_IS_OWNER(CSR_CRST(pThis))) 2209 pcnetRdtePoll(p This);2210 2211 pcnetReceiveNoSync(p This, pThis->abLoopBuf, pSgBuf->cbUsed, true /* fAddFCS */, fLoopback);2256 pcnetRdtePoll(pDevIns, pThis); 2257 2258 pcnetReceiveNoSync(pDevIns, pThis, pThisCC, pThis->abLoopBuf, pSgBuf->cbUsed, true /* fAddFCS */, fLoopback); 2212 2259 pThis->Led.Actual.s.fReading = 0; 2213 2260 rc = VINF_SUCCESS; … … 2223 2270 pThis->Led.Asserted.s.fWriting = pThis->Led.Actual.s.fWriting = 1; 2224 2271 2225 PPDMINETWORKUP pDrv = pThis ->CTX_SUFF(pDrv);2272 PPDMINETWORKUP pDrv = pThisCC->pDrv; 2226 2273 if (RT_LIKELY(pDrv)) 2227 2274 { … … 2243 2290 * path. 2244 2291 */ 2245 static void pcnetXmitRead1stSlow(PPCNETSTATE pThis, RTGCPHYS32 GCPhysFrame, unsigned cbFrame, 2246 PPDMSCATTERGATHER pSgBuf) 2292 static void pcnetXmitRead1stSlow(PPDMDEVINS pDevIns, RTGCPHYS32 GCPhysFrame, unsigned cbFrame, PPDMSCATTERGATHER pSgBuf) 2247 2293 { 2248 2294 AssertFailed(); /* This path is not supposed to be taken atm */ … … 2253 2299 Assert(iSeg < pSgBuf->cSegs); 2254 2300 uint32_t cbRead = (uint32_t)RT_MIN(cbFrame, pSgBuf->aSegs[iSeg].cbSeg); 2255 PDMDevHlpPhysRead(p This->CTX_SUFF(pDevIns), GCPhysFrame, pSgBuf->aSegs[iSeg].pvSeg, cbRead);2301 PDMDevHlpPhysRead(pDevIns, GCPhysFrame, pSgBuf->aSegs[iSeg].pvSeg, cbRead); 2256 2302 cbFrame -= cbRead; 2257 2303 if (!cbFrame) … … 2266 2312 * path. 2267 2313 */ 2268 static void pcnetXmitReadMoreSlow(PPCNETSTATE pThis, RTGCPHYS32 GCPhysFrame, unsigned cbFrame, 2269 PPDMSCATTERGATHER pSgBuf) 2314 static void pcnetXmitReadMoreSlow(PPDMDEVINS pDevIns, RTGCPHYS32 GCPhysFrame, unsigned cbFrame, PPDMSCATTERGATHER pSgBuf) 2270 2315 { 2271 2316 AssertFailed(); /* This path is not supposed to be taken atm */ … … 2290 2335 size_t offIntoSeg = off - offSeg; 2291 2336 uint32_t cbRead = (uint32_t)RT_MIN(pSgBuf->aSegs[iSeg].cbSeg - offIntoSeg, cbFrame); 2292 PDMDevHlpPhysRead(p This->CTX_SUFF(pDevIns), GCPhysFrame,2337 PDMDevHlpPhysRead(pDevIns, GCPhysFrame, 2293 2338 (uint8_t *)pSgBuf->aSegs[iSeg].pvSeg + offIntoSeg, cbRead); 2294 2339 cbFrame -= cbRead; … … 2305 2350 2306 2351 uint32_t cbRead = (uint32_t)RT_MIN(pSgBuf->aSegs[iSeg].cbSeg, cbFrame); 2307 PDMDevHlpPhysRead(p This->CTX_SUFF(pDevIns), GCPhysFrame, pSgBuf->aSegs[iSeg].pvSeg, cbRead);2352 PDMDevHlpPhysRead(pDevIns, GCPhysFrame, pSgBuf->aSegs[iSeg].pvSeg, cbRead); 2308 2353 cbFrame -= cbRead; 2309 2354 if (!cbFrame) … … 2317 2362 * Reads the first part of a frame into the scatter gather buffer. 2318 2363 */ 2319 DECLINLINE(void) pcnetXmitRead1st(PP CNETSTATE pThis, RTGCPHYS32 GCPhysFrame, const unsigned cbFrame,2364 DECLINLINE(void) pcnetXmitRead1st(PPDMDEVINS pDevIns, PPCNETSTATE pThis, RTGCPHYS32 GCPhysFrame, const unsigned cbFrame, 2320 2365 PPDMSCATTERGATHER pSgBuf) 2321 2366 { 2322 Assert(PDMCritSectIsOwner(&pThis->CritSect)); 2367 Assert(PDMCritSectIsOwner(&pThis->CritSect)); RT_NOREF(pThis); 2323 2368 Assert(pSgBuf->cbAvailable >= cbFrame); 2324 2369 … … 2326 2371 { 2327 2372 pSgBuf->cbUsed = cbFrame; 2328 PDMDevHlpPhysRead(p This->CTX_SUFF(pDevIns), GCPhysFrame, pSgBuf->aSegs[0].pvSeg, cbFrame);2373 PDMDevHlpPhysRead(pDevIns, GCPhysFrame, pSgBuf->aSegs[0].pvSeg, cbFrame); 2329 2374 } 2330 2375 else 2331 pcnetXmitRead1stSlow(p This, GCPhysFrame, cbFrame, pSgBuf);2376 pcnetXmitRead1stSlow(pDevIns, GCPhysFrame, cbFrame, pSgBuf); 2332 2377 } 2333 2378 … … 2335 2380 * Reads more into the current frame. 2336 2381 */ 2337 DECLINLINE(void) pcnetXmitReadMore(PPCNETSTATE pThis, RTGCPHYS32 GCPhysFrame, const unsigned cbFrame, 2338 PPDMSCATTERGATHER pSgBuf) 2382 DECLINLINE(void) pcnetXmitReadMore(PPDMDEVINS pDevIns, RTGCPHYS32 GCPhysFrame, const unsigned cbFrame, PPDMSCATTERGATHER pSgBuf) 2339 2383 { 2340 2384 size_t off = pSgBuf->cbUsed; … … 2344 2388 { 2345 2389 pSgBuf->cbUsed = cbFrame + off; 2346 PDMDevHlpPhysRead(pThis->CTX_SUFF(pDevIns), GCPhysFrame, 2347 (uint8_t *)pSgBuf->aSegs[0].pvSeg + off, cbFrame); 2390 PDMDevHlpPhysRead(pDevIns, GCPhysFrame, (uint8_t *)pSgBuf->aSegs[0].pvSeg + off, cbFrame); 2348 2391 } 2349 2392 else 2350 pcnetXmitReadMoreSlow(p This, GCPhysFrame, cbFrame, pSgBuf);2393 pcnetXmitReadMoreSlow(pDevIns, GCPhysFrame, cbFrame, pSgBuf); 2351 2394 } 2352 2395 … … 2383 2426 * Try to transmit frames 2384 2427 */ 2385 static void pcnetTransmit(PP CNETSTATE pThis)2428 static void pcnetTransmit(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC) 2386 2429 { 2387 2430 if (RT_UNLIKELY(!CSR_TXON(pThis))) … … 2395 2438 */ 2396 2439 TMD tmd; 2397 if (!pcnetTdtePoll(p This, &tmd))2440 if (!pcnetTdtePoll(pDevIns, pThis, &tmd)) 2398 2441 return; 2399 2442 … … 2408 2451 */ 2409 2452 #if defined(IN_RING0) || defined(IN_RC) 2410 if (!pThis ->CTX_SUFF(pDrv))2411 { 2412 int rc = PDMDevHlpTaskTrigger(p This->CTX_SUFF(pDevIns), pThis->hXmitTask);2453 if (!pThisCC->pDrv) 2454 { 2455 int rc = PDMDevHlpTaskTrigger(pDevIns, pThis->hXmitTask); 2413 2456 AssertRC(rc); 2414 2457 } … … 2416 2459 #endif 2417 2460 { 2418 int rc = pcnetXmitPending(p This, false /*fOnWorkerThread*/);2461 int rc = pcnetXmitPending(pDevIns, pThis, pThisCC, false /*fOnWorkerThread*/); 2419 2462 if (rc == VERR_TRY_AGAIN) 2420 2463 rc = VINF_SUCCESS; … … 2429 2472 * @threads TX or EMT. 2430 2473 */ 2431 static int pcnetAsyncTransmit(PP CNETSTATE pThis, bool fOnWorkerThread)2474 static int pcnetAsyncTransmit(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC, bool fOnWorkerThread) 2432 2475 { 2433 2476 Assert(PDMCritSectIsOwner(&pThis->CritSect)); … … 2455 2498 #endif 2456 2499 TMD tmd; 2457 if (!pcnetTdtePoll(p This, &tmd))2500 if (!pcnetTdtePoll(pDevIns, pThis, &tmd)) 2458 2501 break; 2459 2502 … … 2489 2532 if (RT_LIKELY(cb <= MAX_FRAME)) 2490 2533 { 2491 rc = pcnetXmitAllocBuf(pThis, cb, fLoopback, &SgLoop, &pSgBuf);2534 rc = pcnetXmitAllocBuf(pThis, pThisCC, cb, fLoopback, &SgLoop, &pSgBuf); 2492 2535 if (RT_SUCCESS(rc)) 2493 2536 { 2494 pcnetXmitRead1st(p This, PHYSADDR(pThis, tmd.tmd0.tbadr), cb, pSgBuf);2495 rc = pcnetXmitSendBuf(p This, fLoopback, pSgBuf, fOnWorkerThread);2537 pcnetXmitRead1st(pDevIns, pThis, PHYSADDR(pThis, tmd.tmd0.tbadr), cb, pSgBuf); 2538 rc = pcnetXmitSendBuf(pDevIns, pThis, pThisCC, fLoopback, pSgBuf, fOnWorkerThread); 2496 2539 } 2497 2540 else if (rc == VERR_TRY_AGAIN) … … 2529 2572 * in fact generally treat the length as a 16-bit quantity. */ 2530 2573 LogRel(("PCnet#%d: pcnetAsyncTransmit: illegal 4kb frame -> ignoring\n", PCNET_INST_NR)); 2531 pcnetTmdStorePassHost(p This, &tmd, PHYSADDR(pThis, CSR_CXDA(pThis)));2574 pcnetTmdStorePassHost(pDevIns, pThis, &tmd, PHYSADDR(pThis, CSR_CXDA(pThis))); 2532 2575 break; 2533 2576 } … … 2545 2588 2546 2589 /* Write back the TMD and pass it to the host (clear own bit). */ 2547 pcnetTmdStorePassHost(p This, &tmd, PHYSADDR(pThis, CSR_CXDA(pThis)));2590 pcnetTmdStorePassHost(pDevIns, pThis, &tmd, PHYSADDR(pThis, CSR_CXDA(pThis))); 2548 2591 2549 2592 /* advance the ring counter register */ … … 2565 2608 */ 2566 2609 unsigned cb = 4096 - tmd.tmd1.bcnt; 2567 rc = pcnetXmitAllocBuf(pThis, p cnetCalcPacketLen(pThis, cb), fLoopback, &SgLoop, &pSgBuf);2610 rc = pcnetXmitAllocBuf(pThis, pThisCC, pcnetCalcPacketLen(pDevIns, pThis, cb), fLoopback, &SgLoop, &pSgBuf); 2568 2611 if (rc == VERR_TRY_AGAIN) 2569 2612 { … … 2574 2617 bool fDropFrame = RT_FAILURE(rc); 2575 2618 if (!fDropFrame) 2576 pcnetXmitRead1st(p This, PHYSADDR(pThis, tmd.tmd0.tbadr), cb, pSgBuf);2619 pcnetXmitRead1st(pDevIns, pThis, PHYSADDR(pThis, tmd.tmd0.tbadr), cb, pSgBuf); 2577 2620 2578 2621 for (;;) … … 2591 2634 2592 2635 TMD dummy; 2593 if (!pcnetTdtePoll(p This, &dummy))2636 if (!pcnetTdtePoll(pDevIns, pThis, &dummy)) 2594 2637 { 2595 2638 /* … … 2602 2645 if (!CSR_DXSUFLO(pThis)) /* stop on xmit underflow */ 2603 2646 pThis->aCSR[0] &= ~0x0010; /* clear TXON */ 2604 pcnetTmdStorePassHost(p This, &tmd, GCPhysPrevTmd);2647 pcnetTmdStorePassHost(pDevIns, pThis, &tmd, GCPhysPrevTmd); 2605 2648 AssertMsgFailed(("pcnetAsyncTransmit: Underflow!!!\n")); 2606 pcnetXmitFreeBuf(pThis , fLoopback, pSgBuf);2649 pcnetXmitFreeBuf(pThisCC, fLoopback, pSgBuf); 2607 2650 break; 2608 2651 } 2609 2652 2610 2653 /* release & save the previous tmd, pass it to the host */ 2611 pcnetTmdStorePassHost(p This, &tmd, GCPhysPrevTmd);2654 pcnetTmdStorePassHost(pDevIns, pThis, &tmd, GCPhysPrevTmd); 2612 2655 2613 2656 /* … … 2617 2660 cBuffers++; 2618 2661 #endif 2619 pcnetTmdLoad(p This, &tmd, PHYSADDR(pThis, CSR_CXDA(pThis)), false);2662 pcnetTmdLoad(pDevIns, pThis, &tmd, PHYSADDR(pThis, CSR_CXDA(pThis)), false); 2620 2663 cb = 4096 - tmd.tmd1.bcnt; 2621 2664 if ( !fDropFrame 2622 2665 && pSgBuf->cbUsed + cb <= MAX_FRAME) /** @todo this used to be ... + cb < MAX_FRAME. */ 2623 pcnetXmitReadMore(p This, PHYSADDR(pThis, tmd.tmd0.tbadr), cb, pSgBuf);2666 pcnetXmitReadMore(pDevIns, PHYSADDR(pThis, tmd.tmd0.tbadr), cb, pSgBuf); 2624 2667 else 2625 2668 { … … 2637 2680 if (!fDropFrame && (pcnetIsLinkUp(pThis) || fLoopback)) 2638 2681 { 2639 rc = pcnetXmitSendBuf(p This, fLoopback, pSgBuf, fOnWorkerThread);2682 rc = pcnetXmitSendBuf(pDevIns, pThis, pThisCC, fLoopback, pSgBuf, fOnWorkerThread); 2640 2683 fDropFrame = RT_FAILURE(rc); 2641 2684 } 2642 2685 else 2643 pcnetXmitFreeBuf(pThis , fLoopback, pSgBuf);2686 pcnetXmitFreeBuf(pThisCC, fLoopback, pSgBuf); 2644 2687 if (fDropFrame) 2645 2688 pcnetXmitFailTMDLinkDown(pThis, &tmd); 2646 2689 2647 2690 /* Write back the TMD, pass it to the host */ 2648 pcnetTmdStorePassHost(p This, &tmd, PHYSADDR(pThis, CSR_CXDA(pThis)));2691 pcnetTmdStorePassHost(pDevIns, pThis, &tmd, PHYSADDR(pThis, CSR_CXDA(pThis))); 2649 2692 2650 2693 /* advance the ring counter register */ … … 2697 2740 /* Don't allow the guest to clear TINT before reading it */ 2698 2741 pThis->u16CSR0LastSeenByGuest &= ~0x0200; 2699 pcnetUpdateIrq(p This);2742 pcnetUpdateIrq(pDevIns, pThis); 2700 2743 } 2701 2744 … … 2711 2754 * @returns VBox status code. VERR_TRY_AGAIN is returned if we're busy. 2712 2755 * 2756 * @param pDevIns The device instance. 2713 2757 * @param pThis The PCnet shared instance data. 2758 * @param pThisCC The PCNet state data for the current context. 2714 2759 * @param fOnWorkerThread Whether we're on a worker thread or on an EMT. 2715 2760 */ 2716 static int pcnetXmitPending(PP CNETSTATE pThis, bool fOnWorkerThread)2761 static int pcnetXmitPending(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC, bool fOnWorkerThread) 2717 2762 { 2718 2763 RT_NOREF_PV(fOnWorkerThread); … … 2722 2767 * Grab the xmit lock of the driver as well as the E1K device state. 2723 2768 */ 2724 PPDMINETWORKUP pDrv = pThis ->CTX_SUFF(pDrv);2769 PPDMINETWORKUP pDrv = pThisCC->pDrv; 2725 2770 if (pDrv) 2726 2771 { … … 2736 2781 * Do the transmitting. 2737 2782 */ 2738 int rc2 = pcnetAsyncTransmit(p This, false /*fOnWorkerThread*/);2783 int rc2 = pcnetAsyncTransmit(pDevIns, pThis, pThisCC, false /*fOnWorkerThread*/); 2739 2784 AssertReleaseRC(rc2); 2740 2785 … … 2756 2801 * Poll for changes in RX and TX descriptor rings. 2757 2802 */ 2758 static void pcnetPollRxTx(PP CNETSTATE pThis)2803 static void pcnetPollRxTx(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC) 2759 2804 { 2760 2805 if (CSR_RXON(pThis)) … … 2767 2812 if ( HOST_IS_OWNER(CSR_CRST(pThis)) /* only poll RDTEs if none available or ... */ 2768 2813 || pThis->fMaybeOutOfSpace) /* ... for waking up pcnetWaitReceiveAvail() */ 2769 pcnetRdtePoll(p This);2814 pcnetRdtePoll(pDevIns, pThis); 2770 2815 } 2771 2816 2772 2817 if (CSR_TDMD(pThis) || (CSR_TXON(pThis) && !CSR_DPOLL(pThis))) 2773 pcnetTransmit(p This);2818 pcnetTransmit(pDevIns, pThis, pThisCC); 2774 2819 } 2775 2820 … … 2792 2837 * @thread EMT. 2793 2838 */ 2794 static void pcnetPollTimer(PPDMDEVINS pDevIns, PPCNETSTATE pThis )2839 static void pcnetPollTimer(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC) 2795 2840 { 2796 2841 STAM_PROFILE_ADV_START(&pThis->StatPollTimer, a); … … 2804 2849 Log2(("#%d pcnetPollTimer time=%#010llx TDMD=%d TXON=%d POLL=%d TDTE=%d TDRA=%#x\n", 2805 2850 PCNET_INST_NR, RTTimeMilliTS(), CSR_TDMD(pThis), CSR_TXON(pThis), 2806 !CSR_DPOLL(pThis), pcnetTdtePoll(p This, &dummy), pThis->GCTDRA));2851 !CSR_DPOLL(pThis), pcnetTdtePoll(pDevIns, pThis, &dummy), pThis->GCTDRA)); 2807 2852 Log2(("#%d pcnetPollTimer: CSR_CXDA=%#x CSR_XMTRL=%d CSR_XMTRC=%d\n", 2808 2853 PCNET_INST_NR, CSR_CXDA(pThis), CSR_XMTRL(pThis), CSR_XMTRC(pThis))); … … 2812 2857 { 2813 2858 TMD tmd; 2814 pcnetTmdLoad(p This, &tmd, PHYSADDR(pThis, CSR_CXDA(pThis)), false);2859 pcnetTmdLoad(pDevIns, pThis, &tmd, PHYSADDR(pThis, CSR_CXDA(pThis)), false); 2815 2860 Log10(("#%d pcnetPollTimer: TMDLOAD %#010x\n", PCNET_INST_NR, PHYSADDR(pThis, CSR_CXDA(pThis)))); 2816 2861 PRINT_TMD(&tmd); … … 2818 2863 #endif 2819 2864 if (CSR_TDMD(pThis)) 2820 pcnetTransmit(p This);2821 2822 pcnetUpdateIrq(p This);2865 pcnetTransmit(pDevIns, pThis, pThisCC); 2866 2867 pcnetUpdateIrq(pDevIns, pThis); 2823 2868 2824 2869 /* If the receive thread is waiting for new descriptors, poll TX/RX even if polling … … 2837 2882 * interval is the default polling interval of the PCnet card (65536/33MHz). */ 2838 2883 #ifdef PCNET_NO_POLLING 2839 pcnetPollRxTx(p This);2884 pcnetPollRxTx(pDevIns, pThis, pThisCC); 2840 2885 #else 2841 2886 uint64_t u64Now = PDMDevHlpTimerGet(pDevIns, pThis->hTimerPoll); … … 2843 2888 { 2844 2889 pThis->u64LastPoll = u64Now; 2845 pcnetPollRxTx(p This);2890 pcnetPollRxTx(pDevIns, pThis, pThisCC); 2846 2891 } 2847 2892 if (!PDMDevHlpTimerIsActive(pDevIns, pThis->hTimerPoll)) … … 2853 2898 2854 2899 2855 static VBOXSTRICTRC pcnetCSRWriteU16(PPDMDEVINS pDevIns, PPCNETSTATE pThis, uint32_t u32RAP, uint32_t val)2900 static VBOXSTRICTRC pcnetCSRWriteU16(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC, uint32_t u32RAP, uint32_t val) 2856 2901 { 2857 2902 VBOXSTRICTRC rc = VINF_SUCCESS; … … 2884 2929 2885 2930 if (!CSR_STOP(pThis) && (val & 4)) 2886 pcnetStop(pDevIns, pThis );2931 pcnetStop(pDevIns, pThis, pThisCC); 2887 2932 2888 2933 #ifdef IN_RING3 2889 2934 if (!CSR_INIT(pThis) && (val & 1)) 2890 pcnetR3Init(p This);2935 pcnetR3Init(pDevIns, pThis, pThisCC); 2891 2936 #endif 2892 2937 … … 2895 2940 2896 2941 if (CSR_TDMD(pThis)) 2897 pcnetTransmit(p This);2942 pcnetTransmit(pDevIns, pThis, pThisCC); 2898 2943 2899 2944 return rc; … … 2969 3014 } 2970 3015 case 15: /* Mode */ 2971 if ((pThis->aCSR[15] & 0x8000) != (uint16_t)(val & 0x8000) && pThis-> pDrvR3)3016 if ((pThis->aCSR[15] & 0x8000) != (uint16_t)(val & 0x8000) && pThis->fDriverAttached) 2972 3017 { 2973 3018 Log(("#%d: promiscuous mode changed to %d\n", PCNET_INST_NR, !!(val & 0x8000))); … … 2976 3021 #else 2977 3022 /* check for promiscuous mode change */ 2978 if (pThis ->pDrvR3)2979 pThis ->pDrvR3->pfnSetPromiscuousMode(pThis->pDrvR3, !!(val & 0x8000));3023 if (pThisCC->pDrv) 3024 pThisCC->pDrv->pfnSetPromiscuousMode(pThisCC->pDrv, !!(val & 0x8000)); 2980 3025 #endif 2981 3026 } 2982 3027 break; 2983 3028 case 16: /* IADRL */ 2984 return pcnetCSRWriteU16(pDevIns, pThis, 1, val);3029 return pcnetCSRWriteU16(pDevIns, pThis, pThisCC, 1, val); 2985 3030 case 17: /* IADRH */ 2986 return pcnetCSRWriteU16(pDevIns, pThis, 2, val);3031 return pcnetCSRWriteU16(pDevIns, pThis, pThisCC, 2, val); 2987 3032 2988 3033 /* … … 3075 3120 } 3076 3121 3077 static uint32_t pcnetCSRReadU16(PP CNETSTATE pThis, uint32_t u32RAP)3122 static uint32_t pcnetCSRReadU16(PPDMDEVINS pDevIns, PPCNETSTATE pThis, uint32_t u32RAP) 3078 3123 { 3079 3124 uint32_t val; … … 3081 3126 { 3082 3127 case 0: 3083 pcnetUpdateIrq(p This);3128 pcnetUpdateIrq(pDevIns, pThis); 3084 3129 val = pThis->aCSR[0]; 3085 3130 val |= (val & 0x7800) ? 0x8000 : 0; … … 3087 3132 break; 3088 3133 case 16: 3089 return pcnetCSRReadU16(p This, 1);3134 return pcnetCSRReadU16(pDevIns, pThis, 1); 3090 3135 case 17: 3091 return pcnetCSRReadU16(p This, 2);3136 return pcnetCSRReadU16(pDevIns, pThis, 2); 3092 3137 case 58: 3093 3138 return pcnetBCRReadU16(pThis, BCR_SWS); … … 3342 3387 val = pThis->aBCR[u32RAP] & ~0x8000; 3343 3388 /* Clear LNKSTE if we're not connected or if we've just loaded a VM state. */ 3344 if (!pThis-> pDrvR3|| pThis->fLinkTempDown || !pThis->fLinkUp)3389 if (!pThis->fDriverAttached || pThis->fLinkTempDown || !pThis->fLinkUp) 3345 3390 { 3346 3391 if (u32RAP == 4) … … 3547 3592 } 3548 3593 3549 static uint32_t pcnetIoPortReadU8(PP CNETSTATE pThis, uint32_t addr)3594 static uint32_t pcnetIoPortReadU8(PPDMDEVINS pDevIns, PPCNETSTATE pThis, uint32_t addr) 3550 3595 { 3551 3596 uint32_t val = UINT32_MAX; … … 3564 3609 Log(("#%d pcnetIoPortReadU8: addr=%#010x val=%#06x BCR_DWIO !!\n", PCNET_INST_NR, addr, val & 0xff)); 3565 3610 3566 pcnetUpdateIrq(p This);3611 pcnetUpdateIrq(pDevIns, pThis); 3567 3612 3568 3613 Log6(("#%d pcnetIoPortReadU8: addr=%#010x val=%#06x\n", PCNET_INST_NR, addr, val & 0xff)); … … 3570 3615 } 3571 3616 3572 static VBOXSTRICTRC pcnetIoPortWriteU16(PPDMDEVINS pDevIns, PPCNETSTATE pThis, uint32_t addr, uint32_t val)3617 static VBOXSTRICTRC pcnetIoPortWriteU16(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC, uint32_t addr, uint32_t val) 3573 3618 { 3574 3619 VBOXSTRICTRC rc = VINF_SUCCESS; … … 3580 3625 { 3581 3626 case 0x00: /* RDP */ 3582 pcnetPollTimer(pDevIns, pThis );3583 rc = pcnetCSRWriteU16(pDevIns, pThis, pThis ->u32RAP, val);3584 pcnetUpdateIrq(p This);3627 pcnetPollTimer(pDevIns, pThis, pThisCC); 3628 rc = pcnetCSRWriteU16(pDevIns, pThis, pThisCC, pThis->u32RAP, val); 3629 pcnetUpdateIrq(pDevIns, pThis); 3585 3630 break; 3586 3631 case 0x02: /* RAP */ … … 3598 3643 } 3599 3644 3600 static uint32_t pcnetIoPortReadU16(PPDMDEVINS pDevIns, PPCNETSTATE pThis, uint32_t addr)3645 static uint32_t pcnetIoPortReadU16(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC, uint32_t addr) 3601 3646 { 3602 3647 uint32_t val = ~0U; … … 3610 3655 /** Polling is then useless here and possibly expensive. */ 3611 3656 if (!CSR_DPOLL(pThis)) 3612 pcnetPollTimer(pDevIns, pThis );3613 3614 val = pcnetCSRReadU16(p This, pThis->u32RAP);3657 pcnetPollTimer(pDevIns, pThis, pThisCC); 3658 3659 val = pcnetCSRReadU16(pDevIns, pThis, pThis->u32RAP); 3615 3660 if (pThis->u32RAP == 0) // pcnetUpdateIrq() already called by pcnetCSRReadU16() 3616 3661 goto skip_update_irq; … … 3631 3676 Log(("#%d pcnetIoPortReadU16: addr=%#010x val=%#06x BCR_DWIO !!\n", PCNET_INST_NR, addr, val & 0xffff)); 3632 3677 3633 pcnetUpdateIrq(p This);3678 pcnetUpdateIrq(pDevIns, pThis); 3634 3679 3635 3680 skip_update_irq: … … 3638 3683 } 3639 3684 3640 static VBOXSTRICTRC pcnetIoPortWriteU32(PPDMDEVINS pDevIns, PPCNETSTATE pThis, uint32_t addr, uint32_t val)3685 static VBOXSTRICTRC pcnetIoPortWriteU32(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC, uint32_t addr, uint32_t val) 3641 3686 { 3642 3687 VBOXSTRICTRC rc = VINF_SUCCESS; … … 3648 3693 { 3649 3694 case 0x00: /* RDP */ 3650 pcnetPollTimer(pDevIns, pThis );3651 rc = pcnetCSRWriteU16(pDevIns, pThis, pThis ->u32RAP, val & 0xffff);3652 pcnetUpdateIrq(p This);3695 pcnetPollTimer(pDevIns, pThis, pThisCC); 3696 rc = pcnetCSRWriteU16(pDevIns, pThis, pThisCC, pThis->u32RAP, val & 0xffff); 3697 pcnetUpdateIrq(pDevIns, pThis); 3653 3698 break; 3654 3699 case 0x04: /* RAP */ … … 3672 3717 } 3673 3718 3674 static uint32_t pcnetIoPortReadU32(PPDMDEVINS pDevIns, PPCNETSTATE pThis, uint32_t addr)3719 static uint32_t pcnetIoPortReadU32(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC, uint32_t addr) 3675 3720 { 3676 3721 uint32_t val = ~0U; … … 3684 3729 /** Polling is then useless here and possibly expensive. */ 3685 3730 if (!CSR_DPOLL(pThis)) 3686 pcnetPollTimer(pDevIns, pThis );3687 3688 val = pcnetCSRReadU16(p This, pThis->u32RAP);3731 pcnetPollTimer(pDevIns, pThis, pThisCC); 3732 3733 val = pcnetCSRReadU16(pDevIns, pThis, pThis->u32RAP); 3689 3734 if (pThis->u32RAP == 0) // pcnetUpdateIrq() already called by pcnetCSRReadU16() 3690 3735 goto skip_update_irq; … … 3704 3749 else 3705 3750 Log(("#%d pcnetIoPortReadU32: addr=%#010x val=%#010x !BCR_DWIO !!\n", PCNET_INST_NR, addr, val)); 3706 pcnetUpdateIrq(p This);3751 pcnetUpdateIrq(pDevIns, pThis); 3707 3752 3708 3753 skip_update_irq: … … 3717 3762 static DECLCALLBACK(VBOXSTRICTRC) pcnetIoPortRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t *pu32, unsigned cb) 3718 3763 { 3719 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 3720 VBOXSTRICTRC rc = VINF_SUCCESS; 3764 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 3765 PPCNETSTATECC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PPCNETSTATECC); 3766 VBOXSTRICTRC rc = VINF_SUCCESS; 3721 3767 STAM_PROFILE_ADV_START(&pThis->CTX_SUFF_Z(StatIORead), a); 3722 3768 Assert(PDMCritSectIsOwner(&pThis->CritSect)); … … 3725 3771 switch (cb) 3726 3772 { 3727 case 1: *pu32 = pcnetIoPortReadU8(p This, offPort); break;3728 case 2: *pu32 = pcnetIoPortReadU16(pDevIns, pThis, offPort); break;3729 case 4: *pu32 = pcnetIoPortReadU32(pDevIns, pThis, offPort); break;3773 case 1: *pu32 = pcnetIoPortReadU8(pDevIns, pThis, offPort); break; 3774 case 2: *pu32 = pcnetIoPortReadU16(pDevIns, pThis, pThisCC, offPort); break; 3775 case 4: *pu32 = pcnetIoPortReadU32(pDevIns, pThis, pThisCC, offPort); break; 3730 3776 default: 3731 3777 rc = PDMDevHlpDBGFStop(pDevIns, RT_SRC_POS, "pcnetIoPortRead: unsupported op size: offset=%#10x cb=%u\n", offPort, cb); … … 3743 3789 static DECLCALLBACK(VBOXSTRICTRC) pcnetIoPortWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t u32, unsigned cb) 3744 3790 { 3745 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 3746 VBOXSTRICTRC rc = VINF_SUCCESS; 3791 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 3792 PPCNETSTATECC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PPCNETSTATECC); 3793 VBOXSTRICTRC rc; 3747 3794 STAM_PROFILE_ADV_START(&pThis->CTX_SUFF_Z(StatIOWrite), a); 3748 3795 Assert(PDMCritSectIsOwner(&pThis->CritSect)); … … 3752 3799 { 3753 3800 case 1: rc = pcnetIoPortWriteU8(pThis, offPort, u32); break; 3754 case 2: rc = pcnetIoPortWriteU16(pDevIns, pThis, offPort, u32); break;3755 case 4: rc = pcnetIoPortWriteU32(pDevIns, pThis, offPort, u32); break;3801 case 2: rc = pcnetIoPortWriteU16(pDevIns, pThis, pThisCC, offPort, u32); break; 3802 case 4: rc = pcnetIoPortWriteU32(pDevIns, pThis, pThisCC, offPort, u32); break; 3756 3803 default: 3757 3804 rc = PDMDevHlpDBGFStop(pDevIns, RT_SRC_POS, "pcnetIoPortWrite: unsupported op size: offset=%#10x cb=%u\n", offPort, cb); … … 3784 3831 } 3785 3832 3786 static VBOXSTRICTRC pcnetR3MmioWriteU16(PPDMDEVINS pDevIns, PPCNETSTATE pThis, RTGCPHYS off, uint32_t val)3833 static VBOXSTRICTRC pcnetR3MmioWriteU16(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC, RTGCPHYS off, uint32_t val) 3787 3834 { 3788 3835 VBOXSTRICTRC rcStrict; … … 3790 3837 if (off & 0x10) 3791 3838 { 3792 rcStrict = pcnetIoPortWriteU16(pDevIns, pThis, off & 0x0f, val);3839 rcStrict = pcnetIoPortWriteU16(pDevIns, pThis, pThisCC, off & 0x0f, val); 3793 3840 if (rcStrict == VINF_IOM_R3_IOPORT_WRITE) 3794 3841 rcStrict = VINF_IOM_R3_MMIO_WRITE; … … 3803 3850 } 3804 3851 3805 static uint32_t pcnetR3MmioReadU16(PPDMDEVINS pDevIns, PPCNETSTATE pThis, RTGCPHYS addr)3852 static uint32_t pcnetR3MmioReadU16(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC, RTGCPHYS addr) 3806 3853 { 3807 3854 uint32_t val = ~0U; 3808 3855 3809 3856 if (addr & 0x10) 3810 val = pcnetIoPortReadU16(pDevIns, pThis, addr & 0x0f);3857 val = pcnetIoPortReadU16(pDevIns, pThis, pThisCC, addr & 0x0f); 3811 3858 else 3812 3859 { … … 3819 3866 } 3820 3867 3821 static VBOXSTRICTRC pcnetR3MmioWriteU32(PPDMDEVINS pDevIns, PPCNETSTATE pThis, RTGCPHYS off, uint32_t val)3868 static VBOXSTRICTRC pcnetR3MmioWriteU32(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC, RTGCPHYS off, uint32_t val) 3822 3869 { 3823 3870 VBOXSTRICTRC rcStrict; … … 3825 3872 if (off & 0x10) 3826 3873 { 3827 rcStrict = pcnetIoPortWriteU32(pDevIns, pThis, off & 0x0f, val);3874 rcStrict = pcnetIoPortWriteU32(pDevIns, pThis, pThisCC, off & 0x0f, val); 3828 3875 if (rcStrict == VINF_IOM_R3_IOPORT_WRITE) 3829 3876 rcStrict = VINF_IOM_R3_MMIO_WRITE; … … 3840 3887 } 3841 3888 3842 static uint32_t pcnetR3MmioReadU32(PPDMDEVINS pDevIns, PPCNETSTATE pThis, RTGCPHYS addr)3889 static uint32_t pcnetR3MmioReadU32(PPDMDEVINS pDevIns, PPCNETSTATE pThis, PPCNETSTATECC pThisCC, RTGCPHYS addr) 3843 3890 { 3844 3891 uint32_t val; 3845 3892 3846 3893 if (addr & 0x10) 3847 val = pcnetIoPortReadU32(pDevIns, pThis, addr & 0x0f);3894 val = pcnetIoPortReadU32(pDevIns, pThis, pThisCC, addr & 0x0f); 3848 3895 else 3849 3896 { … … 3866 3913 static DECLCALLBACK(VBOXSTRICTRC) pcnetR3MmioRead(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS off, void *pv, unsigned cb) 3867 3914 { 3868 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 3869 VBOXSTRICTRC rc = VINF_SUCCESS; 3915 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 3916 PPCNETSTATECC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PPCNETSTATECC); 3917 VBOXSTRICTRC rc = VINF_SUCCESS; 3870 3918 Assert(PDMCritSectIsOwner(&pThis->CritSect)); 3871 3919 RT_NOREF_PV(pvUser); … … 3880 3928 { 3881 3929 case 1: *(uint8_t *)pv = pcnetR3MmioReadU8 (pThis, off); break; 3882 case 2: *(uint16_t *)pv = pcnetR3MmioReadU16(pDevIns, pThis, off); break;3883 case 4: *(uint32_t *)pv = pcnetR3MmioReadU32(pDevIns, pThis, off); break;3930 case 2: *(uint16_t *)pv = pcnetR3MmioReadU16(pDevIns, pThis, pThisCC, off); break; 3931 case 4: *(uint32_t *)pv = pcnetR3MmioReadU32(pDevIns, pThis, pThisCC, off); break; 3884 3932 default: 3885 3933 rc = PDMDevHlpDBGFStop(pDevIns, RT_SRC_POS, "pcnetR3MmioRead: unsupported op size: address=%RGp cb=%u\n", off, cb); … … 3901 3949 static DECLCALLBACK(VBOXSTRICTRC) pcnetR3MmioWrite(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS off, void const *pv, unsigned cb) 3902 3950 { 3903 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 3904 VBOXSTRICTRC rc = VINF_SUCCESS; 3951 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 3952 PPCNETSTATECC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PPCNETSTATECC); 3953 VBOXSTRICTRC rc = VINF_SUCCESS; 3905 3954 Assert(PDMCritSectIsOwner(&pThis->CritSect)); 3906 3955 RT_NOREF_PV(pvUser); … … 3915 3964 { 3916 3965 case 1: pcnetR3MmioWriteU8(pThis, off, *(uint8_t *)pv); break; 3917 case 2: rc = pcnetR3MmioWriteU16(pDevIns, pThis, off, *(uint16_t *)pv); break;3918 case 4: rc = pcnetR3MmioWriteU32(pDevIns, pThis, off, *(uint32_t *)pv); break;3966 case 2: rc = pcnetR3MmioWriteU16(pDevIns, pThis, pThisCC, off, *(uint16_t *)pv); break; 3967 case 4: rc = pcnetR3MmioWriteU32(pDevIns, pThis, pThisCC, off, *(uint32_t *)pv); break; 3919 3968 default: 3920 3969 rc = PDMDevHlpDBGFStop(pDevIns, RT_SRC_POS, "pcnetR3MmioWrite: unsupported op size: address=%RGp cb=%u\n", off, cb); … … 3937 3986 static DECLCALLBACK(void) pcnetR3Timer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser) 3938 3987 { 3988 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 3989 PPCNETSTATECC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PPCNETSTATECC); 3990 Assert(PDMCritSectIsOwner(&pThis->CritSect)); 3991 RT_NOREF(pvUser, pTimer); 3992 3993 STAM_PROFILE_ADV_START(&pThis->StatTimer, a); 3994 pcnetPollTimer(pDevIns, pThis, pThisCC); 3995 STAM_PROFILE_ADV_STOP(&pThis->StatTimer, a); 3996 } 3997 3998 3999 /** 4000 * @callback_method_impl{FNTMTIMERDEV, 4001 * Software interrupt timer callback function.} 4002 */ 4003 static DECLCALLBACK(void) pcnetR3TimerSoftInt(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser) 4004 { 3939 4005 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 3940 4006 Assert(PDMCritSectIsOwner(&pThis->CritSect)); 3941 4007 RT_NOREF(pvUser, pTimer); 3942 4008 3943 STAM_PROFILE_ADV_START(&pThis->StatTimer, a);3944 pcnetPollTimer(pDevIns, pThis);3945 STAM_PROFILE_ADV_STOP(&pThis->StatTimer, a);3946 }3947 3948 3949 /**3950 * @callback_method_impl{FNTMTIMERDEV,3951 * Software interrupt timer callback function.}3952 */3953 static DECLCALLBACK(void) pcnetR3TimerSoftInt(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)3954 {3955 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE);3956 Assert(PDMCritSectIsOwner(&pThis->CritSect));3957 RT_NOREF(pvUser, pTimer);3958 3959 4009 pThis->aCSR[7] |= 0x0800; /* STINT */ 3960 pcnetUpdateIrq(p This);4010 pcnetUpdateIrq(pDevIns, pThis); 3961 4011 PDMDevHlpTimerSetNano(pDevIns, pThis->hTimerSoftInt, 12800U * (pThis->aBCR[BCR_STVAL] & 0xffff)); 3962 4012 } … … 4219 4269 { 4220 4270 RMD rmd; 4221 pcnetRmdLoad(p This, &rmd, PHYSADDR(pThis, GCPhys), false);4271 pcnetRmdLoad(pDevIns, pThis, &rmd, PHYSADDR(pThis, GCPhys), false); 4222 4272 pHlp->pfnPrintf(pHlp, 4223 4273 "%04x %RX32:%c%c RBADR=%08RX32 BCNT=%03x MCNT=%03x " … … 4259 4309 { 4260 4310 TMD tmd; 4261 pcnetTmdLoad(p This, &tmd, PHYSADDR(pThis, GCPhys), false);4311 pcnetTmdLoad(pDevIns, pThis, &tmd, PHYSADDR(pThis, GCPhys), false); 4262 4312 pHlp->pfnPrintf(pHlp, 4263 4313 "%04x %RX32:%c%c TBADR=%08RX32 BCNT=%03x OWN=%d " … … 4452 4502 static DECLCALLBACK(int) pcnetR3LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass) 4453 4503 { 4454 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 4455 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 4504 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 4505 PPCNETSTATECC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PPCNETSTATECC); 4506 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 4456 4507 4457 4508 if ( SSM_VERSION_MAJOR_CHANGED(uVersion, PCNET_SAVEDSTATE_VERSION) … … 4535 4586 4536 4587 /* update promiscuous mode. */ 4537 if (pThis ->pDrvR3)4538 pThis ->pDrvR3->pfnSetPromiscuousMode(pThis->pDrvR3, CSR_PROM(pThis));4588 if (pThisCC->pDrv) 4589 pThisCC->pDrv->pfnSetPromiscuousMode(pThisCC->pDrv, CSR_PROM(pThis)); 4539 4590 4540 4591 #ifdef PCNET_NO_POLLING … … 4577 4628 * 4578 4629 * @returns VBox status code. 4579 * @param pThis The PCnet shared instance data. 4580 */ 4581 static int pcnetR3CanReceive(PPCNETSTATE pThis) 4630 * @param pDevIns The device instance. 4631 * @param pThis The PCnet shared instance data. 4632 */ 4633 static int pcnetR3CanReceive(PPDMDEVINS pDevIns, PPCNETSTATE pThis) 4582 4634 { 4583 4635 int rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY); … … 4589 4641 { 4590 4642 if (HOST_IS_OWNER(CSR_CRST(pThis)) && pThis->GCRDRA) 4591 pcnetRdtePoll(p This);4643 pcnetRdtePoll(pDevIns, pThis); 4592 4644 4593 4645 if (RT_UNLIKELY(HOST_IS_OWNER(CSR_CRST(pThis)))) … … 4611 4663 static DECLCALLBACK(int) pcnetR3NetworkDown_WaitReceiveAvail(PPDMINETWORKDOWN pInterface, RTMSINTERVAL cMillies) 4612 4664 { 4613 PPCNETSTATE pThis = RT_FROM_MEMBER(pInterface, PCNETSTATE, INetworkDown); 4614 PPDMDEVINS pDevIns = pThis->pDevInsR3; 4615 4616 int rc = pcnetR3CanReceive(pThis); 4665 PPCNETSTATECC pThisCC = RT_FROM_MEMBER(pInterface, PCNETSTATECC, INetworkDown); 4666 PPDMDEVINS pDevIns = pThisCC->pDevIns; 4667 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 4668 4669 int rc = pcnetR3CanReceive(pDevIns, pThis); 4617 4670 if (RT_SUCCESS(rc)) 4618 4671 return VINF_SUCCESS; … … 4624 4677 STAM_PROFILE_START(&pThis->StatRxOverflow, a); 4625 4678 VMSTATE enmVMState; 4626 while (RT_LIKELY( (enmVMState = PDMDevHlpVMState(p This->CTX_SUFF(pDevIns))) == VMSTATE_RUNNING4679 while (RT_LIKELY( (enmVMState = PDMDevHlpVMState(pDevIns)) == VMSTATE_RUNNING 4627 4680 || enmVMState == VMSTATE_RUNNING_LS)) 4628 4681 { 4629 int rc2 = pcnetR3CanReceive(p This);4682 int rc2 = pcnetR3CanReceive(pDevIns, pThis); 4630 4683 if (RT_SUCCESS(rc2)) 4631 4684 { … … 4656 4709 static DECLCALLBACK(int) pcnetR3NetworkDown_Receive(PPDMINETWORKDOWN pInterface, const void *pvBuf, size_t cb) 4657 4710 { 4658 PPCNETSTATE pThis = RT_FROM_MEMBER(pInterface, PCNETSTATE, INetworkDown); 4659 int rc; 4711 PPCNETSTATECC pThisCC = RT_FROM_MEMBER(pInterface, PCNETSTATECC, INetworkDown); 4712 PPDMDEVINS pDevIns = pThisCC->pDevIns; 4713 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 4660 4714 4661 4715 STAM_PROFILE_ADV_START(&pThis->StatReceive, a); 4662 rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);4716 int rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY); 4663 4717 AssertReleaseRC(rc); 4664 4718 … … 4677 4731 if (cb > 70) /* unqualified guess */ 4678 4732 pThis->Led.Asserted.s.fReading = pThis->Led.Actual.s.fReading = 1; 4679 pcnetReceiveNoSync(p This, (const uint8_t *)pvBuf, cb, fAddFCS, false);4733 pcnetReceiveNoSync(pDevIns, pThis, pThisCC, (const uint8_t *)pvBuf, cb, fAddFCS, false); 4680 4734 pThis->Led.Actual.s.fReading = 0; 4681 4735 } … … 4710 4764 static DECLCALLBACK(void) pcnetR3NetworkDown_XmitPending(PPDMINETWORKDOWN pInterface) 4711 4765 { 4712 PPCNETSTATE pThis = RT_FROM_MEMBER(pInterface, PCNETSTATE, INetworkDown); 4713 pcnetXmitPending(pThis, true /*fOnWorkerThread*/); 4766 PPCNETSTATECC pThisCC = RT_FROM_MEMBER(pInterface, PCNETSTATECC, INetworkDown); 4767 PPDMDEVINS pDevIns = pThisCC->pDevIns; 4768 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 4769 pcnetXmitPending(pDevIns, pThis, pThisCC, true /*fOnWorkerThread*/); 4714 4770 } 4715 4771 … … 4722 4778 static DECLCALLBACK(int) pcnetR3NetworkConfig_GetMac(PPDMINETWORKCONFIG pInterface, PRTMAC pMac) 4723 4779 { 4724 PPCNETSTATE pThis = RT_FROM_MEMBER(pInterface, PCNETSTATE, INetworkConfig); 4780 PPCNETSTATECC pThisCC = RT_FROM_MEMBER(pInterface, PCNETSTATECC, INetworkConfig); 4781 PPDMDEVINS pDevIns = pThisCC->pDevIns; 4782 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 4725 4783 memcpy(pMac, pThis->aPROM, sizeof(*pMac)); 4726 4784 return VINF_SUCCESS; … … 4733 4791 static DECLCALLBACK(PDMNETWORKLINKSTATE) pcnetR3NetworkConfig_GetLinkState(PPDMINETWORKCONFIG pInterface) 4734 4792 { 4735 PPCNETSTATE pThis = RT_FROM_MEMBER(pInterface, PCNETSTATE, INetworkConfig); 4793 PPCNETSTATECC pThisCC = RT_FROM_MEMBER(pInterface, PCNETSTATECC, INetworkConfig); 4794 PPDMDEVINS pDevIns = pThisCC->pDevIns; 4795 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 4736 4796 if (pThis->fLinkUp && !pThis->fLinkTempDown) 4737 4797 return PDMNETWORKLINKSTATE_UP; … … 4750 4810 static DECLCALLBACK(int) pcnetR3NetworkConfig_SetLinkState(PPDMINETWORKCONFIG pInterface, PDMNETWORKLINKSTATE enmState) 4751 4811 { 4752 PPCNETSTATE pThis = RT_FROM_MEMBER(pInterface, PCNETSTATE, INetworkConfig); 4753 PPDMDEVINS pDevIns = pThis->pDevInsR3; 4812 PPCNETSTATECC pThisCC = RT_FROM_MEMBER(pInterface, PCNETSTATECC, INetworkConfig); 4813 PPDMDEVINS pDevIns = pThisCC->pDevIns; 4814 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 4754 4815 bool fLinkUp; 4755 4816 … … 4790 4851 } 4791 4852 Assert(!PDMCritSectIsOwner(&pThis->CritSect)); 4792 if (pThis ->pDrvR3)4793 pThis ->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, enmState);4853 if (pThisCC->pDrv) 4854 pThisCC->pDrv->pfnNotifyLinkChanged(pThisCC->pDrv, enmState); 4794 4855 } 4795 4856 return VINF_SUCCESS; … … 4804 4865 static DECLCALLBACK(int) pcnetQueryStatusLed(PPDMILEDPORTS pInterface, unsigned iLUN, PPDMLED *ppLed) 4805 4866 { 4806 PPCNETSTATE pThis = RT_FROM_MEMBER(pInterface, PCNETSTATE, ILeds); 4867 PPCNETSTATECC pThisCC = RT_FROM_MEMBER(pInterface, PCNETSTATECC, ILeds); 4868 PPDMDEVINS pDevIns = pThisCC->pDevIns; 4869 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 4807 4870 if (iLUN == 0) 4808 4871 { … … 4821 4884 static DECLCALLBACK(void *) pcnetQueryInterface(struct PDMIBASE *pInterface, const char *pszIID) 4822 4885 { 4823 PPCNETSTATE pThis = RT_FROM_MEMBER(pInterface, PCNETSTATE, IBase);4824 Assert(&pThis ->IBase == pInterface);4825 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pThis ->IBase);4826 PDMIBASE_RETURN_INTERFACE(pszIID, PDMINETWORKDOWN, &pThis ->INetworkDown);4827 PDMIBASE_RETURN_INTERFACE(pszIID, PDMINETWORKCONFIG, &pThis ->INetworkConfig);4828 PDMIBASE_RETURN_INTERFACE(pszIID, PDMILEDPORTS, &pThis ->ILeds);4886 PPCNETSTATECC pThisCC = RT_FROM_MEMBER(pInterface, PCNETSTATECC, IBase); 4887 Assert(&pThisCC->IBase == pInterface); 4888 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pThisCC->IBase); 4889 PDMIBASE_RETURN_INTERFACE(pszIID, PDMINETWORKDOWN, &pThisCC->INetworkDown); 4890 PDMIBASE_RETURN_INTERFACE(pszIID, PDMINETWORKCONFIG, &pThisCC->INetworkConfig); 4891 PDMIBASE_RETURN_INTERFACE(pszIID, PDMILEDPORTS, &pThisCC->ILeds); 4829 4892 return NULL; 4830 4893 } … … 4850 4913 static DECLCALLBACK(void) pcnetR3Detach(PPDMDEVINS pDevIns, unsigned iLUN, uint32_t fFlags) 4851 4914 { 4915 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 4916 PPCNETSTATECC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PPCNETSTATECC); 4917 Log(("#%d pcnetR3Detach:\n", PCNET_INST_NR)); 4852 4918 RT_NOREF(fFlags); 4853 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE);4854 Log(("#%d pcnetR3Detach:\n", PCNET_INST_NR));4855 4919 4856 4920 AssertLogRelReturnVoid(iLUN == 0); … … 4865 4929 * Zero some important members. 4866 4930 */ 4867 pThis->pDrvBase = NULL; 4868 pThis->pDrvR3 = NULL; 4869 pThis->pDrvR0 = NIL_RTR0PTR; 4870 pThis->pDrvRC = NIL_RTRCPTR; 4931 pThis->fDriverAttached = false; 4932 pThisCC->pDrvBase = NULL; 4933 pThisCC->pDrv = NULL; 4934 /// @todo figure this out 4935 //pThis->pDrvR0 = NIL_RTR0PTR; 4936 //pThis->pDrvRC = NIL_RTRCPTR; 4871 4937 4872 4938 PDMCritSectLeave(&pThis->CritSect); … … 4880 4946 static DECLCALLBACK(int) pcnetR3Attach(PPDMDEVINS pDevIns, unsigned iLUN, uint32_t fFlags) 4881 4947 { 4948 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 4949 PPCNETSTATECC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PPCNETSTATECC); 4950 LogFlow(("#%d pcnetR3Attach:\n", PCNET_INST_NR)); 4882 4951 RT_NOREF(fFlags); 4883 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE);4884 LogFlow(("#%d pcnetR3Attach:\n", PCNET_INST_NR));4885 4952 4886 4953 AssertLogRelReturn(iLUN == 0, VERR_PDM_NO_SUCH_LUN); … … 4891 4958 * Attach the driver. 4892 4959 */ 4893 int rc = PDMDevHlpDriverAttach(pDevIns, 0, &pThis ->IBase, &pThis->pDrvBase, "Network Port");4960 int rc = PDMDevHlpDriverAttach(pDevIns, 0, &pThisCC->IBase, &pThisCC->pDrvBase, "Network Port"); 4894 4961 if (RT_SUCCESS(rc)) 4895 4962 { 4896 pThis ->pDrvR3 = PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMINETWORKUP);4897 AssertMsgStmt(pThis ->pDrvR3, ("Failed to obtain the PDMINETWORKUP interface!\n"),4963 pThisCC->pDrv = PDMIBASE_QUERY_INTERFACE(pThisCC->pDrvBase, PDMINETWORKUP); 4964 AssertMsgStmt(pThisCC->pDrv, ("Failed to obtain the PDMINETWORKUP interface!\n"), 4898 4965 rc = VERR_PDM_MISSING_INTERFACE_BELOW); 4899 pThis->pDrvR0 = PDMIBASER0_QUERY_INTERFACE(PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMIBASER0), PDMINETWORKUP); 4900 pThis->pDrvRC = PDMIBASERC_QUERY_INTERFACE(PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMIBASERC), PDMINETWORKUP); 4966 pThis->fDriverAttached = true; 4967 /// @todo figoure out this 4968 //pThis->pDrvR0 = PDMIBASER0_QUERY_INTERFACE(PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMIBASER0), PDMINETWORKUP); 4969 //pThis->pDrvRC = PDMIBASERC_QUERY_INTERFACE(PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMIBASERC), PDMINETWORKUP); 4901 4970 } 4902 4971 else if ( rc == VERR_PDM_NO_ATTACHED_DRIVER … … 4955 5024 static DECLCALLBACK(void) pcnetR3Relocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta) 4956 5025 { 4957 RT_NOREF(offDelta); 4958 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 4959 pThis->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns); 5026 PPCNETSTATERC pThisRC = PDMINS_2_DATA_RC(pDevIns, PPCNETSTATERC); 5027 pThisRC->pDrv += offDelta; 4960 5028 #ifdef PCNET_NO_POLLING 4961 pThis ->pfnEMInterpretInstructionRC += offDelta;5029 pThisRC->pfnEMInterpretInstructionRC += offDelta; 4962 5030 #endif 4963 5031 } … … 4991 5059 { 4992 5060 PDMDEV_CHECK_VERSIONS_RETURN(pDevIns); 4993 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 4994 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 5061 PPCNETSTATE pThis = PDMDEVINS_2_DATA(pDevIns, PPCNETSTATE); 5062 PPCNETSTATECC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PPCNETSTATECC); 5063 PCPDMDEVHLPR3 pHlp = pDevIns->pHlpR3; 4995 5064 PPDMIBASE pBase; 4996 5065 char szTmp[128]; … … 5004 5073 * Init what's required to make the destructor safe. 5005 5074 */ 5075 pThis->iInstance = iInstance; 5006 5076 pThis->hEventOutOfRxSpace = NIL_SUPSEMEVENT; 5007 5077 pThis->hIoPortsPci = NIL_IOMIOPORTHANDLE; … … 5009 5079 pThis->hIoPortsIsa = NIL_IOMIOPORTHANDLE; 5010 5080 pThis->hIoPortsIsaAProm = NIL_IOMIOPORTHANDLE; 5081 pThisCC->pDevIns = pDevIns; 5011 5082 5012 5083 /* … … 5096 5167 * Initialize data (most of it anyway). 5097 5168 */ 5098 pThis->pDevInsR3 = pDevIns; 5099 pThis->pDevInsR0 = PDMDEVINS_2_R0PTR(pDevIns); 5100 pThis->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns); 5101 pThis->Led.u32Magic = PDMLED_MAGIC; 5169 pThis->Led.u32Magic = PDMLED_MAGIC; 5102 5170 /* IBase */ 5103 pThis ->IBase.pfnQueryInterface= pcnetQueryInterface;5171 pThisCC->IBase.pfnQueryInterface = pcnetQueryInterface; 5104 5172 /* INeworkPort */ 5105 pThis ->INetworkDown.pfnWaitReceiveAvail= pcnetR3NetworkDown_WaitReceiveAvail;5106 pThis ->INetworkDown.pfnReceive= pcnetR3NetworkDown_Receive;5107 pThis ->INetworkDown.pfnXmitPending= pcnetR3NetworkDown_XmitPending;5173 pThisCC->INetworkDown.pfnWaitReceiveAvail = pcnetR3NetworkDown_WaitReceiveAvail; 5174 pThisCC->INetworkDown.pfnReceive = pcnetR3NetworkDown_Receive; 5175 pThisCC->INetworkDown.pfnXmitPending = pcnetR3NetworkDown_XmitPending; 5108 5176 /* INetworkConfig */ 5109 pThis ->INetworkConfig.pfnGetMac= pcnetR3NetworkConfig_GetMac;5110 pThis ->INetworkConfig.pfnGetLinkState= pcnetR3NetworkConfig_GetLinkState;5111 pThis ->INetworkConfig.pfnSetLinkState= pcnetR3NetworkConfig_SetLinkState;5177 pThisCC->INetworkConfig.pfnGetMac = pcnetR3NetworkConfig_GetMac; 5178 pThisCC->INetworkConfig.pfnGetLinkState = pcnetR3NetworkConfig_GetLinkState; 5179 pThisCC->INetworkConfig.pfnSetLinkState = pcnetR3NetworkConfig_SetLinkState; 5112 5180 /* ILeds */ 5113 pThis ->ILeds.pfnQueryStatusLed= pcnetQueryStatusLed;5181 pThisCC->ILeds.pfnQueryStatusLed = pcnetQueryStatusLed; 5114 5182 5115 5183 /* PCI Device */ … … 5256 5324 * Attach status driver (optional). 5257 5325 */ 5258 rc = PDMDevHlpDriverAttach(pDevIns, PDM_STATUS_LUN, &pThis ->IBase, &pBase, "Status Port");5326 rc = PDMDevHlpDriverAttach(pDevIns, PDM_STATUS_LUN, &pThisCC->IBase, &pBase, "Status Port"); 5259 5327 if (RT_SUCCESS(rc)) 5260 pThis ->pLedsConnector = PDMIBASE_QUERY_INTERFACE(pBase, PDMILEDCONNECTORS);5328 pThisCC->pLedsConnector = PDMIBASE_QUERY_INTERFACE(pBase, PDMILEDCONNECTORS); 5261 5329 else 5262 5330 AssertMsgReturn( rc == VERR_PDM_NO_ATTACHED_DRIVER … … 5268 5336 * Attach driver. 5269 5337 */ 5270 rc = PDMDevHlpDriverAttach(pDevIns, 0, &pThis ->IBase, &pThis->pDrvBase, "Network Port");5338 rc = PDMDevHlpDriverAttach(pDevIns, 0, &pThisCC->IBase, &pThisCC->pDrvBase, "Network Port"); 5271 5339 if (RT_SUCCESS(rc)) 5272 5340 { 5273 pThis ->pDrvR3 = PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMINETWORKUP);5274 AssertMsgReturn(pThis ->pDrvR3, ("Failed to obtain the PDMINETWORKUP interface!\n"),5341 pThisCC->pDrv = PDMIBASE_QUERY_INTERFACE(pThisCC->pDrvBase, PDMINETWORKUP); 5342 AssertMsgReturn(pThisCC->pDrv, ("Failed to obtain the PDMINETWORKUP interface!\n"), 5275 5343 VERR_PDM_MISSING_INTERFACE_BELOW); 5276 pThis->pDrvR0 = PDMIBASER0_QUERY_INTERFACE(PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMIBASER0), PDMINETWORKUP); 5277 pThis->pDrvRC = PDMIBASERC_QUERY_INTERFACE(PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMIBASERC), PDMINETWORKUP); 5344 pThis->fDriverAttached = true; 5345 /// @todo figure out this! 5346 //pThis->pDrvR0 = PDMIBASER0_QUERY_INTERFACE(PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMIBASER0), PDMINETWORKUP); 5347 //pThis->pDrvRC = PDMIBASERC_QUERY_INTERFACE(PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMIBASERC), PDMINETWORKUP); 5278 5348 } 5279 5349 else if ( rc == VERR_PDM_NO_ATTACHED_DRIVER … … 5429 5499 /* .szName = */ "pcnet", 5430 5500 #ifdef PCNET_GC_ENABLED 5431 /* .fFlags = */ PDM_DEVREG_FLAGS_DEFAULT_BITS | PDM_DEVREG_FLAGS_RZ ,5501 /* .fFlags = */ PDM_DEVREG_FLAGS_DEFAULT_BITS | PDM_DEVREG_FLAGS_RZ | PDM_DEVREG_FLAGS_NEW_STYLE, 5432 5502 #else 5433 5503 /* .fFlags = */ PDM_DEVREG_FLAGS_DEFAULT_BITS, … … 5437 5507 /* .uSharedVersion = */ 42, 5438 5508 /* .cbInstanceShared = */ sizeof(PCNETSTATE), 5439 /* .cbInstanceCC = */ 0,5440 /* .cbInstanceRC = */ 0,5509 /* .cbInstanceCC = */ sizeof(PCNETSTATECC), 5510 /* .cbInstanceRC = */ sizeof(PCNETSTATERC), 5441 5511 /* .cMaxPciDevices = */ 1, 5442 5512 /* .cMaxMsixVectors = */ 0,
Note:
See TracChangeset
for help on using the changeset viewer.