VirtualBox

Ignore:
Timestamp:
Apr 13, 2012 2:47:07 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
77453
Message:

supdrvIOCtl: Reduce the number of return probes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/SUPDrv.c

    r40899 r40904  
    10591059
    10601060
    1061 /**
    1062  * I/O Control worker.
     1061
     1062/**
     1063 * I/O Control inner worker (tracing reasons).
    10631064 *
    10641065 * @returns IPRT status code.
     
    10701071 * @param   pReqHdr     The request header.
    10711072 */
    1072 int VBOXCALL supdrvIOCtl(uintptr_t uIOCtl, PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPREQHDR pReqHdr)
    1073 {
    1074     VBOXDRV_IOCTL_ENTRY(pSession, uIOCtl, pReqHdr);
    1075 
    1076     /*
    1077      * Validate the request.
    1078      */
    1079     /* this first check could probably be omitted as its also done by the OS specific code... */
    1080     if (RT_UNLIKELY(    (pReqHdr->fFlags & SUPREQHDR_FLAGS_MAGIC_MASK) != SUPREQHDR_FLAGS_MAGIC
    1081                     ||  pReqHdr->cbIn < sizeof(*pReqHdr)
    1082                     ||  pReqHdr->cbOut < sizeof(*pReqHdr)))
    1083     {
    1084         OSDBGPRINT(("vboxdrv: Bad ioctl request header; cbIn=%#lx cbOut=%#lx fFlags=%#lx\n",
    1085                     (long)pReqHdr->cbIn, (long)pReqHdr->cbOut, (long)pReqHdr->fFlags));
    1086         VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VINF_SUCCESS);
    1087         return VERR_INVALID_PARAMETER;
    1088     }
    1089     if (RT_UNLIKELY(!RT_VALID_PTR(pSession)))
    1090     {
    1091         OSDBGPRINT(("vboxdrv: Invalid pSession valud %p (ioctl=%p)\n", pSession, (void *)uIOCtl));
    1092         VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VINF_SUCCESS);
    1093         return VERR_INVALID_PARAMETER;
    1094     }
    1095     if (RT_UNLIKELY(uIOCtl == SUP_IOCTL_COOKIE))
    1096     {
    1097         if (pReqHdr->u32Cookie != SUPCOOKIE_INITIAL_COOKIE)
    1098         {
    1099             OSDBGPRINT(("SUP_IOCTL_COOKIE: bad cookie %#lx\n", (long)pReqHdr->u32Cookie));
    1100             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VINF_SUCCESS);
    1101             return VERR_INVALID_PARAMETER;
    1102         }
    1103     }
    1104     else if (RT_UNLIKELY(    pReqHdr->u32Cookie != pDevExt->u32Cookie
    1105                          ||  pReqHdr->u32SessionCookie != pSession->u32Cookie))
    1106     {
    1107         OSDBGPRINT(("vboxdrv: bad cookie %#lx / %#lx.\n", (long)pReqHdr->u32Cookie, (long)pReqHdr->u32SessionCookie));
    1108         VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VINF_SUCCESS);
    1109         return VERR_INVALID_PARAMETER;
    1110     }
    1111 
    1112 /*
    1113  * Validation macros
    1114  */
     1073static int supdrvIOCtlInner(uintptr_t uIOCtl, PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPREQHDR pReqHdr)
     1074{
     1075    /*
     1076     * Validation macros
     1077     */
    11151078#define REQ_CHECK_SIZES_EX(Name, cbInExpect, cbOutExpect) \
    11161079    do { \
     
    11191082            OSDBGPRINT(( #Name ": Invalid input/output sizes. cbIn=%ld expected %ld. cbOut=%ld expected %ld.\n", \
    11201083                        (long)pReqHdr->cbIn, (long)(cbInExpect), (long)pReqHdr->cbOut, (long)(cbOutExpect))); \
    1121             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VERR_INVALID_PARAMETER); \
    11221084            return pReqHdr->rc = VERR_INVALID_PARAMETER; \
    11231085        } \
     
    11321094            OSDBGPRINT(( #Name ": Invalid input/output sizes. cbIn=%ld expected %ld.\n", \
    11331095                        (long)pReqHdr->cbIn, (long)(cbInExpect))); \
    1134             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VERR_INVALID_PARAMETER); \
    11351096            return pReqHdr->rc = VERR_INVALID_PARAMETER; \
    11361097        } \
     
    11431104            OSDBGPRINT(( #Name ": Invalid input/output sizes. cbOut=%ld expected %ld.\n", \
    11441105                        (long)pReqHdr->cbOut, (long)(cbOutExpect))); \
    1145             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VERR_INVALID_PARAMETER); \
    11461106            return pReqHdr->rc = VERR_INVALID_PARAMETER; \
    11471107        } \
     
    11531113        { \
    11541114            OSDBGPRINT(( #Name ": %s\n", #expr)); \
    1155             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VERR_INVALID_PARAMETER); \
    11561115            return pReqHdr->rc = VERR_INVALID_PARAMETER; \
    11571116        } \
     
    11631122        { \
    11641123            OSDBGPRINT( fmt ); \
    1165             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VERR_INVALID_PARAMETER); \
    11661124            return pReqHdr->rc = VERR_INVALID_PARAMETER; \
    11671125        } \
     
    11811139                OSDBGPRINT(("SUP_IOCTL_COOKIE: invalid magic %.16s\n", pReq->u.In.szMagic));
    11821140                pReq->Hdr.rc = VERR_INVALID_MAGIC;
    1183                 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, VERR_INVALID_MAGIC);
    11841141                return 0;
    11851142            }
     
    11991156                pReq->u.Out.cFunctions        = 0;
    12001157                pReq->Hdr.rc = VERR_PERMISSION_DENIED;
    1201                 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, VERR_PERMISSION_DENIED);
    12021158                return 0;
    12031159            }
     
    12201176                pReq->u.Out.cFunctions        = 0;
    12211177                pReq->Hdr.rc = VERR_VERSION_MISMATCH;
    1222                 VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    12231178                return 0;
    12241179            }
     
    12371192            pReq->u.Out.cFunctions        = sizeof(g_aFunctions) / sizeof(g_aFunctions[0]);
    12381193            pReq->Hdr.rc = VINF_SUCCESS;
    1239             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    12401194            return 0;
    12411195        }
     
    12511205            memcpy(&pReq->u.Out.aFunctions[0], g_aFunctions, sizeof(g_aFunctions));
    12521206            pReq->Hdr.rc = VINF_SUCCESS;
    1253             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    12541207            return 0;
    12551208        }
     
    12681221            if (RT_FAILURE(pReq->Hdr.rc))
    12691222                pReq->Hdr.cbOut = sizeof(pReq->Hdr);
    1270             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    12711223            return 0;
    12721224        }
     
    12801232            /* execute */
    12811233            pReq->Hdr.rc = SUPR0UnlockMem(pSession, pReq->u.In.pvR3);
    1282             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    12831234            return 0;
    12841235        }
     
    12941245            if (RT_FAILURE(pReq->Hdr.rc))
    12951246                pReq->Hdr.cbOut = sizeof(pReq->Hdr);
    1296             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    12971247            return 0;
    12981248        }
     
    13061256            /* execute */
    13071257            pReq->Hdr.rc = SUPR0ContFree(pSession, (RTHCUINTPTR)pReq->u.In.pvR3);
    1308             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    13091258            return 0;
    13101259        }
     
    13271276            /* execute */
    13281277            pReq->Hdr.rc = supdrvIOCtl_LdrOpen(pDevExt, pSession, pReq);
    1329             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    13301278            return 0;
    13311279        }
     
    13681316            /* execute */
    13691317            pReq->Hdr.rc = supdrvIOCtl_LdrLoad(pDevExt, pSession, pReq);
    1370             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    13711318            return 0;
    13721319        }
     
    13801327            /* execute */
    13811328            pReq->Hdr.rc = supdrvIOCtl_LdrFree(pDevExt, pSession, pReq);
    1382             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    13831329            return 0;
    13841330        }
     
    13931339            /* execute */
    13941340            pReq->Hdr.rc = supdrvIOCtl_LdrGetSymbol(pDevExt, pSession, pReq);
    1395             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    13961341            return 0;
    13971342        }
     
    14371382                Log4(("SUP_IOCTL_CALL_VMMR0: rc=%Rrc op=%u out=%u arg=%RX64 p/t=%RTproc/%RTthrd\n",
    14381383                      pReq->Hdr.rc, pReq->u.In.uOperation, pReq->Hdr.cbOut, pReq->u.In.u64Arg, RTProcSelf(), RTThreadNativeSelf()));
    1439             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    14401384            return 0;
    14411385        }
     
    14691413                Log4(("SUP_IOCTL_CALL_VMMR0_BIG: rc=%Rrc op=%u out=%u arg=%RX64 p/t=%RTproc/%RTthrd\n",
    14701414                      pReq->Hdr.rc, pReq->u.In.uOperation, pReq->Hdr.cbOut, pReq->u.In.u64Arg, RTProcSelf(), RTThreadNativeSelf()));
    1471             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    14721415            return 0;
    14731416        }
     
    14821425            pReq->Hdr.rc = VINF_SUCCESS;
    14831426            pReq->u.Out.enmMode = SUPR0GetPagingMode();
    1484             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    14851427            return 0;
    14861428        }
     
    14971439            if (RT_FAILURE(pReq->Hdr.rc))
    14981440                pReq->Hdr.cbOut = sizeof(pReq->Hdr);
    1499             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    15001441            return 0;
    15011442        }
     
    15091450            /* execute */
    15101451            pReq->Hdr.rc = SUPR0LowFree(pSession, (RTHCUINTPTR)pReq->u.In.pvR3);
    1511             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    15121452            return 0;
    15131453        }
     
    15231463            if (RT_SUCCESS(pReq->Hdr.rc))
    15241464                pReq->u.Out.pGipR0 = pDevExt->pGip;
    1525             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    15261465            return 0;
    15271466        }
     
    15351474            /* execute */
    15361475            pReq->Hdr.rc = SUPR0GipUnmap(pSession);
    1537             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    15381476            return 0;
    15391477        }
     
    15511489            pSession->pVM = pReq->u.In.pVMR0;
    15521490            pReq->Hdr.rc = VINF_SUCCESS;
    1553             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    15541491            return 0;
    15551492        }
     
    15751512            if (RT_FAILURE(pReq->Hdr.rc))
    15761513                pReq->Hdr.cbOut = sizeof(pReq->Hdr);
    1577             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    15781514            return 0;
    15791515        }
     
    15941530            if (RT_FAILURE(pReq->Hdr.rc))
    15951531                pReq->Hdr.cbOut = sizeof(pReq->Hdr);
    1596             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    15971532            return 0;
    15981533        }
     
    16111546            /* execute */
    16121547            pReq->Hdr.rc = SUPR0PageProtect(pSession, pReq->u.In.pvR3, pReq->u.In.pvR0, pReq->u.In.offSub, pReq->u.In.cbSub, pReq->u.In.fProt);
    1613             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    16141548            return 0;
    16151549        }
     
    16231557            /* execute */
    16241558            pReq->Hdr.rc = SUPR0PageFree(pSession, pReq->u.In.pvR3);
    1625             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    16261559            return 0;
    16271560        }
     
    16481581            /* execute */
    16491582            pReq->Hdr.rc = supdrvIOCtl_CallServiceModule(pDevExt, pSession, pReq);
    1650             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    16511583            return 0;
    16521584        }
     
    16711603            /* execute */
    16721604            pReq->Hdr.rc = supdrvIOCtl_LoggerSettings(pDevExt, pSession, pReq);
    1673             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    16741605            return 0;
    16751606        }
     
    18231754            if (RT_FAILURE(pReq->Hdr.rc))
    18241755                pReq->Hdr.cbOut = sizeof(pReq->Hdr);
    1825             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    18261756            return 0;
    18271757        }
     
    18351765            /* execute */
    18361766            pReq->Hdr.rc = supdrvIOCtl_TracerOpen(pDevExt, pSession, pReq->u.In.uCookie, pReq->u.In.uArg);
    1837             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc);
    18381767            return 0;
    18391768        }
     
    18461775            /* execute */
    18471776            pReqHdr->rc = supdrvIOCtl_TracerClose(pDevExt, pSession);
    1848             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReqHdr->rc);
    18491777            return 0;
    18501778        }
     
    18581786            /* execute */
    18591787            pReqHdr->rc = supdrvIOCtl_TracerIOCtl(pDevExt, pSession, pReq->u.In.uCmd, pReq->u.In.uArg, &pReq->u.Out.iRetVal);
    1860             VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReqHdr->rc);
    18611788            return 0;
    18621789        }
     
    18661793            break;
    18671794    }
    1868     VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_GENERAL_FAILURE, VERR_GENERAL_FAILURE);
    18691795    return VERR_GENERAL_FAILURE;
     1796}
     1797
     1798
     1799/**
     1800 * I/O Control worker.
     1801 *
     1802 * @returns IPRT status code.
     1803 * @retval  VERR_INVALID_PARAMETER if the request is invalid.
     1804 *
     1805 * @param   uIOCtl      Function number.
     1806 * @param   pDevExt     Device extention.
     1807 * @param   pSession    Session data.
     1808 * @param   pReqHdr     The request header.
     1809 */
     1810int VBOXCALL supdrvIOCtl(uintptr_t uIOCtl, PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPREQHDR pReqHdr)
     1811{
     1812    int rc;
     1813    VBOXDRV_IOCTL_ENTRY(pSession, uIOCtl, pReqHdr);
     1814
     1815    /*
     1816     * Validate the request.
     1817     */
     1818    /* this first check could probably be omitted as its also done by the OS specific code... */
     1819    if (RT_UNLIKELY(   (pReqHdr->fFlags & SUPREQHDR_FLAGS_MAGIC_MASK) != SUPREQHDR_FLAGS_MAGIC
     1820                    || pReqHdr->cbIn < sizeof(*pReqHdr)
     1821                    || pReqHdr->cbOut < sizeof(*pReqHdr)))
     1822    {
     1823        OSDBGPRINT(("vboxdrv: Bad ioctl request header; cbIn=%#lx cbOut=%#lx fFlags=%#lx\n",
     1824                    (long)pReqHdr->cbIn, (long)pReqHdr->cbOut, (long)pReqHdr->fFlags));
     1825        VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VINF_SUCCESS);
     1826        return VERR_INVALID_PARAMETER;
     1827    }
     1828    if (RT_UNLIKELY(!RT_VALID_PTR(pSession)))
     1829    {
     1830        OSDBGPRINT(("vboxdrv: Invalid pSession valud %p (ioctl=%p)\n", pSession, (void *)uIOCtl));
     1831        VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VINF_SUCCESS);
     1832        return VERR_INVALID_PARAMETER;
     1833    }
     1834    if (RT_UNLIKELY(uIOCtl == SUP_IOCTL_COOKIE))
     1835    {
     1836        if (pReqHdr->u32Cookie != SUPCOOKIE_INITIAL_COOKIE)
     1837        {
     1838            OSDBGPRINT(("SUP_IOCTL_COOKIE: bad cookie %#lx\n", (long)pReqHdr->u32Cookie));
     1839            VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VINF_SUCCESS);
     1840            return VERR_INVALID_PARAMETER;
     1841        }
     1842    }
     1843    else if (RT_UNLIKELY(    pReqHdr->u32Cookie != pDevExt->u32Cookie
     1844                         ||  pReqHdr->u32SessionCookie != pSession->u32Cookie))
     1845    {
     1846        OSDBGPRINT(("vboxdrv: bad cookie %#lx / %#lx.\n", (long)pReqHdr->u32Cookie, (long)pReqHdr->u32SessionCookie));
     1847        VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VERR_INVALID_PARAMETER, VINF_SUCCESS);
     1848        return VERR_INVALID_PARAMETER;
     1849    }
     1850
     1851    /*
     1852     * Hand it to an inner function to avoid lots of unnecessary return tracepoints
     1853     */
     1854    rc = supdrvIOCtlInner(uIOCtl, pDevExt, pSession, pReqHdr);
     1855
     1856    VBOXDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, pReqHdr->rc, rc);
     1857    return rc;
    18701858}
    18711859
Note: See TracChangeset for help on using the changeset viewer.

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