Changeset 1681 in vbox
- Timestamp:
- Mar 23, 2007 2:45:10 PM (18 years ago)
- svn:sync-xref-src-repo-rev:
- 19817
- Location:
- trunk/src/VBox
- Files:
-
- 14 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 -
trunk/src/VBox/Main/ConsoleImpl.cpp
r1596 r1681 2005 2005 2006 2006 /// @todo (r=sander?) should move this into the shared folder class */ 2007 if (mpVM && mVMMDev-> getShFlClientId())2007 if (mpVM && mVMMDev->isShFlActive()) 2008 2008 { 2009 2009 /* … … 2080 2080 CheckComRCReturnRC (autoVMCaller.rc()); 2081 2081 2082 if (mpVM && mVMMDev-> getShFlClientId())2082 if (mpVM && mVMMDev->isShFlActive()) 2083 2083 { 2084 2084 /* … … 6444 6444 } 6445 6445 6446 if (console->getVMMDev()-> getShFlClientId())6446 if (console->getVMMDev()->isShFlActive()) 6447 6447 { 6448 6448 /// @todo (dmik) -
trunk/src/VBox/Main/Makefile
r1565 r1681 21 21 DEPTH = ../../.. 22 22 include $(PATH_KBUILD)/header.kmk 23 24 DEFS += HGCMSS 23 25 24 26 ifdef VRDP_MC -
trunk/src/VBox/Main/VMMDevInterface.cpp
r1386 r1681 298 298 static DECLCALLBACK(int) iface_hgcmConnect (PPDMIHGCMCONNECTOR pInterface, PVBOXHGCMCMD pCmd, PHGCMSERVICELOCATION pServiceLocation, uint32_t *pu32ClientID) 299 299 { 300 LogFlowFunc(("Enter\n")); 301 300 302 PDRVMAINVMMDEV pDrv = PDMIHGCMCONNECTOR_2_MAINVMMDEV(pInterface); 301 303 … … 305 307 static DECLCALLBACK(int) iface_hgcmDisconnect (PPDMIHGCMCONNECTOR pInterface, PVBOXHGCMCMD pCmd, uint32_t u32ClientID) 306 308 { 309 LogFlowFunc(("Enter\n")); 310 307 311 PDRVMAINVMMDEV pDrv = PDMIHGCMCONNECTOR_2_MAINVMMDEV(pInterface); 308 312 … … 313 317 uint32_t cParms, PVBOXHGCMSVCPARM paParms) 314 318 { 319 LogFlowFunc(("Enter\n")); 320 315 321 PDRVMAINVMMDEV pDrv = PDMIHGCMCONNECTOR_2_MAINVMMDEV(pInterface); 316 322 … … 327 333 static DECLCALLBACK(int) iface_hgcmSave(PPDMDRVINS pDrvIns, PSSMHANDLE pSSM) 328 334 { 335 LogFlowFunc(("Enter\n")); 336 337 #ifdef HGCMSS 338 return hgcmSaveStateInternal (pSSM); 339 #else 329 340 PDRVMAINVMMDEV pDrv = PDMINS2DATA(pDrvIns, PDRVMAINVMMDEV); 330 341 … … 334 345 335 346 return hgcmSaveStateInternal (pDrv->pVMMDev->mSharedFolderClientId, pSSM); 347 #endif /* HGCMSS */ 336 348 } 337 349 … … 347 359 static DECLCALLBACK(int) iface_hgcmLoad(PPDMDRVINS pDrvIns, PSSMHANDLE pSSM, uint32_t u32Version) 348 360 { 361 LogFlowFunc(("Enter\n")); 362 363 #ifdef HGCMSS 364 if (u32Version != HGCM_SSM_VERSION) 365 return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION; 366 367 return hgcmLoadStateInternal (pSSM); 368 #else 349 369 PDRVMAINVMMDEV pDrv = PDMINS2DATA(pDrvIns, PDRVMAINVMMDEV); 350 370 uint32_t u32HandleCount; … … 385 405 386 406 return hgcmLoadStateInternal (pDrv->pVMMDev->mSharedFolderClientId, pSSM); 407 #endif /* HGCMSS */ 387 408 } 388 409 … … 450 471 LogFlow(("VMMDev::drvDestruct: iInstance=%d\n", pDrvIns->iInstance)); 451 472 #ifdef VBOX_HGCM 473 #ifndef HGCMSS 452 474 /* Unload Shared Folder HGCM service */ 453 475 if (pData->pVMMDev->mSharedFolderClientId) … … 458 480 pData->pVMMDev->hgcmDisconnect(cmd, pData->pVMMDev->getShFlClientId()); 459 481 } 482 #endif /* !HGCMSS */ 460 483 461 484 hgcmReset (); … … 478 501 LogFlow(("VMMDev::drvReset: iInstance=%d\n", pDrvIns->iInstance)); 479 502 #ifdef VBOX_HGCM 503 #ifndef HGCMSS 480 504 /* Unload Shared Folder HGCM service */ 481 505 uint64_t dummy = 0; … … 486 510 pData->pVMMDev->hgcmDisconnect(cmd, pData->pVMMDev->getShFlClientId()); 487 511 } 512 #endif /* !HGCMSS */ 488 513 489 514 hgcmReset (); 490 515 516 #ifndef HGCMSS 491 517 if (pData->pVMMDev->mSharedFolderClientId) 492 518 { … … 506 532 } 507 533 } 534 #endif /* !HGCMSS */ 508 535 #endif 509 536 } … … 592 619 #ifdef VBOX_HGCM 593 620 621 #ifdef HGCMSS 622 rc = pData->pVMMDev->hgcmLoadService ("VBoxSharedFolders", "VBoxSharedFolders"); 623 pData->pVMMDev->fSharedFolderActive = VBOX_SUCCESS(rc); 624 if (VBOX_SUCCESS(rc)) 625 { 626 LogRel(("Shared Folders service loaded.\n")); 627 } 628 else 629 { 630 LogRel(("Failed to load Shared Folders service %Vrc\n", rc)); 631 } 632 #else 594 633 /* Load Shared Folder HGCM service */ 595 634 HGCMSERVICELOCATION loc; … … 617 656 pData->pVMMDev->mSharedFolderClientId = 0; 618 657 } 658 #endif /* HGCMSS */ 619 659 pDrvIns->pDrvHlp->pfnSSMRegister(pDrvIns, "HGCM", 0, HGCM_SSM_VERSION, 4096/* bad guess */, NULL, iface_hgcmSave, NULL, NULL, iface_hgcmLoad, NULL); 620 660 #endif -
trunk/src/VBox/Main/hgcm/HGCM.cpp
r1577 r1681 28 28 #include "Logging.h" 29 29 30 #include < string.h>30 #include <malloc.h> 31 31 32 32 #include "hgcm/HGCM.h" … … 98 98 */ 99 99 100 /* The maximum allowed size of a service name in bytes. */ 101 #define VBOX_HGCM_SVC_NAME_MAX_BYTES 1024 100 102 101 103 /** Internal helper service object. HGCM code would use it to … … 115 117 static HGCMService *sm_pSvcListTail; 116 118 119 #ifdef HGCMSS 120 static int sm_cServices; 121 #endif /* HGCMSS */ 117 122 118 123 HGCMTHREADHANDLE m_thread; … … 155 160 156 161 static void Reset (void); 162 163 #ifdef HGCMSS 164 static int SaveState (PSSMHANDLE pSSM); 165 static int LoadState (PSSMHANDLE pSSM); 166 #endif /* HGCMSS */ 157 167 158 168 static int FindService (HGCMService **ppsvc, HGCMServiceLocation *loc); … … 165 175 void DisconnectAll (void); 166 176 177 #ifdef HGCMSS 178 int CreateAndConnectClient (uint32_t *pu32ClientIdOut, uint32_t u32ClientIdIn); 179 #endif /* HGCMSS */ 180 167 181 int Connect (uint32_t u32ClientID); 168 182 int Disconnect (uint32_t u32ClientID); … … 384 398 HGCMService *HGCMService::sm_pSvcListHead = NULL; 385 399 HGCMService *HGCMService::sm_pSvcListTail = NULL; 400 #ifdef HGCMSS 401 int HGCMService::sm_cServices = 0; 402 #endif /* HGCMSS */ 386 403 387 404 HGCMService::HGCMService () … … 429 446 430 447 static bool g_fResetting = false; 448 static bool g_fSaveState = false; 431 449 432 450 static DECLCALLBACK(void) hgcmMsgCompletionCallback (int32_t result, HGCMMsgCore *pMsgCore) … … 439 457 if (pMsgHdr->pHGCMPort && !g_fResetting) 440 458 { 441 pMsgHdr->pHGCMPort->pfnCompleted (pMsgHdr->pHGCMPort, result, pMsgHdr->pCmd);459 pMsgHdr->pHGCMPort->pfnCompleted (pMsgHdr->pHGCMPort, g_fSaveState? VINF_HGCM_SAVE_STATE: result, pMsgHdr->pCmd); 442 460 } 443 461 … … 566 584 567 585 rc = VINF_SUCCESS; 568 if (pClient && pSvc->m_fntable.pfnLoadState) 586 587 if (pClient) 569 588 { 570 rc = pSvc->m_fntable.pfnLoadState (pMsg->u32ClientID, HGCM_CLIENT_DATA(pSvc, pClient), pMsg->pSSM); 589 if (pSvc->m_fntable.pfnLoadState) 590 { 591 rc = pSvc->m_fntable.pfnLoadState (pMsg->u32ClientID, HGCM_CLIENT_DATA(pSvc, pClient), pMsg->pSSM); 592 } 593 571 594 hgcmObjDereference (pClient); 572 595 } … … 582 605 583 606 rc = VINF_SUCCESS; 584 if (pClient && pSvc->m_fntable.pfnSaveState) 607 608 if (pClient) 585 609 { 586 rc = pSvc->m_fntable.pfnSaveState (pMsg->u32ClientID, HGCM_CLIENT_DATA(pSvc, pClient), pMsg->pSSM); 610 if (pSvc->m_fntable.pfnSaveState) 611 { 612 g_fSaveState = true; 613 rc = pSvc->m_fntable.pfnSaveState (pMsg->u32ClientID, HGCM_CLIENT_DATA(pSvc, pClient), pMsg->pSSM); 614 g_fSaveState = false; 615 } 616 587 617 hgcmObjDereference (pClient); 588 618 } … … 688 718 RTStrFree (m_pszSvcName); 689 719 m_pszSvcName = NULL; 720 721 // @todo Adjust the list sm_cServices--; 690 722 691 723 LogFlow(("HGCMService::InstanceDestroy completed\n")); … … 816 848 sm_pSvcListHead = psvc; 817 849 850 #ifdef HGCMSS 851 sm_cServices++; 852 #endif /* HGCMSS */ 853 818 854 LogFlow(("HGCMService::LoadService: service %p\n", psvc)); 819 855 } … … 844 880 g_fResetting = false; 845 881 } 882 883 #ifdef HGCMSS 884 /* static */ int HGCMService::SaveState (PSSMHANDLE pSSM) 885 { 886 /* Save the current handle count and restore afterwards to avoid client id conflicts. */ 887 int rc = SSMR3PutU32(pSSM, hgcmObjQueryHandleCount()); 888 AssertRCReturn(rc, rc); 889 890 LogFlowFunc(("%d services to be saved:\n", sm_cServices)); 891 892 /* Save number of services. */ 893 rc = SSMR3PutU32(pSSM, sm_cServices); 894 AssertRCReturn(rc, rc); 895 896 /* Save every service. */ 897 HGCMService *pSvc = sm_pSvcListHead; 898 899 while (pSvc) 900 { 901 LogFlowFunc(("Saving service [%s]\n", pSvc->m_pszSvcName)); 902 903 /* Save the length of the service name. */ 904 rc = SSMR3PutU32(pSSM, strlen(pSvc->m_pszSvcName) + 1); 905 AssertRCReturn(rc, rc); 906 907 /* Save the name of the service. */ 908 rc = SSMR3PutStrZ(pSSM, pSvc->m_pszSvcName); 909 AssertRCReturn(rc, rc); 910 911 /* Save the number of clients. */ 912 rc = SSMR3PutU32(pSSM, pSvc->m_cClients); 913 AssertRCReturn(rc, rc); 914 915 /* Call the service for every client. Normally a service must not have 916 * a global state to be saved: only per client info is relevant. 917 * The global state of a service is configured during VM startup. 918 */ 919 int i; 920 921 for (i = 0; i < pSvc->m_cClients; i++) 922 { 923 void *pvState = NULL; 924 uint32_t cbState = 0; 925 926 uint32_t u32ClientID = pSvc->m_paClientIds[i]; 927 928 Log(("client id 0x%08X\n", u32ClientID)); 929 930 /* Save the client id. */ 931 rc = SSMR3PutU32(pSSM, u32ClientID); 932 AssertRCReturn(rc, rc); 933 934 /* Call the service, so the operation is executed by the service thread. */ 935 rc = pSvc->SaveState (u32ClientID, pSSM); 936 AssertRCReturn(rc, rc); 937 } 938 939 pSvc = pSvc->m_pSvcNext; 940 } 941 942 return VINF_SUCCESS; 943 } 944 945 /* static */ int HGCMService::LoadState (PSSMHANDLE pSSM) 946 { 947 /* Restore handle count to avoid client id conflicts. */ 948 uint32_t u32; 949 950 int rc = SSMR3GetU32(pSSM, &u32); 951 AssertRCReturn(rc, rc); 952 953 hgcmObjSetHandleCount(u32); 954 955 /* Get the number of services. */ 956 uint32_t cServices; 957 958 rc = SSMR3GetU32(pSSM, &cServices); 959 AssertRCReturn(rc, rc); 960 961 LogFlowFunc(("%d services to be restored:\n", cServices)); 962 963 while (cServices--) 964 { 965 /* Get the length of the service name. */ 966 rc = SSMR3GetU32(pSSM, &u32); 967 AssertRCReturn(rc, rc); 968 AssertReturn(u32 <= VBOX_HGCM_SVC_NAME_MAX_BYTES, VERR_SSM_UNEXPECTED_DATA); 969 970 char *pszServiceName = (char *)alloca (u32); 971 972 /* Get the service name. */ 973 rc = SSMR3GetStrZ(pSSM, pszServiceName, u32); 974 AssertRCReturn(rc, rc); 975 976 LogFlowFunc(("Restoring service [%s]\n", pszServiceName)); 977 978 /* Resolve the service instance. */ 979 HGCMService *pSvc = FindServiceByName (pszServiceName); 980 AssertReturn(pSvc, VERR_SSM_UNEXPECTED_DATA); 981 982 /* Get the number of clients. */ 983 uint32_t cClients; 984 rc = SSMR3GetU32(pSSM, &cClients); 985 AssertRCReturn(rc, rc); 986 987 while (cClients--) 988 { 989 /* Get the client id. */ 990 uint32_t u32ClientID; 991 rc = SSMR3GetU32(pSSM, &u32ClientID); 992 AssertRCReturn(rc, rc); 993 994 /* Connect the client. */ 995 rc = pSvc->CreateAndConnectClient (NULL, u32ClientID); 996 AssertRCReturn(rc, rc); 997 998 /* Call the service, so the operation is executed by the service thread. */ 999 rc = pSvc->LoadState (u32ClientID, pSSM); 1000 AssertRCReturn(rc, rc); 1001 } 1002 } 1003 1004 return VINF_SUCCESS; 1005 } 1006 #endif /* HGCMSS */ 846 1007 847 1008 void HGCMService::ReleaseService (void) … … 961 1122 } 962 1123 1124 #ifdef HGCMSS 1125 /* Create a new client instance and connect it to the service. 1126 * 1127 * @param pu32ClientIdOut If not NULL, then the method must generate a new handle for the client. 1128 * If NULL, use the given 'u32ClientIdIn' handle. 1129 * @param u32ClientIdIn The handle for the client, when 'pu32ClientIdOut' is NULL. 1130 * 1131 */ 1132 int HGCMService::CreateAndConnectClient (uint32_t *pu32ClientIdOut, uint32_t u32ClientIdIn) 1133 { 1134 /* Allocate a client information structure */ 1135 HGCMClient *pClient = new HGCMClient (); 1136 1137 if (!pClient) 1138 { 1139 LogWarningFunc(("Could not allocate HGCMClient!!!\n")); 1140 return VERR_NO_MEMORY; 1141 } 1142 1143 uint32_t handle; 1144 1145 if (pu32ClientIdOut != NULL) 1146 { 1147 handle = hgcmObjGenerateHandle (pClient); 1148 } 1149 else 1150 { 1151 handle = hgcmObjAssignHandle (pClient, u32ClientIdIn); 1152 } 1153 1154 AssertRelease(handle); 1155 1156 int rc = pClient->Init (this); 1157 1158 if (VBOX_SUCCESS(rc)) 1159 { 1160 rc = Connect (handle); 1161 } 1162 1163 if (VBOX_FAILURE(rc)) 1164 { 1165 hgcmObjDeleteHandle (handle); 1166 } 1167 else 1168 { 1169 if (pu32ClientIdOut != NULL) 1170 { 1171 *pu32ClientIdOut = handle; 1172 } 1173 } 1174 1175 return rc; 1176 } 1177 #endif /* HGCMSS */ 963 1178 964 1179 int HGCMService::Connect (uint32_t u32ClientID) … … 1242 1457 if (VBOX_SUCCESS (rc)) 1243 1458 { 1459 #ifdef HGCMSS 1460 rc = pService->CreateAndConnectClient (pMsg->pu32ClientID, 0); 1461 #else 1244 1462 /* Allocate a client information structure */ 1245 1463 … … 1273 1491 } 1274 1492 } 1493 #endif /* HGCMSS */ 1275 1494 } 1276 1495 … … 1349 1568 } break; 1350 1569 1570 #ifdef HGCMSS 1571 case HGCMMSGID_LOADSTATE: 1572 { 1573 LogFlow(("HGCMMSGID_LOADSTATE\n")); 1574 1575 HGCMMsgLoadSaveState *pMsg = (HGCMMsgLoadSaveState *)pMsgCore; 1576 1577 rc = HGCMService::LoadState (pMsg->pSSM); 1578 } break; 1579 1580 case HGCMMSGID_SAVESTATE: 1581 { 1582 LogFlow(("HGCMMSGID_SAVESTATE\n")); 1583 1584 HGCMMsgLoadSaveState *pMsg = (HGCMMsgLoadSaveState *)pMsgCore; 1585 1586 rc = HGCMService::SaveState (pMsg->pSSM); 1587 } break; 1588 #endif /* HGCMSS */ 1589 1351 1590 default: 1352 1591 { … … 1471 1710 } 1472 1711 1712 #ifdef HGCMSS 1713 static int hgcmLoadSaveStateSend (PSSMHANDLE pSSM, uint32_t u32MsgId) 1714 { 1715 /* Forward the request to the main HGCM thread. */ 1716 LogFlowFunc(("u32MsgId = %d\n", u32MsgId)); 1717 1718 HGCMMSGHANDLE hMsg = 0; 1719 1720 int rc = hgcmMsgAlloc (g_hgcmThread, &hMsg, u32MsgId, hgcmMessageAlloc); 1721 1722 if (VBOX_SUCCESS(rc)) 1723 { 1724 HGCMMsgLoadSaveState *pMsg = (HGCMMsgLoadSaveState *)hgcmObjReference (hMsg, HGCMOBJ_MSG); 1725 AssertRelease(pMsg); 1726 1727 pMsg->u32ClientID = 0; /* @todo not used. */ 1728 pMsg->pSSM = pSSM; 1729 1730 rc = hgcmMsgSend (hMsg); 1731 1732 hgcmObjDereference (pMsg); 1733 } 1734 1735 LogFlowFunc(("rc = %Vrc\n", rc)); 1736 1737 return rc; 1738 } 1739 1740 int hgcmSaveStateInternal (PSSMHANDLE pSSM) 1741 { 1742 return hgcmLoadSaveStateSend (pSSM, HGCMMSGID_SAVESTATE); 1743 } 1744 1745 int hgcmLoadStateInternal (PSSMHANDLE pSSM) 1746 { 1747 return hgcmLoadSaveStateSend (pSSM, HGCMMSGID_LOADSTATE); 1748 } 1749 #else 1473 1750 int hgcmSaveStateInternal (uint32_t u32ClientID, PSSMHANDLE pSSM) 1474 1751 { … … 1515 1792 return rc; 1516 1793 } 1794 #endif /* HGCMSS */ 1517 1795 1518 1796 int hgcmLoadInternal (const char *pszServiceName, const char *pszServiceLibrary) -
trunk/src/VBox/Main/hgcm/HGCMObjects.cpp
r1398 r1681 33 33 static RTCRITSECT g_critsect; 34 34 35 static uint32_t volatile g_u32HandleCount; 35 /* There are internal handles, which are not saved, 36 * and client handles, which are saved. 37 * They use different range of values: 38 * 1..7FFFFFFF for clients, 39 * 0x80000001..0xFFFFFFFF for other handles. 40 */ 41 static uint32_t volatile g_u32InternalHandleCount; 42 static uint32_t volatile g_u32ClientHandleCount; 36 43 37 44 static PAVLULNODECORE g_pTree; … … 54 61 LogFlow(("MAIN::hgcmObjInit\n")); 55 62 56 g_u32HandleCount = 0; 63 g_u32InternalHandleCount = 0x80000000; 64 g_u32ClientHandleCount = 0; 57 65 g_pTree = NULL; 58 66 … … 72 80 } 73 81 74 uint32_t hgcmObj GenerateHandle (HGCMObject *pObject)82 uint32_t hgcmObjMake (HGCMObject *pObject, uint32_t u32HandleIn) 75 83 { 76 84 int handle = 0; … … 85 93 86 94 /* Generate a new handle value. */ 87 88 uint32_t u32Start = g_u32HandleCount; 95 96 uint32_t volatile *pu32HandleCountSource = pObject->Type () == HGCMOBJ_CLIENT? 97 &g_u32ClientHandleCount: 98 &g_u32InternalHandleCount; 99 100 uint32_t u32Start = *pu32HandleCountSource; 89 101 90 102 for (;;) 91 103 { 92 uint32_t Key = ASMAtomicIncU32 (&g_u32HandleCount); 93 94 if (Key == u32Start) 95 { 96 /* Rollover. Something is wrong. */ 97 break; 98 } 99 100 /* 0 is not a valid handle. */ 101 if (Key == 0) 102 { 103 continue; 104 uint32_t Key; 105 106 if (u32HandleIn == 0) 107 { 108 Key = ASMAtomicIncU32 (pu32HandleCountSource); 109 110 if (Key == u32Start) 111 { 112 /* Rollover. Something is wrong. */ 113 AssertReleaseFailed (); 114 break; 115 } 116 117 /* 0 and 0x80000000 are not valid handles. */ 118 if ((Key & 0x7FFFFFFF) == 0) 119 { 120 /* Over the invalid value, reinitialize the source. */ 121 *pu32HandleCountSource = pObject->Type () == HGCMOBJ_CLIENT? 122 0: 123 0x80000000; 124 continue; 125 } 126 } 127 else 128 { 129 Key = u32HandleIn; 104 130 } 105 131 … … 112 138 if (!bRC) 113 139 { 114 continue; 140 if (u32HandleIn == 0) 141 { 142 /* Try another generated handle. */ 143 continue; 144 } 145 else 146 { 147 /* Could not use the specified handle. */ 148 break; 149 } 115 150 } 116 151 … … 123 158 /* Store returned handle. */ 124 159 handle = Key; 160 161 Log(("Object key inserted 0x%08X\n", Key)); 125 162 126 163 break; … … 134 171 } 135 172 136 LogFlow(("MAIN::hgcmObjGenerateHandle: handle = %d, rc = %Vrc, return void\n", handle, rc));173 LogFlow(("MAIN::hgcmObjGenerateHandle: handle = 0x%08X, rc = %Vrc, return void\n", handle, rc)); 137 174 138 175 return handle; 139 176 } 140 177 178 uint32_t hgcmObjGenerateHandle (HGCMObject *pObject) 179 { 180 return hgcmObjMake (pObject, 0); 181 } 182 183 uint32_t hgcmObjAssignHandle (HGCMObject *pObject, uint32_t u32Handle) 184 { 185 return hgcmObjMake (pObject, u32Handle); 186 } 187 141 188 void hgcmObjDeleteHandle (uint32_t handle) 142 189 { 143 190 int rc = VINF_SUCCESS; 144 191 145 LogFlow(("MAIN::hgcmObjDeleteHandle: handle %d\n", handle));192 LogFlow(("MAIN::hgcmObjDeleteHandle: handle 0x%08X\n", handle)); 146 193 147 194 if (handle) … … 175 222 HGCMObject *hgcmObjReference (uint32_t handle, HGCMOBJ_TYPE enmObjType) 176 223 { 177 LogFlow(("MAIN::hgcmObjReference: handle %d\n", handle));224 LogFlow(("MAIN::hgcmObjReference: handle 0x%08X\n", handle)); 178 225 179 226 HGCMObject *pObject = NULL; … … 222 269 uint32_t hgcmObjQueryHandleCount () 223 270 { 224 return g_u32 HandleCount;225 } 226 227 void hgcmObjSetHandleCount (uint32_t u32 HandleCount)228 { 229 Assert(g_u32 HandleCount <= u32HandleCount);271 return g_u32ClientHandleCount; 272 } 273 274 void hgcmObjSetHandleCount (uint32_t u32ClientHandleCount) 275 { 276 Assert(g_u32ClientHandleCount <= u32ClientHandleCount); 230 277 231 278 int rc = hgcmObjEnter (); … … 233 280 if (VBOX_SUCCESS(rc)) 234 281 { 235 if (g_u32 HandleCount <= u32HandleCount)236 g_u32 HandleCount = u32HandleCount;282 if (g_u32ClientHandleCount <= u32ClientHandleCount) 283 g_u32ClientHandleCount = u32ClientHandleCount; 237 284 hgcmObjLeave (); 238 285 } -
trunk/src/VBox/Main/hgcm/HGCMThread.cpp
r1385 r1681 121 121 HGCMMsgCore *m_pFreeTail; 122 122 123 HGCMTHREADHANDLE m_handle; 123 124 124 125 inline int Enter (void); … … 151 152 #define HGCM_MSG_F_IN_PROCESS (0x00000004) 152 153 153 void HGCMMsgCore::InitializeCore (uint32_t u32MsgId, HGCMT hread *pThread)154 void HGCMMsgCore::InitializeCore (uint32_t u32MsgId, HGCMTHREADHANDLE hThread) 154 155 { 155 156 m_u32Version = HGCMMSG_VERSION; … … 161 162 m_rcSend = VINF_SUCCESS; 162 163 163 m_pThread = pThread; 164 } 165 164 m_pThread = (HGCMThread *)hgcmObjReference (hThread, HGCMOBJ_THREAD); 165 AssertRelease (m_pThread); 166 } 167 168 /* virtual */ HGCMMsgCore::~HGCMMsgCore () 169 { 170 if (m_pThread) 171 { 172 hgcmObjDereference (m_pThread); 173 m_pThread = NULL; 174 } 175 } 166 176 167 177 /* … … 209 219 m_pMsgInProcessTail (NULL), 210 220 m_pFreeHead (NULL), 211 m_pFreeTail (NULL) 221 m_pFreeTail (NULL), 222 m_handle (0) 212 223 { 213 224 memset (&m_critsect, 0, sizeof (m_critsect)); … … 266 277 m_pfnThread = pfnThread; 267 278 m_pvUser = pvUser; 279 m_handle = handle; 268 280 269 281 m_fu32ThreadFlags = HGCMMSG_TF_INITIALIZING; … … 349 361 if (VBOX_SUCCESS(rc)) 350 362 { 351 /* Reference the thread because pMsg contains the pointer to it. */352 Reference ();353 354 363 /* Initialize just allocated message core */ 355 pmsg->InitializeCore (u32MsgId, this);364 pmsg->InitializeCore (u32MsgId, m_handle); 356 365 357 366 /* and the message specific data. */ … … 524 533 525 534 AssertRelease(pMsg->m_pThread == this); 526 AssertRelease ((pMsg->m_fu32Flags & HGCM_MSG_F_IN_PROCESS) != 0);535 AssertReleaseMsg((pMsg->m_fu32Flags & HGCM_MSG_F_IN_PROCESS) != 0, ("%p %x\n", pMsg, pMsg->m_fu32Flags)); 527 536 528 537 if (pMsg->m_pfnCallback) -
trunk/src/VBox/Main/include/VMMDev.h
r1 r1681 37 37 struct DRVMAINVMMDEV *mpDrv; 38 38 39 #ifdef HGCMSS 40 bool fSharedFolderActive; 41 bool isShFlActive() 42 { 43 return fSharedFolderActive; 44 } 45 #else 39 46 uint32_t mSharedFolderClientId; 40 47 uint32_t getShFlClientId() … … 42 49 return mSharedFolderClientId; 43 50 } 51 #endif /* HGCMSS */ 44 52 45 53 Console *getParent() -
trunk/src/VBox/Main/include/hgcm/HGCM.h
r1385 r1681 31 31 32 32 /* HGCM saved state version */ 33 #define HGCM_SSM_VERSION 133 #define HGCM_SSM_VERSION 2 34 34 35 35 __BEGIN_DECLS … … 45 45 int hgcmHostCallInternal (const char *pszServiceName, uint32_t function, uint32_t cParms, VBOXHGCMSVCPARM aParms[]); 46 46 47 #ifdef HGCMSS 48 int hgcmSaveStateInternal (PSSMHANDLE pSSM); 49 int hgcmLoadStateInternal (PSSMHANDLE pSSM); 50 #else 47 51 int hgcmSaveStateInternal (uint32_t clientID, PSSMHANDLE pSSM); 48 52 int hgcmLoadStateInternal (uint32_t clientID, PSSMHANDLE pSSM); 53 #endif /* HGCMSS */ 49 54 50 55 __END_DECLS -
trunk/src/VBox/Main/include/hgcm/HGCMObjects.h
r1400 r1681 50 50 { 51 51 private: 52 friend uint32_t hgcmObj GenerateHandle (HGCMObject *pObject);52 friend uint32_t hgcmObjMake (HGCMObject *pObject, uint32_t u32HandleIn); 53 53 54 54 int32_t volatile cRef; … … 105 105 106 106 uint32_t hgcmObjGenerateHandle (HGCMObject *pObject); 107 uint32_t hgcmObjAssignHandle (HGCMObject *pObject, uint32_t u32Handle); 107 108 108 109 void hgcmObjDeleteHandle (uint32_t handle); -
trunk/src/VBox/Main/include/hgcm/HGCMThread.h
r1385 r1681 64 64 uint32_t m_u32Version; 65 65 66 /** Thread the message belongs to . */66 /** Thread the message belongs to, referenced by the message. */ 67 67 HGCMThread *m_pThread; 68 68 … … 84 84 int32_t m_rcSend; 85 85 86 void InitializeCore (uint32_t u32MsgId, HGCMT hread *pThread);86 void InitializeCore (uint32_t u32MsgId, HGCMTHREADHANDLE hThread); 87 87 88 88 protected: 89 virtual ~HGCMMsgCore () {};89 virtual ~HGCMMsgCore (); 90 90 91 91 public:
Note:
See TracChangeset
for help on using the changeset viewer.