Changeset 1681 in vbox for trunk/src/VBox/Devices/VMMDev
- Timestamp:
- Mar 23, 2007 2:45:10 PM (18 years ago)
- svn:sync-xref-src-repo-rev:
- 19817
- Location:
- trunk/src/VBox/Devices/VMMDev
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/VMMDev/VBoxDev.cpp
r1624 r1681 22 22 23 23 /* #define LOG_ENABLED */ 24 25 #define TIMESYNC_BACKDOOR26 24 27 25 #include <stdio.h> … … 904 902 Log(("VMMDevReq_HGCMConnect\n")); 905 903 906 requestHeader->rc = vmmdevHGCMConnect (pData, pHGCMConnect );904 requestHeader->rc = vmmdevHGCMConnect (pData, pHGCMConnect, (RTGCPHYS)u32); 907 905 } 908 906 break; … … 926 924 927 925 Log(("VMMDevReq_VMMDevHGCMDisconnect\n")); 928 requestHeader->rc = vmmdevHGCMDisconnect (pData, pHGCMDisconnect );926 requestHeader->rc = vmmdevHGCMDisconnect (pData, pHGCMDisconnect, (RTGCPHYS)u32); 929 927 } 930 928 break; … … 951 949 Log(("%.*Vhxd\n", requestHeader->size, requestHeader)); 952 950 953 requestHeader->rc = vmmdevHGCMCall (pData, pHGCMCall );951 requestHeader->rc = vmmdevHGCMCall (pData, pHGCMCall, (RTGCPHYS)u32); 954 952 } 955 953 break; … … 1473 1471 1474 1472 1475 #define VMMDEV_SSM_VERSION 21473 #define VMMDEV_SSM_VERSION 3 1476 1474 1477 1475 /** … … 1492 1490 SSMR3PutBool(pSSMHandle, pData->fNewGuestFilterMask); 1493 1491 SSMR3PutU32(pSSMHandle, pData->u32NewGuestFilterMask); 1492 SSMR3PutU32(pSSMHandle, pData->u32GuestFilterMask); 1494 1493 SSMR3PutU32(pSSMHandle, pData->u32HostEventFlags); 1495 1494 // here be dragons (probably) … … 1500 1499 SSMR3PutU32(pSSMHandle, pData->fu32AdditionsOk); 1501 1500 SSMR3PutU32(pSSMHandle, pData->u32VideoAccelEnabled); 1501 1502 #ifdef VBOX_HGCM 1503 vmmdevHGCMSaveState (pData, pSSMHandle); 1504 #endif /* VBOX_HGCM */ 1505 1502 1506 return VINF_SUCCESS; 1503 1507 } … … 1523 1527 SSMR3GetBool(pSSMHandle, &pData->fNewGuestFilterMask); 1524 1528 SSMR3GetU32(pSSMHandle, &pData->u32NewGuestFilterMask); 1529 SSMR3GetU32(pSSMHandle, &pData->u32GuestFilterMask); 1525 1530 SSMR3GetU32(pSSMHandle, &pData->u32HostEventFlags); 1526 1531 // SSMR3GetBool(pSSMHandle, &pData->pVMMDevRAMHC->fHaveEvents); … … 1531 1536 SSMR3GetU32(pSSMHandle, &pData->fu32AdditionsOk); 1532 1537 SSMR3GetU32(pSSMHandle, &pData->u32VideoAccelEnabled); 1538 1539 #ifdef VBOX_HGCM 1540 vmmdevHGCMLoadState (pData, pSSMHandle); 1541 #endif /* VBOX_HGCM */ 1533 1542 1534 1543 /* … … 1558 1567 { 1559 1568 VMMDevState *pData = PDMINS2DATA(pDevIns, VMMDevState*); 1569 1570 #ifdef VBOX_HGCM 1571 vmmdevHGCMLoadStateDone (pData, pSSMHandle); 1572 #endif /* VBOX_HGCM */ 1560 1573 1561 1574 VMMDevNotifyGuest (pData, VMMDEV_EVENT_RESTORED); … … 1718 1731 AssertMsgFailed(("VMMDev SUPPageAlloc(%#x,) -> %d\n", VMMDEV_RAM_SIZE, rc)); 1719 1732 } 1733 1734 #ifdef VBOX_HGCM 1735 rc = RTCritSectInit(&pData->critsectHGCMCmdList); 1736 AssertRC(rc); 1737 #endif /* VBOX_HGCM */ 1720 1738 1721 1739 /* initialize the VMMDev memory */ -
trunk/src/VBox/Devices/VMMDev/VMMDevHGCM.cpp
r1562 r1681 57 57 struct VBOXHGCMCMD 58 58 { 59 /* Active commands, list is protected by critsectHGCMCmdList. */ 60 struct VBOXHGCMCMD *pNext; 61 struct VBOXHGCMCMD *pPrev; 62 63 /* GC ptr of the command header. */ 64 RTGCPHYS GCPtr; 65 59 66 /* Pointer to guest request. */ 60 67 VMMDevHGCMRequestHeader *pHeader; … … 62 69 /* Pointer to converted host parameters in case of a Call request. */ 63 70 VBOXHGCMSVCPARM *paHostParms; 64 71 65 72 /* Linear pointer parameters information. */ 66 73 int cLinPtrs; 67 74 68 75 /* Pointer to descriptions of linear pointers. */ 69 76 VBOXHGCMLINPTR *paLinPtrs; 70 77 }; 78 79 static int vmmdevHGCMCmdListLock (VMMDevState *pVMMDevState) 80 { 81 int rc = RTCritSectEnter (&pVMMDevState->critsectHGCMCmdList); 82 AssertRC (rc); 83 return rc; 84 } 85 86 static void vmmdevHGCMCmdListUnlock (VMMDevState *pVMMDevState) 87 { 88 int rc = RTCritSectLeave (&pVMMDevState->critsectHGCMCmdList); 89 AssertRC (rc); 90 } 91 92 static int vmmdevHGCMAddCommand (VMMDevState *pVMMDevState, PVBOXHGCMCMD pCmd, RTGCPHYS GCPtr) 93 { 94 PPDMDEVINS pDevIns = pVMMDevState->pDevIns; 95 96 int rc = vmmdevHGCMCmdListLock (pVMMDevState); 97 98 if (VBOX_SUCCESS (rc)) 99 { 100 LogFlowFunc(("%p\n", pCmd)); 101 102 /* Insert at the head of the list. The vmmdevHGCMLoadStateDone depends on this. */ 103 pCmd->pNext = pVMMDevState->pHGCMCmdList; 104 pCmd->pPrev = NULL; 105 106 if (pVMMDevState->pHGCMCmdList) 107 { 108 pVMMDevState->pHGCMCmdList->pPrev = pCmd; 109 } 110 111 pVMMDevState->pHGCMCmdList = pCmd; 112 113 pCmd->GCPtr = GCPtr; 114 115 vmmdevHGCMCmdListUnlock (pVMMDevState); 116 } 117 118 return rc; 119 } 120 121 static int vmmdevHGCMRemoveCommand (VMMDevState *pVMMDevState, PVBOXHGCMCMD pCmd) 122 { 123 PPDMDEVINS pDevIns = pVMMDevState->pDevIns; 124 125 int rc = vmmdevHGCMCmdListLock (pVMMDevState); 126 127 if (VBOX_SUCCESS (rc)) 128 { 129 LogFlowFunc(("%p\n", pCmd)); 130 131 if (pCmd->pNext) 132 { 133 pCmd->pNext->pPrev = pCmd->pPrev; 134 } 135 else 136 { 137 /* Tail, do nothing. */ 138 } 139 140 if (pCmd->pPrev) 141 { 142 pCmd->pPrev->pNext = pCmd->pNext; 143 } 144 else 145 { 146 pVMMDevState->pHGCMCmdList = pCmd->pNext; 147 } 148 149 vmmdevHGCMCmdListUnlock (pVMMDevState); 150 } 151 152 return rc; 153 } 71 154 72 155 static int vmmdevHGCMSaveLinPtr (PPDMDEVINS pDevIns, … … 183 266 } 184 267 185 int vmmdevHGCMConnect (VMMDevState *pVMMDevState, VMMDevHGCMConnect *pHGCMConnect )268 int vmmdevHGCMConnect (VMMDevState *pVMMDevState, VMMDevHGCMConnect *pHGCMConnect, RTGCPHYS GCPtr) 186 269 { 187 270 int rc = VINF_SUCCESS; 188 271 189 PVBOXHGCMCMD pCmd = (PVBOXHGCMCMD)RTMemAlloc (sizeof (struct VBOXHGCMCMD));272 PVBOXHGCMCMD pCmd = (PVBOXHGCMCMD)RTMemAllocZ (sizeof (struct VBOXHGCMCMD)); 190 273 191 274 if (pCmd) 192 275 { 276 vmmdevHGCMAddCommand (pVMMDevState, pCmd, GCPtr); 277 193 278 pCmd->pHeader = &pHGCMConnect->header; 194 279 pCmd->paHostParms = NULL; … … 210 295 } 211 296 212 int vmmdevHGCMDisconnect (VMMDevState *pVMMDevState, VMMDevHGCMDisconnect *pHGCMDisconnect )297 int vmmdevHGCMDisconnect (VMMDevState *pVMMDevState, VMMDevHGCMDisconnect *pHGCMDisconnect, RTGCPHYS GCPtr) 213 298 { 214 299 int rc = VINF_SUCCESS; 215 300 216 PVBOXHGCMCMD pCmd = (PVBOXHGCMCMD)RTMemAlloc (sizeof (struct VBOXHGCMCMD));301 PVBOXHGCMCMD pCmd = (PVBOXHGCMCMD)RTMemAllocZ (sizeof (struct VBOXHGCMCMD)); 217 302 218 303 if (pCmd) 219 304 { 305 vmmdevHGCMAddCommand (pVMMDevState, pCmd, GCPtr); 306 220 307 pCmd->pHeader = &pHGCMDisconnect->header; 221 308 pCmd->paHostParms = NULL; … … 234 321 235 322 236 int vmmdevHGCMCall (VMMDevState *pVMMDevState, VMMDevHGCMCall *pHGCMCall )323 int vmmdevHGCMCall (VMMDevState *pVMMDevState, VMMDevHGCMCall *pHGCMCall, RTGCPHYS GCPtr) 237 324 { 238 325 int rc = VINF_SUCCESS; … … 271 358 case VMMDevHGCMParmType_LinAddr_Out: /* Out (write) */ 272 359 case VMMDevHGCMParmType_LinAddr: /* In & Out */ 273 #if 0274 case VMMDevHGCMParmType_Virt16Addr:275 case VMMDevHGCMParmType_VirtAddr:276 #endif277 360 { 278 361 cbCmdSize += pGuestParm->u.Pointer.size; … … 313 396 } 314 397 398 memset (pCmd, 0, sizeof (*pCmd)); 399 315 400 pCmd->pHeader = &pHGCMCall->header; 316 401 pCmd->paHostParms = NULL; … … 446 531 if (VBOX_SUCCESS (rc)) 447 532 { 533 vmmdevHGCMAddCommand (pVMMDevState, pCmd, GCPtr); 534 448 535 /* Pass the function call to HGCM connector for actual processing */ 449 536 rc = pVMMDevState->pHGCMDrv->pfnCall (pVMMDevState->pHGCMDrv, pCmd, pHGCMCall->u32ClientID, pHGCMCall->u32Function, cParms, pCmd->paHostParms); … … 472 559 VMMDevState *pVMMDevState = PDMIHGCMPORT_2_VMMDEVSTATE(pInterface); 473 560 474 /* Setup return codes. */475 pHeader->result = result;476 477 /* Update parameters and data buffers. */478 479 if (pHeader->header.requestType == VMMDevReq_HGCMCall)480 { 481 VMMDevHGCMCall *pHGCMCall = (VMMDevHGCMCall *)pHeader;482 483 uint32_t cParms = pHGCMCall->cParms;484 485 HGCMFunctionParameter *pGuestParm = VMMDEV_HGCM_CALL_PARMS(pHGCMCall);486 487 VBOXHGCMSVCPARM *pHostParm = pCmd->paHostParms;488 489 uint32_t i;490 uint32_t iLinPtr = 0; 491 492 for (i = 0; i < cParms; i++, pGuestParm++, pHostParm++)493 { 494 switch (pGuestParm->type)561 if (result != VINF_HGCM_SAVE_STATE) 562 { 563 /* Setup return codes. */ 564 pHeader->result = result; 565 566 /* Update parameters and data buffers. */ 567 568 if (pHeader->header.requestType == VMMDevReq_HGCMCall) 569 { 570 VMMDevHGCMCall *pHGCMCall = (VMMDevHGCMCall *)pHeader; 571 572 uint32_t cParms = pHGCMCall->cParms; 573 574 HGCMFunctionParameter *pGuestParm = VMMDEV_HGCM_CALL_PARMS(pHGCMCall); 575 576 VBOXHGCMSVCPARM *pHostParm = pCmd->paHostParms; 577 578 uint32_t i; 579 uint32_t iLinPtr = 0; 580 581 for (i = 0; i < cParms; i++, pGuestParm++, pHostParm++) 495 582 { 496 case VMMDevHGCMParmType_32bit:583 switch (pGuestParm->type) 497 584 { 498 pGuestParm->u.value32 = pHostParm->u.uint32; 499 } break; 500 501 case VMMDevHGCMParmType_64bit: 502 { 503 pGuestParm->u.value64 = pHostParm->u.uint64; 504 } break; 505 506 case VMMDevHGCMParmType_PhysAddr: 507 { 508 /* do nothing */ 509 } break; 510 511 case VMMDevHGCMParmType_LinAddr_In: /* In (read) */ 512 case VMMDevHGCMParmType_LinAddr_Out: /* Out (write) */ 513 case VMMDevHGCMParmType_LinAddr: /* In & Out */ 514 { 515 /* Copy buffer back to guest memory. */ 516 uint32_t size = pGuestParm->u.Pointer.size; 517 518 if (size > 0 && pGuestParm->type != VMMDevHGCMParmType_LinAddr_In) 585 case VMMDevHGCMParmType_32bit: 519 586 { 520 /* Use the saved page list. */ 521 rc = vmmdevHGCMWriteLinPtr (pVMMDevState->pDevIns, i, pHostParm->u.pointer.addr, size, iLinPtr++, pCmd->paLinPtrs); 522 523 // RTGCPTR linearAddr = pGuestParm->u.Pointer.u.linearAddr; 524 // 525 // rc = pVMMDevState->pDevIns->pDevHlp->pfnPhysWriteGCVirt (pVMMDevState->pDevIns, 526 // linearAddr, 527 // pHostParm->u.pointer.addr, 528 // size); 529 AssertReleaseRC(rc); 587 pGuestParm->u.value32 = pHostParm->u.uint32; 588 } break; 589 590 case VMMDevHGCMParmType_64bit: 591 { 592 pGuestParm->u.value64 = pHostParm->u.uint64; 593 } break; 594 595 case VMMDevHGCMParmType_PhysAddr: 596 { 597 /* do nothing */ 598 } break; 599 600 case VMMDevHGCMParmType_LinAddr_In: /* In (read) */ 601 case VMMDevHGCMParmType_LinAddr_Out: /* Out (write) */ 602 case VMMDevHGCMParmType_LinAddr: /* In & Out */ 603 { 604 /* Copy buffer back to guest memory. */ 605 uint32_t size = pGuestParm->u.Pointer.size; 606 607 if (size > 0 && pGuestParm->type != VMMDevHGCMParmType_LinAddr_In) 608 { 609 /* Use the saved page list. */ 610 rc = vmmdevHGCMWriteLinPtr (pVMMDevState->pDevIns, i, pHostParm->u.pointer.addr, size, iLinPtr++, pCmd->paLinPtrs); 611 AssertReleaseRC(rc); 612 } 613 } break; 614 615 default: 616 { 617 /* This indicates that the guest request memory was corrupted. */ 618 AssertReleaseMsgFailed(("hgcmCompleted: invalid parameter type %08X\n", pGuestParm->type)); 530 619 } 531 } break;532 533 default:534 {535 /* This indicates that the guest request memory was corrupted. */536 AssertReleaseMsgFailed(("hgcmCompleted: invalid parameter type %08X\n", pGuestParm->type));537 620 } 538 621 } 539 622 } 540 } 541 542 /* Mark request as processed*/ 543 pHeader->fu32Flags |= VBOX_HGCM_REQ_DONE; 544 545 VMMDevNotifyGuest (pVMMDevState, VMMDEV_EVENT_HGCM); 546 547 if (pCmd->paLinPtrs) 548 { 549 RTMemFree (pCmd->paLinPtrs); 550 } 551 552 RTMemFree (pCmd); 623 624 /* Mark request as processed*/ 625 pHeader->fu32Flags |= VBOX_HGCM_REQ_DONE; 626 627 VMMDevNotifyGuest (pVMMDevState, VMMDEV_EVENT_HGCM); 628 629 /* It it assumed that VMMDev saves state after the HGCM services. */ 630 vmmdevHGCMRemoveCommand (pVMMDevState, pCmd); 631 632 if (pCmd->paLinPtrs) 633 { 634 RTMemFree (pCmd->paLinPtrs); 635 } 636 637 RTMemFree (pCmd); 638 } 553 639 554 640 return; 555 641 } 642 643 /* @thread EMT */ 644 int vmmdevHGCMSaveState(VMMDevState *pVMMDevState, PSSMHANDLE pSSM) 645 { 646 /* Save information about pending requests. 647 * Only GCPtrs are of interest. 648 */ 649 int rc = VINF_SUCCESS; 650 651 LogFlowFunc(("\n")); 652 653 /* Compute how many commands are pending. */ 654 uint32_t cCmds = 0; 655 656 PVBOXHGCMCMD pIter = pVMMDevState->pHGCMCmdList; 657 658 while (pIter) 659 { 660 LogFlowFunc (("pIter %p\n", pIter)); 661 cCmds++; 662 pIter = pIter->pNext; 663 } 664 665 LogFlowFunc(("cCmds = %d\n", cCmds)); 666 667 /* Save number of commands. */ 668 rc = SSMR3PutU32(pSSM, cCmds); 669 AssertRCReturn(rc, rc); 670 671 if (cCmds > 0) 672 { 673 pIter = pVMMDevState->pHGCMCmdList; 674 675 while (pIter) 676 { 677 PVBOXHGCMCMD pNext = pIter->pNext; 678 679 LogFlowFunc (("Saving %VGp\n", pIter->GCPtr)); 680 rc = SSMR3PutGCPtr(pSSM, pIter->GCPtr); 681 AssertRCReturn(rc, rc); 682 683 vmmdevHGCMRemoveCommand (pVMMDevState, pIter); 684 685 pIter = pNext; 686 } 687 } 688 689 return rc; 690 } 691 692 /* @thread EMT */ 693 int vmmdevHGCMLoadState(VMMDevState *pVMMDevState, PSSMHANDLE pSSM) 694 { 695 int rc = VINF_SUCCESS; 696 697 LogFlowFunc(("\n")); 698 699 /* Read how many commands were pending. */ 700 uint32_t cCmds = 0; 701 rc = SSMR3GetU32(pSSM, &cCmds); 702 AssertRCReturn(rc, rc); 703 704 LogFlowFunc(("cCmds = %d\n", cCmds)); 705 706 while (cCmds--) 707 { 708 RTGCPHYS GCPtr; 709 rc = SSMR3GetGCPtr(pSSM, &GCPtr); 710 AssertRCReturn(rc, rc); 711 712 LogFlowFunc (("Restoring %VGp\n", GCPtr)); 713 714 PVBOXHGCMCMD pCmd = (PVBOXHGCMCMD)RTMemAllocZ (sizeof (struct VBOXHGCMCMD)); 715 AssertReturn(pCmd, VERR_NO_MEMORY); 716 717 vmmdevHGCMAddCommand (pVMMDevState, pCmd, GCPtr); 718 } 719 720 return rc; 721 } 722 723 /* @thread EMT */ 724 int vmmdevHGCMLoadStateDone(VMMDevState *pVMMDevState, PSSMHANDLE pSSM) 725 { 726 LogFlowFunc(("\n")); 727 728 /* Reissue pending requests. */ 729 PPDMDEVINS pDevIns = pVMMDevState->pDevIns; 730 731 int rc = vmmdevHGCMCmdListLock (pVMMDevState); 732 733 if (VBOX_SUCCESS (rc)) 734 { 735 PVBOXHGCMCMD pIter = pVMMDevState->pHGCMCmdList; 736 737 while (pIter) 738 { 739 LogFlowFunc (("pIter %p\n", pIter)); 740 741 PVBOXHGCMCMD pNext = pIter->pNext; 742 743 VMMDevRequestHeader *requestHeader = NULL; 744 rc = PDMDevHlpPhys2HCVirt(pDevIns, pIter->GCPtr, 0, (PRTHCPTR)&requestHeader); 745 746 if (VBOX_FAILURE(rc) || !requestHeader) 747 { 748 AssertMsgFailed(("VMMDev::LoadStateDone: could not convert guest physical address to host virtual!!! rc = %Vrc\n", rc)); 749 } 750 else 751 { 752 /* the structure size must be greater or equal to the header size */ 753 if (requestHeader->size < sizeof(VMMDevRequestHeader)) 754 { 755 Log(("VMMDev request header size too small! size = %d\n", requestHeader->size)); 756 } 757 else 758 { 759 /* check the version of the header structure */ 760 if (requestHeader->version != VMMDEV_REQUEST_HEADER_VERSION) 761 { 762 Log(("VMMDev: guest header version (0x%08X) differs from ours (0x%08X)\n", requestHeader->version, VMMDEV_REQUEST_HEADER_VERSION)); 763 } 764 else 765 { 766 Log(("VMMDev request issued: %d\n", requestHeader->requestType)); 767 768 switch (requestHeader->requestType) 769 { 770 case VMMDevReq_HGCMConnect: 771 { 772 if (requestHeader->size < sizeof(VMMDevHGCMConnect)) 773 { 774 AssertMsgFailed(("VMMDevReq_HGCMConnect structure has invalid size!\n")); 775 requestHeader->rc = VERR_INVALID_PARAMETER; 776 } 777 else if (!pVMMDevState->pHGCMDrv) 778 { 779 Log(("VMMDevReq_HGCMConnect HGCM Connector is NULL!\n")); 780 requestHeader->rc = VERR_NOT_SUPPORTED; 781 } 782 else 783 { 784 VMMDevHGCMConnect *pHGCMConnect = (VMMDevHGCMConnect *)requestHeader; 785 786 Log(("VMMDevReq_HGCMConnect\n")); 787 788 requestHeader->rc = vmmdevHGCMConnect (pVMMDevState, pHGCMConnect, pIter->GCPtr); 789 } 790 break; 791 } 792 793 case VMMDevReq_HGCMDisconnect: 794 { 795 if (requestHeader->size < sizeof(VMMDevHGCMDisconnect)) 796 { 797 AssertMsgFailed(("VMMDevReq_HGCMDisconnect structure has invalid size!\n")); 798 requestHeader->rc = VERR_INVALID_PARAMETER; 799 } 800 else if (!pVMMDevState->pHGCMDrv) 801 { 802 Log(("VMMDevReq_HGCMDisconnect HGCM Connector is NULL!\n")); 803 requestHeader->rc = VERR_NOT_SUPPORTED; 804 } 805 else 806 { 807 VMMDevHGCMDisconnect *pHGCMDisconnect = (VMMDevHGCMDisconnect *)requestHeader; 808 809 Log(("VMMDevReq_VMMDevHGCMDisconnect\n")); 810 requestHeader->rc = vmmdevHGCMDisconnect (pVMMDevState, pHGCMDisconnect, pIter->GCPtr); 811 } 812 break; 813 } 814 815 case VMMDevReq_HGCMCall: 816 { 817 if (requestHeader->size < sizeof(VMMDevHGCMCall)) 818 { 819 AssertMsgFailed(("VMMDevReq_HGCMCall structure has invalid size!\n")); 820 requestHeader->rc = VERR_INVALID_PARAMETER; 821 } 822 else if (!pVMMDevState->pHGCMDrv) 823 { 824 Log(("VMMDevReq_HGCMCall HGCM Connector is NULL!\n")); 825 requestHeader->rc = VERR_NOT_SUPPORTED; 826 } 827 else 828 { 829 VMMDevHGCMCall *pHGCMCall = (VMMDevHGCMCall *)requestHeader; 830 831 Log(("VMMDevReq_HGCMCall: sizeof (VMMDevHGCMRequest) = %04X\n", sizeof (VMMDevHGCMCall))); 832 833 Log(("%.*Vhxd\n", requestHeader->size, requestHeader)); 834 835 requestHeader->rc = vmmdevHGCMCall (pVMMDevState, pHGCMCall, pIter->GCPtr); 836 } 837 break; 838 } 839 default: 840 AssertReleaseFailed(); 841 } 842 } 843 } 844 } 845 846 vmmdevHGCMRemoveCommand (pVMMDevState, pIter); 847 pIter = pNext; 848 } 849 850 vmmdevHGCMCmdListUnlock (pVMMDevState); 851 } 852 853 return rc; 854 } -
trunk/src/VBox/Devices/VMMDev/VMMDevHGCM.h
r1 r1681 32 32 33 33 __BEGIN_DECLS 34 DECLCALLBACK(int) vmmdevHGCMConnect (VMMDevState *pVMMDevState, VMMDevHGCMConnect *pHGCMConnect );35 DECLCALLBACK(int) vmmdevHGCMDisconnect (VMMDevState *pVMMDevState, VMMDevHGCMDisconnect *pHGCMDisconnect );36 DECLCALLBACK(int) vmmdevHGCMCall (VMMDevState *pVMMDevState, VMMDevHGCMCall *pHGCMCall );34 DECLCALLBACK(int) vmmdevHGCMConnect (VMMDevState *pVMMDevState, VMMDevHGCMConnect *pHGCMConnect, RTGCPHYS GCPtr); 35 DECLCALLBACK(int) vmmdevHGCMDisconnect (VMMDevState *pVMMDevState, VMMDevHGCMDisconnect *pHGCMDisconnect, RTGCPHYS GCPtr); 36 DECLCALLBACK(int) vmmdevHGCMCall (VMMDevState *pVMMDevState, VMMDevHGCMCall *pHGCMCall, RTGCPHYS GCPtr); 37 37 38 38 DECLCALLBACK(void) hgcmCompleted (PPDMIHGCMPORT pInterface, int32_t result, PVBOXHGCMCMD pCmdPtr); 39 40 int vmmdevHGCMSaveState(VMMDevState *pVMMDevState, PSSMHANDLE pSSM); 41 int vmmdevHGCMLoadState(VMMDevState *pVMMDevState, PSSMHANDLE pSSM); 42 int vmmdevHGCMLoadStateDone(VMMDevState *pVMMDevState, PSSMHANDLE pSSM); 39 43 __END_DECLS 40 44 -
trunk/src/VBox/Devices/VMMDev/VMMDevState.h
r1624 r1681 28 28 29 29 #include <VBox/pdm.h> 30 31 #define TIMESYNC_BACKDOOR 30 32 31 33 /** device structure containing all state information */ … … 137 139 bool fBackdoorLogDisabled; 138 140 141 #ifdef VBOX_HGCM 142 /** List of pending HGCM requests, used for saving the HGCM state. */ 143 PVBOXHGCMCMD pHGCMCmdList; 144 /** Critical section to protect the list. */ 145 RTCRITSECT critsectHGCMCmdList; 146 #endif /* VBOX_HGCM */ 147 139 148 } VMMDevState; 140 149
Note:
See TracChangeset
for help on using the changeset viewer.