Virtualbox WDDM之DxgkDdiInterruptRoutine

来源:互联网 发布:下载软件的软件哪个好 编辑:程序博客网 时间:2024/06/10 01:54


/*The DxgkDdiInterruptRoutine function handles interrupts generated by a display adapter.处理来自显卡的中断virtualbox中断来自HGSMI,*/BOOLEAN DxgkDdiInterruptRoutine(    IN CONST PVOID MiniportDeviceContext,    IN ULONG MessageNumber    ){    PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)MiniportDeviceContext;    BOOLEAN bOur = FALSE;    if (pDevExt->u.primary.pHostFlags) /* If HGSMI is enabled at all. */    {        VBOXSHGSMILIST CtlList;        VBOXSHGSMILIST DmaCmdList;        vboxSHGSMIListInit(&CtlList);        vboxSHGSMIListInit(&DmaCmdList);        do        {            uint32_t flags = pDevExt->u.primary.pHostFlags->u32HostFlags;            if (flags & HGSMIHOSTFLAGS_GCOMMAND_COMPLETED)            {                bOur = TRUE;                /* read the command offset */                HGSMIOFFSET offCmd = VBoxHGSMIGuestRead(pDevExt);                Assert(offCmd != HGSMIOFFSET_VOID);                if (offCmd != HGSMIOFFSET_VOID)                {                    VBOXWDDM_HGSMICMD_TYPE enmType = vboxWddmHgsmiGetCmdTypeFromOffset(pDevExt, offCmd);                    PVBOXSHGSMILIST pList;                    HGSMIHEAP * pHeap = NULL;                    switch (enmType)                    {                        case VBOXWDDM_HGSMICMD_TYPE_DMACMD:                            pList = &DmaCmdList;                            pHeap = &pDevExt->u.primary.Vdma.CmdHeap;                            break;                        case VBOXWDDM_HGSMICMD_TYPE_CTL:                            pList = &CtlList;                            pHeap = &pDevExt->u.primary.hgsmiAdapterHeap;                            break;                        default:                            AssertBreakpoint();                    }                    if (pHeap)                    {                        int rc = VBoxSHGSMICommandProcessCompletion (pHeap, offCmd, TRUE /*bool bIrq*/ , pList);                        AssertRC(rc);                    }                }            }            else if (flags & HGSMIHOSTFLAGS_COMMANDS_PENDING)            {                bOur = TRUE;                AssertBreakpoint();                /* @todo: FIXME: implement !!! */            }            else if (flags & HGSMIHOSTFLAGS_IRQ)            {                bOur = TRUE;                AssertBreakpoint();                /* unknown command */            }            else                break;        } while (1);        if (!vboxSHGSMIListIsEmpty(&CtlList))            vboxSHGSMIListCat(&pDevExt->CtlList, &CtlList);        if (!vboxSHGSMIListIsEmpty(&DmaCmdList))            vboxSHGSMIListCat(&pDevExt->DmaCmdList, &DmaCmdList);        if (pDevExt->bSetNotifyDxDpc)        {            pDevExt->bNotifyDxDpc = TRUE;            pDevExt->bSetNotifyDxDpc = FALSE;        }        if (bOur)            HGSMIClearIrq (pDevExt);    }    return bOur;}


0 0