VirtualBox

Changeset 37687 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Jun 29, 2011 3:22:11 PM (13 years ago)
Author:
vboxsync
Message:

Main/Console+Machine: add notification for guest triggered eject, which right now results in updating the VM config
Devices/Storage/ATA+AHCI: trigger the eject notification

Location:
trunk/src/VBox/Devices/Storage
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/ATAController.cpp

    r37466 r37687  
    24022402                        break;
    24032403                    case 2: /* 10 - Eject media */
     2404                    {
    24042405                        /* This must be done from EMT. */
    2405                         {
    24062406                        PAHCIATACONTROLLER pCtl = ATADEVSTATE_2_CONTROLLER(s);
    24072407                        PPDMDEVINS pDevIns = ATADEVSTATE_2_DEVINS(s);
     
    24122412                                             false /*=fForce*/, true /*=fEeject*/);
    24132413                        Assert(RT_SUCCESS(rc) || (rc == VERR_PDM_MEDIA_LOCKED) || (rc = VERR_PDM_MEDIA_NOT_MOUNTED));
     2414                        if (RT_SUCCESS(rc) && pCtl->pMediaNotify)
     2415                        {
     2416                            rc = VMR3ReqCallNoWait(PDMDevHlpGetVM(pDevIns), VMCPUID_ANY,
     2417                                                   (PFNRT)pCtl->pMediaNotify->pfnEjected, 2,
     2418                                                   pCtl->pMediaNotify, s->iLUN);
     2419                            AssertRC(rc);
     2420                        }
    24142421                        {
    24152422                            STAM_PROFILE_START(&pCtl->StatLockWait, a);
     
    24172424                            STAM_PROFILE_STOP(&pCtl->StatLockWait, a);
    24182425                        }
    2419                         }
    24202426                        break;
     2427                    }
    24212428                    case 3: /* 11 - Load media */
    24222429                        /** @todo rc = s->pDrvMount->pfnLoadMedia(s->pDrvMount) */
     
    55675574
    55685575int ataControllerInit(PPDMDEVINS pDevIns, PAHCIATACONTROLLER pCtl,
     5576                      PPDMIMEDIANOTIFY pMediaNotify,
    55695577                      unsigned iLUNMaster, PPDMIBASE pDrvBaseMaster, PPDMLED pLedMaster,
    55705578                      PSTAMCOUNTER pStatBytesReadMaster, PSTAMCOUNTER pStatBytesWrittenMaster,
     
    55885596    pCtl->pDevInsR0 = PDMDEVINS_2_R0PTR(pDevIns);
    55895597    pCtl->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns);
     5598    pCtl->pMediaNotify = pMediaNotify;
    55905599    pCtl->AsyncIOSem = NIL_RTSEMEVENT;
    55915600    pCtl->SuspendIOSem = NIL_RTSEMEVENT;
  • trunk/src/VBox/Devices/Storage/ATAController.h

    r37264 r37687  
    387387    /** The event semaphore the thread is waiting on during suspended I/O. */
    388388    RTSEMEVENT          SuspendIOSem;
     389    /** Pointer to Media Notify interface. */
     390    R3PTRTYPE(PPDMIMEDIANOTIFY) pMediaNotify;
    389391#if 0 /*HC_ARCH_BITS == 32*/
    390392    uint32_t            Alignment0;
     
    429431 * @param   pDevIns Pointer to the device instance which creates a controller.
    430432 * @param   pCtl    Pointer to the unitialized ATA controller structure.
     433 * @param   pMediaNotify   Pointer to PDM interface for media eject.
    431434 * @param   iLUNMaster     Port number of the master device.
    432435 * @param   pDrvBaseMaster Pointer to the base driver interface which acts as the master.
     
    457460 */
    458461int ataControllerInit(PPDMDEVINS pDevIns, PAHCIATACONTROLLER pCtl,
     462                      PPDMIMEDIANOTIFY pMediaNotify,
    459463                      unsigned iLUNMaster, PPDMIBASE pDrvBaseMaster, PPDMLED pLedMaster,
    460464                      PSTAMCOUNTER pStatBytesReadMaster, PSTAMCOUNTER pStatBytesWrittenMaster,
  • trunk/src/VBox/Devices/Storage/DevAHCI.cpp

    r37673 r37687  
    575575    /** Status LUN: Partner of ILeds. */
    576576    R3PTRTYPE(PPDMILEDCONNECTORS)   pLedsConnector;
     577    /** Status LUN: Media Notifys. */
     578    R3PTRTYPE(PPDMIMEDIANOTIFY)     pMediaNotify;
    577579
    578580#if HC_ARCH_BITS == 64
     
    43834385                        break;
    43844386                    case 2: /* 10 - Eject media */
     4387                    {
    43854388                        /* This must be done from EMT. */
     4389                        PAHCI pAhci = pAhciPort->CTX_SUFF(pAhci);
     4390                        PPDMDEVINS pDevIns = pAhci->CTX_SUFF(pDevIns);
     4391
     4392                        rc2 = VMR3ReqCallWait(PDMDevHlpGetVM(pDevIns), VMCPUID_ANY,
     4393                                              (PFNRT)pAhciPort->pDrvMount->pfnUnmount, 3,
     4394                                              pAhciPort->pDrvMount, false/*=fForce*/, true/*=fEject*/);
     4395                        Assert(RT_SUCCESS(rc2) || (rc2 == VERR_PDM_MEDIA_LOCKED) || (rc2 = VERR_PDM_MEDIA_NOT_MOUNTED));
     4396                        if (RT_SUCCESS(rc) && pAhci->pMediaNotify)
    43864397                        {
    4387                             PAHCI pAhci = pAhciPort->CTX_SUFF(pAhci);
    4388                             PPDMDEVINS pDevIns = pAhci->CTX_SUFF(pDevIns);
    4389 
    4390                             rc2 = VMR3ReqCallWait(PDMDevHlpGetVM(pDevIns), VMCPUID_ANY,
    4391                                                   (PFNRT)pAhciPort->pDrvMount->pfnUnmount, 3,
    4392                                                   pAhciPort->pDrvMount, false/*=fForce*/, true/*=fEject*/);
    4393                             Assert(RT_SUCCESS(rc2) || (rc2 == VERR_PDM_MEDIA_LOCKED) || (rc2 = VERR_PDM_MEDIA_NOT_MOUNTED));
     4398                            rc2 = VMR3ReqCallNoWait(PDMDevHlpGetVM(pDevIns), VMCPUID_ANY,
     4399                                                    (PFNRT)pAhci->pMediaNotify->pfnEjected, 2,
     4400                                                    pAhci->pMediaNotify, pAhciPort->iLUN);
     4401                            AssertRC(rc);
    43944402                        }
    43954403                        break;
     4404                    }
    43964405                    case 3: /* 11 - Load media */
    43974406                        /** @todo rc = s->pDrvMount->pfnLoadMedia(s->pDrvMount) */
     
    86078616    rc = PDMDevHlpDriverAttach(pDevIns, PDM_STATUS_LUN, &pThis->IBase, &pBase, "Status Port");
    86088617    if (RT_SUCCESS(rc))
     8618    {
    86098619        pThis->pLedsConnector = PDMIBASE_QUERY_INTERFACE(pBase, PDMILEDCONNECTORS);
     8620        pThis->pMediaNotify = PDMIBASE_QUERY_INTERFACE(pBase, PDMIMEDIANOTIFY);
     8621    }
    86108622    else if (rc != VERR_PDM_NO_ATTACHED_DRIVER)
    86118623    {
     
    86598671            char szName[24];
    86608672            RTStrPrintf(szName, sizeof(szName), "EmulatedATA%d", i);
    8661             rc = ataControllerInit(pDevIns, pCtl,
     8673            rc = ataControllerInit(pDevIns, pCtl, pThis->pMediaNotify,
    86628674                                   iPortMaster, pThis->ahciPort[iPortMaster].pDrvBase,
    86638675                                   &pThis->ahciPort[iPortMaster].Led,
  • trunk/src/VBox/Devices/Storage/DevATA.cpp

    r37653 r37687  
    476476    /** Status LUN: Partner of ILeds. */
    477477    R3PTRTYPE(PPDMILEDCONNECTORS)   pLedsConnector;
     478    /** Status LUN: Media Notify. */
     479    R3PTRTYPE(PPDMIMEDIANOTIFY)     pMediaNotify;
    478480    /** Flag whether GC is enabled. */
    479481    bool                fGCEnabled;
     
    31163118                        break;
    31173119                    case 2: /* 10 - Eject media */
     3120                    {
    31183121                        /* This must be done from EMT. */
    3119                         {
    31203122                        PATACONTROLLER pCtl = ATADEVSTATE_2_CONTROLLER(s);
    31213123                        PPDMDEVINS pDevIns = ATADEVSTATE_2_DEVINS(s);
     3124                        PCIATAState *pThis = PDMINS_2_DATA(pDevIns, PCIATAState *);
    31223125
    31233126                        PDMCritSectLeave(&pCtl->lock);
     
    31263129                                             s->pDrvMount, false /*=fForce*/, true /*=fEject*/);
    31273130                        Assert(RT_SUCCESS(rc) || (rc == VERR_PDM_MEDIA_LOCKED) || (rc = VERR_PDM_MEDIA_NOT_MOUNTED));
     3131                        if (RT_SUCCESS(rc) && pThis->pMediaNotify)
     3132                        {
     3133                            rc = VMR3ReqCallNoWait(PDMDevHlpGetVM(pDevIns), VMCPUID_ANY,
     3134                                                   (PFNRT)pThis->pMediaNotify->pfnEjected, 2,
     3135                                                   pThis->pMediaNotify, s->iLUN);
     3136                            AssertRC(rc);
     3137                        }
    31283138                        {
    31293139                            STAM_PROFILE_START(&pCtl->StatLockWait, a);
     
    31313141                            STAM_PROFILE_STOP(&pCtl->StatLockWait, a);
    31323142                        }
    3133                         }
    31343143                        break;
     3144                    }
    31353145                    case 3: /* 11 - Load media */
    31363146                        /** @todo rc = s->pDrvMount->pfnLoadMedia(s->pDrvMount) */
     
    70427052    rc = PDMDevHlpDriverAttach(pDevIns, PDM_STATUS_LUN, &pThis->IBase, &pBase, "Status Port");
    70437053    if (RT_SUCCESS(rc))
     7054    {
    70447055        pThis->pLedsConnector = PDMIBASE_QUERY_INTERFACE(pBase, PDMILEDCONNECTORS);
     7056        pThis->pMediaNotify = PDMIBASE_QUERY_INTERFACE(pBase, PDMIMEDIANOTIFY);
     7057    }
    70457058    else if (rc != VERR_PDM_NO_ATTACHED_DRIVER)
    70467059    {
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette