Changeset 44778 in vbox for trunk/src/VBox/Devices/VMMDev
- Timestamp:
- Feb 21, 2013 1:32:50 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 83890
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/VMMDev/VMMDev.cpp
r44774 r44778 2187 2187 2188 2188 2189 /** 2190 * @callback_method_impl{FNIOMIOPORTOUT, Port I/O Handler for the generic 2191 * request interface.} 2192 */ 2193 static DECLCALLBACK(int) vmmdevRequestHandler(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb) 2194 { 2195 PVMMDEV pThis = (VMMDevState*)pvUser; 2189 static int vmmdevReqDispatcher(PVMMDEV pThis, VMMDevRequestHeader *pReqHdr, RTGCPHYS GCPhysReqHdr) 2190 { 2196 2191 int rcRet = VINF_SUCCESS; 2197 PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY); 2198 2199 /* 2200 * The caller has passed the guest context physical address 2201 * of the request structure. Copy the request packet. 2202 */ 2203 VMMDevRequestHeader *pRequestHeader = NULL; 2204 VMMDevRequestHeader requestHeader; 2205 RT_ZERO(requestHeader); 2206 2207 PDMDevHlpPhysRead(pDevIns, (RTGCPHYS)u32, &requestHeader, sizeof(requestHeader)); 2208 2209 /* the structure size must be greater or equal to the header size */ 2210 if (requestHeader.size < sizeof(VMMDevRequestHeader)) 2211 { 2212 Log(("VMMDev request header size too small! size = %d\n", requestHeader.size)); 2213 rcRet = VINF_SUCCESS; 2214 goto l_end; /** @todo shouldn't (/ no need to) write back.*/ 2215 } 2216 2217 /* check the version of the header structure */ 2218 if (requestHeader.version != VMMDEV_REQUEST_HEADER_VERSION) 2219 { 2220 Log(("VMMDev: guest header version (0x%08X) differs from ours (0x%08X)\n", requestHeader.version, VMMDEV_REQUEST_HEADER_VERSION)); 2221 rcRet = VINF_SUCCESS; 2222 goto l_end; /** @todo shouldn't (/ no need to) write back.*/ 2223 } 2224 2225 Log2(("VMMDev request issued: %d\n", requestHeader.requestType)); 2226 2227 /* Newer additions starts with VMMDevReq_ReportGuestInfo2, older additions 2228 started with VMMDevReq_ReportGuestInfo. */ 2229 if ( !pThis->fu32AdditionsOk 2230 && requestHeader.requestType != VMMDevReq_ReportGuestInfo2 2231 && requestHeader.requestType != VMMDevReq_ReportGuestInfo 2232 && requestHeader.requestType != VMMDevReq_WriteCoreDump 2233 && requestHeader.requestType != VMMDevReq_GetHostVersion) /* Always allow the guest to query the host capabilities. */ 2234 { 2235 Log(("VMMDev: guest has not yet reported to us. Refusing operation of request #%d!\n", 2236 requestHeader.requestType)); 2237 requestHeader.rc = VERR_NOT_SUPPORTED; 2238 static int cRelWarn; 2239 if (cRelWarn < 10) 2240 { 2241 cRelWarn++; 2242 LogRel(("VMMDev: the guest has not yet reported to us -- refusing operation of request #%d\n", 2243 requestHeader.requestType)); 2244 } 2245 rcRet = VINF_SUCCESS; 2246 goto l_end; 2247 } 2248 2249 /* Check upper limit */ 2250 if (requestHeader.size > VMMDEV_MAX_VMMDEVREQ_SIZE) 2251 { 2252 static int cRelWarn; 2253 if (cRelWarn < 50) 2254 { 2255 cRelWarn++; 2256 LogRel(("VMMDev: request packet too big (%x). Refusing operation.\n", requestHeader.size)); 2257 } 2258 requestHeader.rc = VERR_NOT_SUPPORTED; 2259 rcRet = VINF_SUCCESS; 2260 goto l_end; 2261 } 2262 2263 /* Read the entire request packet */ 2264 pRequestHeader = (VMMDevRequestHeader *)RTMemAlloc(requestHeader.size); 2265 if (!pRequestHeader) 2266 { 2267 Log(("VMMDev: RTMemAlloc failed!\n")); 2268 rcRet = VINF_SUCCESS; 2269 requestHeader.rc = VERR_NO_MEMORY; 2270 goto l_end; 2271 } 2272 PDMDevHlpPhysRead(pDevIns, (RTGCPHYS)u32, pRequestHeader, requestHeader.size); 2273 2274 /* which request was sent? */ 2275 switch (pRequestHeader->requestType) 2192 2193 switch (pReqHdr->requestType) 2276 2194 { 2277 2195 case VMMDevReq_ReportGuestInfo: 2278 pReq uestHeader->rc = vmmdevReqHandler_ReportGuestInfo(pThis, pRequestHeader);2196 pReqHdr->rc = vmmdevReqHandler_ReportGuestInfo(pThis, pReqHdr); 2279 2197 break; 2280 2198 2281 2199 case VMMDevReq_ReportGuestInfo2: 2282 pReq uestHeader->rc = vmmdevReqHandler_ReportGuestInfo2(pThis, pRequestHeader);2200 pReqHdr->rc = vmmdevReqHandler_ReportGuestInfo2(pThis, pReqHdr); 2283 2201 break; 2284 2202 2285 2203 case VMMDevReq_ReportGuestStatus: 2286 pReq uestHeader->rc = vmmdevReqHandler_ReportGuestStatus(pThis, pRequestHeader);2204 pReqHdr->rc = vmmdevReqHandler_ReportGuestStatus(pThis, pReqHdr); 2287 2205 break; 2288 2206 2289 2207 case VMMDevReq_ReportGuestCapabilities: 2290 pReq uestHeader->rc = vmmdevReqHandler_ReportGuestCapabilities(pThis, pRequestHeader);2208 pReqHdr->rc = vmmdevReqHandler_ReportGuestCapabilities(pThis, pReqHdr); 2291 2209 break; 2292 2210 2293 2211 case VMMDevReq_SetGuestCapabilities: 2294 pReq uestHeader->rc = vmmdevReqHandler_SetGuestCapabilities(pThis, pRequestHeader);2212 pReqHdr->rc = vmmdevReqHandler_SetGuestCapabilities(pThis, pReqHdr); 2295 2213 break; 2296 2214 2297 2215 case VMMDevReq_WriteCoreDump: 2298 pReq uestHeader->rc = vmmdevReqHandler_WriteCoreDump(pThis, pRequestHeader);2216 pReqHdr->rc = vmmdevReqHandler_WriteCoreDump(pThis, pReqHdr); 2299 2217 break; 2300 2218 2301 2219 case VMMDevReq_GetMouseStatus: 2302 pReq uestHeader->rc = vmmdevReqHandler_GetMouseStatus(pThis, pRequestHeader);2220 pReqHdr->rc = vmmdevReqHandler_GetMouseStatus(pThis, pReqHdr); 2303 2221 break; 2304 2222 2305 2223 case VMMDevReq_SetMouseStatus: 2306 pReq uestHeader->rc = vmmdevReqHandler_SetMouseStatus(pThis, pRequestHeader);2224 pReqHdr->rc = vmmdevReqHandler_SetMouseStatus(pThis, pReqHdr); 2307 2225 break; 2308 2226 2309 2227 case VMMDevReq_SetPointerShape: 2310 pReq uestHeader->rc = vmmdevReqHandler_SetPointerShape(pThis, pRequestHeader);2228 pReqHdr->rc = vmmdevReqHandler_SetPointerShape(pThis, pReqHdr); 2311 2229 break; 2312 2230 2313 2231 case VMMDevReq_GetHostTime: 2314 pReq uestHeader->rc = vmmdevReqHandler_GetHostTime(pThis, pRequestHeader);2232 pReqHdr->rc = vmmdevReqHandler_GetHostTime(pThis, pReqHdr); 2315 2233 break; 2316 2234 2317 2235 case VMMDevReq_GetHypervisorInfo: 2318 pReq uestHeader->rc = vmmdevReqHandler_GetHypervisorInfo(pThis, pRequestHeader);2236 pReqHdr->rc = vmmdevReqHandler_GetHypervisorInfo(pThis, pReqHdr); 2319 2237 break; 2320 2238 2321 2239 case VMMDevReq_SetHypervisorInfo: 2322 pReq uestHeader->rc = vmmdevReqHandler_SetHypervisorInfo(pThis, pRequestHeader);2240 pReqHdr->rc = vmmdevReqHandler_SetHypervisorInfo(pThis, pReqHdr); 2323 2241 break; 2324 2242 2325 2243 case VMMDevReq_RegisterPatchMemory: 2326 pReq uestHeader->rc = vmmdevReqHandler_RegisterPatchMemory(pThis, pRequestHeader);2244 pReqHdr->rc = vmmdevReqHandler_RegisterPatchMemory(pThis, pReqHdr); 2327 2245 break; 2328 2246 2329 2247 case VMMDevReq_DeregisterPatchMemory: 2330 pReq uestHeader->rc = vmmdevReqHandler_DeregisterPatchMemory(pThis, pRequestHeader);2248 pReqHdr->rc = vmmdevReqHandler_DeregisterPatchMemory(pThis, pReqHdr); 2331 2249 break; 2332 2250 2333 2251 case VMMDevReq_SetPowerStatus: 2334 2252 { 2335 int rc = pReq uestHeader->rc = vmmdevReqHandler_SetPowerStatus(pThis, pRequestHeader);2253 int rc = pReqHdr->rc = vmmdevReqHandler_SetPowerStatus(pThis, pReqHdr); 2336 2254 if (rc != VINF_SUCCESS && RT_SUCCESS(rc)) 2337 2255 rcRet = rc; … … 2340 2258 2341 2259 case VMMDevReq_GetDisplayChangeRequest: 2342 pReq uestHeader->rc = vmmdevReqHandler_GetDisplayChangeRequest(pThis, pRequestHeader);2260 pReqHdr->rc = vmmdevReqHandler_GetDisplayChangeRequest(pThis, pReqHdr); 2343 2261 break; 2344 2262 2345 2263 case VMMDevReq_GetDisplayChangeRequest2: 2346 pReq uestHeader->rc = vmmdevReqHandler_GetDisplayChangeRequest2(pThis, pRequestHeader);2264 pReqHdr->rc = vmmdevReqHandler_GetDisplayChangeRequest2(pThis, pReqHdr); 2347 2265 break; 2348 2266 2349 2267 case VMMDevReq_GetDisplayChangeRequestEx: 2350 pReq uestHeader->rc = vmmdevReqHandler_GetDisplayChangeRequestEx(pThis, pRequestHeader);2268 pReqHdr->rc = vmmdevReqHandler_GetDisplayChangeRequestEx(pThis, pReqHdr); 2351 2269 break; 2352 2270 2353 2271 case VMMDevReq_VideoModeSupported: 2354 pReq uestHeader->rc = vmmdevReqHandler_VideoModeSupported(pThis, pRequestHeader);2272 pReqHdr->rc = vmmdevReqHandler_VideoModeSupported(pThis, pReqHdr); 2355 2273 break; 2356 2274 2357 2275 case VMMDevReq_VideoModeSupported2: 2358 pReq uestHeader->rc = vmmdevReqHandler_VideoModeSupported2(pThis, pRequestHeader);2276 pReqHdr->rc = vmmdevReqHandler_VideoModeSupported2(pThis, pReqHdr); 2359 2277 break; 2360 2278 2361 2279 case VMMDevReq_GetHeightReduction: 2362 pReq uestHeader->rc = vmmdevReqHandler_GetHeightReduction(pThis, pRequestHeader);2280 pReqHdr->rc = vmmdevReqHandler_GetHeightReduction(pThis, pReqHdr); 2363 2281 break; 2364 2282 2365 2283 case VMMDevReq_AcknowledgeEvents: 2366 pReq uestHeader->rc = vmmdevReqHandler_AcknowledgeEvents(pThis, pRequestHeader);2284 pReqHdr->rc = vmmdevReqHandler_AcknowledgeEvents(pThis, pReqHdr); 2367 2285 break; 2368 2286 2369 2287 case VMMDevReq_CtlGuestFilterMask: 2370 pReq uestHeader->rc = vmmdevReqHandler_CtlGuestFilterMask(pThis, pRequestHeader);2288 pReqHdr->rc = vmmdevReqHandler_CtlGuestFilterMask(pThis, pReqHdr); 2371 2289 break; 2372 2290 2373 2291 #ifdef VBOX_WITH_HGCM 2374 2292 case VMMDevReq_HGCMConnect: 2375 pReq uestHeader->rc = vmmdevReqHandler_HGCMConnect(pThis, pRequestHeader, u32);2293 pReqHdr->rc = vmmdevReqHandler_HGCMConnect(pThis, pReqHdr, GCPhysReqHdr); 2376 2294 break; 2377 2295 2378 2296 case VMMDevReq_HGCMDisconnect: 2379 pReq uestHeader->rc = vmmdevReqHandler_HGCMDisconnect(pThis, pRequestHeader, u32);2297 pReqHdr->rc = vmmdevReqHandler_HGCMDisconnect(pThis, pReqHdr, GCPhysReqHdr); 2380 2298 break; 2381 2299 … … 2386 2304 case VMMDevReq_HGCMCall: 2387 2305 # endif /* VBOX_WITH_64_BITS_GUESTS */ 2388 pReq uestHeader->rc = vmmdevReqHandler_HGCMCall(pThis, pRequestHeader, u32);2306 pReqHdr->rc = vmmdevReqHandler_HGCMCall(pThis, pReqHdr, GCPhysReqHdr); 2389 2307 break; 2390 2308 #endif /* VBOX_WITH_HGCM */ 2391 2309 2392 2310 case VMMDevReq_HGCMCancel: 2393 pReq uestHeader->rc = vmmdevReqHandler_HGCMCancel(pThis, pRequestHeader, u32);2311 pReqHdr->rc = vmmdevReqHandler_HGCMCancel(pThis, pReqHdr, GCPhysReqHdr); 2394 2312 break; 2395 2313 2396 2314 case VMMDevReq_HGCMCancel2: 2397 pReq uestHeader->rc = vmmdevReqHandler_HGCMCancel2(pThis, pRequestHeader);2315 pReqHdr->rc = vmmdevReqHandler_HGCMCancel2(pThis, pReqHdr); 2398 2316 break; 2399 2317 2400 2318 case VMMDevReq_VideoAccelEnable: 2401 pReq uestHeader->rc = vmmdevReqHandler_VideoAccelEnable(pThis, pRequestHeader);2319 pReqHdr->rc = vmmdevReqHandler_VideoAccelEnable(pThis, pReqHdr); 2402 2320 break; 2403 2321 2404 2322 case VMMDevReq_VideoAccelFlush: 2405 pReq uestHeader->rc = vmmdevReqHandler_VideoAccelFlush(pThis, pRequestHeader);2323 pReqHdr->rc = vmmdevReqHandler_VideoAccelFlush(pThis, pReqHdr); 2406 2324 break; 2407 2325 2408 2326 case VMMDevReq_VideoSetVisibleRegion: 2409 pReq uestHeader->rc = vmmdevReqHandler_VideoSetVisibleRegion(pThis, pRequestHeader);2327 pReqHdr->rc = vmmdevReqHandler_VideoSetVisibleRegion(pThis, pReqHdr); 2410 2328 break; 2411 2329 2412 2330 case VMMDevReq_GetSeamlessChangeRequest: 2413 pReq uestHeader->rc = vmmdevReqHandler_GetSeamlessChangeRequest(pThis, pRequestHeader);2331 pReqHdr->rc = vmmdevReqHandler_GetSeamlessChangeRequest(pThis, pReqHdr); 2414 2332 break; 2415 2333 2416 2334 case VMMDevReq_GetVRDPChangeRequest: 2417 pReq uestHeader->rc = vmmdevReqHandler_GetVRDPChangeRequest(pThis, pRequestHeader);2335 pReqHdr->rc = vmmdevReqHandler_GetVRDPChangeRequest(pThis, pReqHdr); 2418 2336 break; 2419 2337 2420 2338 case VMMDevReq_GetMemBalloonChangeRequest: 2421 pReq uestHeader->rc = vmmdevReqHandler_GetMemBalloonChangeRequest(pThis, pRequestHeader);2339 pReqHdr->rc = vmmdevReqHandler_GetMemBalloonChangeRequest(pThis, pReqHdr); 2422 2340 break; 2423 2341 2424 2342 case VMMDevReq_ChangeMemBalloon: 2425 pReq uestHeader->rc = vmmdevReqHandler_ChangeMemBalloon(pThis, pRequestHeader);2343 pReqHdr->rc = vmmdevReqHandler_ChangeMemBalloon(pThis, pReqHdr); 2426 2344 break; 2427 2345 2428 2346 case VMMDevReq_GetStatisticsChangeRequest: 2429 pReq uestHeader->rc = vmmdevReqHandler_GetStatisticsChangeRequest(pThis, pRequestHeader);2347 pReqHdr->rc = vmmdevReqHandler_GetStatisticsChangeRequest(pThis, pReqHdr); 2430 2348 break; 2431 2349 2432 2350 case VMMDevReq_ReportGuestStats: 2433 pReq uestHeader->rc = vmmdevReqHandler_ReportGuestStats(pThis, pRequestHeader);2351 pReqHdr->rc = vmmdevReqHandler_ReportGuestStats(pThis, pReqHdr); 2434 2352 break; 2435 2353 2436 2354 case VMMDevReq_QueryCredentials: 2437 pReq uestHeader->rc = vmmdevReqHandler_QueryCredentials(pThis, pRequestHeader);2355 pReqHdr->rc = vmmdevReqHandler_QueryCredentials(pThis, pReqHdr); 2438 2356 break; 2439 2357 2440 2358 case VMMDevReq_ReportCredentialsJudgement: 2441 pReq uestHeader->rc = vmmdevReqHandler_ReportCredentialsJudgement(pThis, pRequestHeader);2359 pReqHdr->rc = vmmdevReqHandler_ReportCredentialsJudgement(pThis, pReqHdr); 2442 2360 break; 2443 2361 2444 2362 case VMMDevReq_GetHostVersion: 2445 pReq uestHeader->rc = vmmdevReqHandler_GetHostVersion(pThis, pRequestHeader);2363 pReqHdr->rc = vmmdevReqHandler_GetHostVersion(pThis, pReqHdr); 2446 2364 break; 2447 2365 2448 2366 case VMMDevReq_GetCpuHotPlugRequest: 2449 pReq uestHeader->rc = vmmdevReqHandler_GetCpuHotPlugRequest(pThis, pRequestHeader);2367 pReqHdr->rc = vmmdevReqHandler_GetCpuHotPlugRequest(pThis, pReqHdr); 2450 2368 break; 2451 2369 2452 2370 case VMMDevReq_SetCpuHotPlugStatus: 2453 pReq uestHeader->rc = vmmdevReqHandler_SetCpuHotPlugStatus(pThis, pRequestHeader);2371 pReqHdr->rc = vmmdevReqHandler_SetCpuHotPlugStatus(pThis, pReqHdr); 2454 2372 break; 2455 2373 2456 2374 #ifdef VBOX_WITH_PAGE_SHARING 2457 2375 case VMMDevReq_RegisterSharedModule: 2458 pReq uestHeader->rc = vmmdevReqHandler_RegisterSharedModule(pDevIns, pRequestHeader);2376 pReqHdr->rc = vmmdevReqHandler_RegisterSharedModule(pDevIns, pReqHdr); 2459 2377 break; 2460 2378 2461 2379 case VMMDevReq_UnregisterSharedModule: 2462 pReq uestHeader->rc = vmmdevReqHandler_UnregisterSharedModule(pDevIns, pRequestHeader);2380 pReqHdr->rc = vmmdevReqHandler_UnregisterSharedModule(pDevIns, pReqHdr); 2463 2381 break; 2464 2382 2465 2383 case VMMDevReq_CheckSharedModules: 2466 pReq uestHeader->rc = vmmdevReqHandler_CheckSharedModules(pDevIns, pRequestHeader);2384 pReqHdr->rc = vmmdevReqHandler_CheckSharedModules(pDevIns, pReqHdr); 2467 2385 break; 2468 2386 2469 2387 case VMMDevReq_GetPageSharingStatus: 2470 pReq uestHeader->rc = vmmdevReqHandler_GetPageSharingStatus(pThis, pRequestHeader);2388 pReqHdr->rc = vmmdevReqHandler_GetPageSharingStatus(pThis, pReqHdr); 2471 2389 break; 2472 2390 2473 2391 case VMMDevReq_DebugIsPageShared: 2474 pReq uestHeader->rc = vmmdevReqHandler_DebugIsPageShared(pDevIns, pRequestHeader);2392 pReqHdr->rc = vmmdevReqHandler_DebugIsPageShared(pDevIns, pReqHdr); 2475 2393 break; 2476 2394 … … 2479 2397 #ifdef DEBUG 2480 2398 case VMMDevReq_LogString: 2481 pReq uestHeader->rc = vmmdevReqHandler_LogString(pThis, pRequestHeader);2399 pReqHdr->rc = vmmdevReqHandler_LogString(pThis, pReqHdr); 2482 2400 break; 2483 2401 #endif 2484 2402 2485 2403 case VMMDevReq_GetSessionId: 2486 pReq uestHeader->rc = vmmdevReqHandler_GetSessionId(pThis, pRequestHeader);2404 pReqHdr->rc = vmmdevReqHandler_GetSessionId(pThis, pReqHdr); 2487 2405 break; 2488 2406 2489 2407 /* 2490 * Guest wants to give up a timeslice 2491 * Note! this was only ever used by experimental GAs!2408 * Guest wants to give up a timeslice. 2409 * Note! This was only ever used by experimental GAs! 2492 2410 */ 2493 2411 /** @todo maybe we could just remove this? */ … … 2501 2419 default: 2502 2420 { 2503 pReq uestHeader->rc = VERR_NOT_IMPLEMENTED;2504 Log(("VMMDev unknown request type %d\n", pReq uestHeader->requestType));2421 pReqHdr->rc = VERR_NOT_IMPLEMENTED; 2422 Log(("VMMDev unknown request type %d\n", pReqHdr->requestType)); 2505 2423 break; 2506 2424 } 2507 2425 } 2508 2509 l_end: 2510 /* Write the result back to guest memory */ 2426 return rcRet; 2427 } 2428 2429 2430 /** 2431 * @callback_method_impl{FNIOMIOPORTOUT, Port I/O Handler for the generic 2432 * request interface.} 2433 */ 2434 static DECLCALLBACK(int) vmmdevRequestHandler(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb) 2435 { 2436 PVMMDEV pThis = (VMMDevState*)pvUser; 2437 2438 /* 2439 * The caller has passed the guest context physical address of the request 2440 * structure. Copy the request packet. 2441 */ 2442 VMMDevRequestHeader requestHeader; 2443 RT_ZERO(requestHeader); 2444 PDMDevHlpPhysRead(pDevIns, (RTGCPHYS)u32, &requestHeader, sizeof(requestHeader)); 2445 2446 /* the structure size must be greater or equal to the header size */ 2447 if (requestHeader.size < sizeof(VMMDevRequestHeader)) 2448 { 2449 Log(("VMMDev request header size too small! size = %d\n", requestHeader.size)); 2450 return VINF_SUCCESS; 2451 } 2452 2453 /* check the version of the header structure */ 2454 if (requestHeader.version != VMMDEV_REQUEST_HEADER_VERSION) 2455 { 2456 Log(("VMMDev: guest header version (0x%08X) differs from ours (0x%08X)\n", requestHeader.version, VMMDEV_REQUEST_HEADER_VERSION)); 2457 return VINF_SUCCESS; 2458 } 2459 2460 Log2(("VMMDev request issued: %d\n", requestHeader.requestType)); 2461 2462 int rcRet = VINF_SUCCESS; 2463 VMMDevRequestHeader *pRequestHeader = NULL; 2464 2465 if (requestHeader.size <= VMMDEV_MAX_VMMDEVREQ_SIZE) 2466 { 2467 PDMCritSectEnter(&pThis->CritSect, VERR_IGNORED); /** @todo could probably move this to after the 2nd memory read, maybe after fu32AdditionsOk making volatile, if feeling paranoid. */ 2468 2469 /* Newer additions starts with VMMDevReq_ReportGuestInfo2, older additions 2470 started with VMMDevReq_ReportGuestInfo. */ 2471 if ( pThis->fu32AdditionsOk 2472 || requestHeader.requestType == VMMDevReq_ReportGuestInfo2 2473 || requestHeader.requestType == VMMDevReq_ReportGuestInfo 2474 || requestHeader.requestType == VMMDevReq_WriteCoreDump 2475 || requestHeader.requestType == VMMDevReq_GetHostVersion) /* Always allow the guest to query the host capabilities. */ 2476 { 2477 /* 2478 * Read the entire request packet and feed it to the dispatcher function. 2479 */ 2480 pRequestHeader = (VMMDevRequestHeader *)RTMemAlloc(requestHeader.size); 2481 if (pRequestHeader) 2482 { 2483 PDMDevHlpPhysRead(pDevIns, (RTGCPHYS)u32, pRequestHeader, requestHeader.size); 2484 2485 rcRet = vmmdevReqDispatcher(pThis, pRequestHeader, u32); 2486 } 2487 else 2488 { 2489 Log(("VMMDev: RTMemAlloc failed!\n")); 2490 requestHeader.rc = VERR_NO_MEMORY; 2491 } 2492 } 2493 else 2494 { 2495 static int s_cRelWarn; 2496 if (s_cRelWarn < 10) 2497 { 2498 s_cRelWarn++; 2499 LogRel(("VMMDev: the guest has not yet reported to us -- refusing operation of request #%d\n", 2500 requestHeader.requestType)); 2501 } 2502 requestHeader.rc = VERR_NOT_SUPPORTED; 2503 } 2504 2505 PDMCritSectLeave(&pThis->CritSect); 2506 } 2507 else 2508 { 2509 static int s_cRelWarn; 2510 if (s_cRelWarn < 50) 2511 { 2512 s_cRelWarn++; 2513 LogRel(("VMMDev: request packet too big (%x). Refusing operation.\n", requestHeader.size)); 2514 } 2515 requestHeader.rc = VERR_NOT_SUPPORTED; 2516 } 2517 2518 /* 2519 * Write the result back to guest memory 2520 */ 2511 2521 if (pRequestHeader) 2512 2522 { 2513 PDMDevHlpPhysWrite(pDevIns, (RTGCPHYS)u32, pRequestHeader, pRequestHeader->size);2523 PDMDevHlpPhysWrite(pDevIns, u32, pRequestHeader, pRequestHeader->size); 2514 2524 RTMemFree(pRequestHeader); 2515 2525 } … … 2517 2527 { 2518 2528 /* early error case; write back header only */ 2519 PDMDevHlpPhysWrite(pDevIns, (RTGCPHYS)u32, &requestHeader, sizeof(requestHeader)); 2520 } 2521 2522 PDMCritSectLeave(&pThis->CritSect); 2529 PDMDevHlpPhysWrite(pDevIns, u32, &requestHeader, sizeof(requestHeader)); 2530 } 2531 2523 2532 return rcRet; 2524 2533 }
Note:
See TracChangeset
for help on using the changeset viewer.