VirtualBox

Changeset 26124 in vbox for trunk/src/VBox/Additions


Ignore:
Timestamp:
Feb 1, 2010 2:30:36 PM (15 years ago)
Author:
vboxsync
Message:

Additions/VBoxGuest,VBoxGuestLib: fixed HGCM 32-bit calls in 64-bit kernel driver. OpenGL works again.

Location:
trunk/src/VBox/Additions/common
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp

    r23916 r26124  
    13081308    if (pInfo->cParms > 4096) /* (Just make sure it doesn't overflow the next check.) */
    13091309    {
    1310         Log(("VBoxGuestCommonIOCtl: HGCM_CALL: cParm=%RX32 is not sane\n", pInfo->cParms));
     1310        LogRel(("VBoxGuestCommonIOCtl: HGCM_CALL: cParm=%RX32 is not sane\n", pInfo->cParms));
    13111311        return VERR_INVALID_PARAMETER;
    13121312    }
     
    13201320    if (cbData < cbActual)
    13211321    {
    1322         Log(("VBoxGuestCommonIOCtl: HGCM_CALL: cbData=%#zx (%zu) required size is %#zx (%zu)\n",
     1322        LogRel(("VBoxGuestCommonIOCtl: HGCM_CALL: cbData=%#zx (%zu) required size is %#zx (%zu)\n",
    13231323             cbData, cbActual));
    13241324        return VERR_INVALID_PARAMETER;
     
    13761376    }
    13771377    else
    1378         Log(("VBoxGuestCommonIOCtl: HGCM_CALL: Failed. rc=%Rrc.\n", rc));
     1378        LogRel(("VBoxGuestCommonIOCtl: HGCM_CALL: %s Failed. rc=%Rrc.\n", f32Bit ? "32" : "64", rc));
    13791379    return rc;
    13801380}
     
    14981498        if (pSession->R0Process != NIL_RTR0PROCESS) \
    14991499        { \
    1500             Log(("VBoxGuestCommonIOCtl: " mnemonic ": Ring-0 only, caller is %RTproc/%p\n", \
     1500            LogRel(("VBoxGuestCommonIOCtl: " mnemonic ": Ring-0 only, caller is %RTproc/%p\n", \
    15011501                 pSession->Process, (uintptr_t)pSession->R0Process)); \
    15021502            return VERR_PERMISSION_DENIED; \
     
    15071507        if (cbData < (cbMin)) \
    15081508        { \
    1509             Log(("VBoxGuestCommonIOCtl: " mnemonic ": cbData=%#zx (%zu) min is %#zx (%zu)\n", \
     1509            LogRel(("VBoxGuestCommonIOCtl: " mnemonic ": cbData=%#zx (%zu) min is %#zx (%zu)\n", \
    15101510                 cbData, cbData, (size_t)(cbMin), (size_t)(cbMin))); \
    15111511            return VERR_BUFFER_OVERFLOW; \
     
    15131513        if ((cbMin) != 0 && !VALID_PTR(pvData)) \
    15141514        { \
    1515             Log(("VBoxGuestCommonIOCtl: " mnemonic ": Invalid pointer %p\n", pvData)); \
     1515            LogRel(("VBoxGuestCommonIOCtl: " mnemonic ": Invalid pointer %p\n", pvData)); \
    15161516            return VERR_INVALID_POINTER; \
    15171517        } \
     
    16261626            default:
    16271627            {
    1628                 Log(("VBoxGuestCommonIOCtl: Unknown request iFunction=%#x Stripped size=%#x\n", iFunction,
     1628                LogRel(("VBoxGuestCommonIOCtl: Unknown request iFunction=%#x Stripped size=%#x\n", iFunction,
    16291629                                VBOXGUEST_IOCTL_STRIP_SIZE(iFunction)));
    16301630                rc = VERR_NOT_SUPPORTED;
  • trunk/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp

    r23610 r26124  
    895895                rc = vbglR0HGCMInternalCopyBackResult(pCallInfo, pHGCMCall, &ParmInfo, fIsUser, rc);
    896896            }
     897            else
     898                LogRel(("VbglR0HGCMInternalCall: vbglR0HGCMInternalDoCall failed. rc=%Rrc\n", rc));
    897899
    898900            if (!fLeakIt)
     
    900902        }
    901903    }
     904    else
     905        LogRel(("VbglR0HGCMInternalCall: vbglR0HGCMInternalPreprocessCall failed. rc=%Rrc\n", rc));
    902906
    903907    /*
     
    921925                                         PFNVBGLHGCMCALLBACK pfnAsyncCallback, void *pvAsyncData, uint32_t u32AsyncData)
    922926{
    923     VBoxGuestHGCMCallInfo   *pCallInfo64;
    924     HGCMFunctionParameter   *pParm64;
    925     HGCMFunctionParameter32 *pParm32;
    926     uint32_t                 cParms;
    927     uint32_t                 iParm;
    928     int rc;
     927    VBoxGuestHGCMCallInfo   *pCallInfo64 = NULL;
     928    HGCMFunctionParameter   *pParm64 = NULL;
     929    HGCMFunctionParameter32 *pParm32 = NULL;
     930    uint32_t                 cParms = 0;
     931    uint32_t                 iParm = 0;
     932    int                      rc = VINF_SUCCESS;
    929933
    930934    /*
     
    936940                    || !(fFlags & ~VBGLR0_HGCMCALL_F_MODE_MASK),
    937941                    ("pCallInfo=%p pfnAsyncCallback=%p fFlags=%#x\n", pCallInfo, pfnAsyncCallback, fFlags),
    938                     VERR_INVALID_PARAMETER);
     942                    VERR_INVALID_HANDLE);
    939943    AssertReturn(   cbCallInfo >= sizeof(VBoxGuestHGCMCallInfo)
    940944                 || cbCallInfo >= pCallInfo->cParms * sizeof(HGCMFunctionParameter32),
    941                  VERR_INVALID_PARAMETER);
    942     AssertReturn((fFlags & VBGLR0_HGCMCALL_F_MODE_MASK) == VBGLR0_HGCMCALL_F_KERNEL, VERR_INVALID_PARAMETER);
     945                 VERR_INVALID_MAGIC);
     946
     947    /* This Assert does not work on Solaris 64/32 mixed mode, not sure why, skipping for now */
     948#ifndef RT_OS_SOLARIS
     949    AssertReturn((fFlags & VBGLR0_HGCMCALL_F_MODE_MASK) == VBGLR0_HGCMCALL_F_KERNEL, VERR_WRONG_ORDER);
     950#endif
    943951
    944952    cParms = pCallInfo->cParms;
     
    979987            default:
    980988                rc = VERR_INVALID_PARAMETER;
     989                LogRel(("VbglR0HGCMInternalCall32: pParm32 type %#x invalid.\n", pParm32->type));
    981990                break;
    982991        }
     
    989998                                    pfnAsyncCallback, pvAsyncData, u32AsyncData);
    990999
    991         /*
    992          * Copy back.
    993          */
    994         for (iParm = 0; iParm < cParms; iParm++, pParm32++, pParm64++)
     1000        if (RT_SUCCESS(rc))
    9951001        {
    996             switch (pParm32->type)
     1002            *pCallInfo = *pCallInfo64;
     1003
     1004            /*
     1005             * Copy back.
     1006             */
     1007            pParm32 = VBOXGUEST_HGCM_CALL_PARMS32(pCallInfo);
     1008            pParm64 = VBOXGUEST_HGCM_CALL_PARMS(pCallInfo64);
     1009            for (iParm = 0; iParm < cParms; iParm++, pParm32++, pParm64++)
    9971010            {
    998                 case VMMDevHGCMParmType_32bit:
    999                     pParm32->u.value32 = pParm32->u.value32;
    1000                     break;
    1001 
    1002                 case VMMDevHGCMParmType_64bit:
    1003                     pParm32->u.value64 = pParm64->u.value64;
    1004                     break;
    1005 
    1006                 case VMMDevHGCMParmType_LinAddr_Out:
    1007                 case VMMDevHGCMParmType_LinAddr:
    1008                 case VMMDevHGCMParmType_LinAddr_In:
    1009                     pParm32->u.Pointer.size = pParm64->u.Pointer.size;
    1010                     break;
    1011 
    1012                 default:
    1013                     rc = VERR_INTERNAL_ERROR_3;
    1014                     break;
     1011                LogRel(("VbglR0HGCMInternalCall32: iParm=%d cParms=%d\n",iParm, cParms));
     1012                switch (pParm64->type)
     1013                {
     1014                    case VMMDevHGCMParmType_32bit:
     1015                        LogRel(("pParm32->u.value32=%d\n", pParm32->u.value32));
     1016                        pParm32->u.value32 = pParm64->u.value32;
     1017                        break;
     1018
     1019                    case VMMDevHGCMParmType_64bit:
     1020                        pParm32->u.value64 = pParm64->u.value64;
     1021                        break;
     1022
     1023                    case VMMDevHGCMParmType_LinAddr_Out:
     1024                    case VMMDevHGCMParmType_LinAddr:
     1025                    case VMMDevHGCMParmType_LinAddr_In:
     1026                        pParm32->u.Pointer.size = pParm64->u.Pointer.size;
     1027                        break;
     1028
     1029                    default:
     1030                        LogRel(("VbglR0HGCMInternalCall32: failed invalid pParm32 type %d\n", pParm32->type));
     1031                        rc = VERR_INTERNAL_ERROR_3;
     1032                        break;
     1033                }
    10151034            }
    10161035        }
    1017         *pCallInfo = *pCallInfo64;
    1018     }
     1036        else
     1037            LogRel(("VbglR0HGCMInternalCall32: VbglR0HGCMInternalCall failed. rc=%Rrc\n", rc));
     1038    }
     1039    else
     1040        LogRel(("VbglR0HGCMInternalCall32: failed. rc=%Rrc\n", rc));
    10191041
    10201042    RTMemTmpFree(pCallInfo64);
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