Changeset 80014 in vbox for trunk/src/VBox/VMM/VMMR3/DBGFMem.cpp
- Timestamp:
- Jul 26, 2019 4:12:06 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/DBGFMem.cpp
r76553 r80014 63 63 if (!VALID_PTR(pHitAddress)) 64 64 return VERR_INVALID_POINTER; 65 if (DBGFADDRESS_IS_HMA(pAddress))66 return VERR_INVALID_POINTER;67 65 68 66 /* … … 161 159 162 160 /* 163 * HMA is special.161 * Select PGM worker by addressing mode. 164 162 */ 165 163 int rc; 166 if (DBGFADDRESS_IS_HMA(pAddress)) 167 { 168 if (DBGFADDRESS_IS_PHYS(pAddress)) 169 rc = VERR_INVALID_POINTER; 170 else 171 rc = MMR3HyperReadGCVirt(pVM, pvBuf, pAddress->FlatPtr, cbRead); 172 } 164 PVMCPU pVCpu = VMMGetCpuById(pVM, idCpu); 165 PGMMODE enmMode = PGMGetGuestMode(pVCpu); 166 if ( enmMode == PGMMODE_REAL 167 || enmMode == PGMMODE_PROTECTED 168 || DBGFADDRESS_IS_PHYS(pAddress) ) 169 rc = PGMPhysSimpleReadGCPhys(pVM, pvBuf, pAddress->FlatPtr, cbRead); 173 170 else 174 171 { 175 /*176 * Select PGM worker by addressing mode.177 */178 PVMCPU pVCpu = VMMGetCpuById(pVM, idCpu);179 PGMMODE enmMode = PGMGetGuestMode(pVCpu);180 if ( enmMode == PGMMODE_REAL181 || enmMode == PGMMODE_PROTECTED182 || DBGFADDRESS_IS_PHYS(pAddress) )183 rc = PGMPhysSimpleReadGCPhys(pVM, pvBuf, pAddress->FlatPtr, cbRead);184 else185 {186 172 #if GC_ARCH_BITS > 32 187 188 189 190 191 173 if ( ( pAddress->FlatPtr >= _4G 174 || pAddress->FlatPtr + cbRead > _4G) 175 && enmMode != PGMMODE_AMD64 176 && enmMode != PGMMODE_AMD64_NX) 177 return VERR_PAGE_TABLE_NOT_PRESENT; 192 178 #endif 193 rc = PGMPhysSimpleReadGCPtr(pVCpu, pvBuf, pAddress->FlatPtr, cbRead); 194 } 179 rc = PGMPhysSimpleReadGCPtr(pVCpu, pvBuf, pAddress->FlatPtr, cbRead); 195 180 } 196 181 return rc; … … 327 312 328 313 /* 329 * HMA is always special.314 * Select PGM function by addressing mode. 330 315 */ 331 316 int rc; 332 if (DBGFADDRESS_IS_HMA(pAddress)) 333 { 334 /** @todo write to HMA. */ 335 rc = VERR_ACCESS_DENIED; 336 } 317 PVMCPU pVCpu = VMMGetCpuById(pVM, idCpu); 318 PGMMODE enmMode = PGMGetGuestMode(pVCpu); 319 if ( enmMode == PGMMODE_REAL 320 || enmMode == PGMMODE_PROTECTED 321 || DBGFADDRESS_IS_PHYS(pAddress) ) 322 rc = PGMPhysSimpleWriteGCPhys(pVM, pAddress->FlatPtr, pvBuf, cbWrite); 337 323 else 338 324 { 339 /*340 * Select PGM function by addressing mode.341 */342 PVMCPU pVCpu = VMMGetCpuById(pVM, idCpu);343 PGMMODE enmMode = PGMGetGuestMode(pVCpu);344 if ( enmMode == PGMMODE_REAL345 || enmMode == PGMMODE_PROTECTED346 || DBGFADDRESS_IS_PHYS(pAddress) )347 rc = PGMPhysSimpleWriteGCPhys(pVM, pAddress->FlatPtr, pvBuf, cbWrite);348 else349 {350 325 #if GC_ARCH_BITS > 32 351 352 353 354 355 326 if ( ( pAddress->FlatPtr >= _4G 327 || pAddress->FlatPtr + cbWrite > _4G) 328 && enmMode != PGMMODE_AMD64 329 && enmMode != PGMMODE_AMD64_NX) 330 return VERR_PAGE_TABLE_NOT_PRESENT; 356 331 #endif 357 rc = PGMPhysSimpleWriteGCPtr(pVCpu, pAddress->FlatPtr, pvBuf, cbWrite); 358 } 332 rc = PGMPhysSimpleWriteGCPtr(pVCpu, pAddress->FlatPtr, pvBuf, cbWrite); 359 333 } 360 334 return rc; … … 392 366 * Make the query. 393 367 */ 394 int rc; 395 if (!(fFlags & DBGFSELQI_FLAGS_DT_SHADOW)) 396 { 397 PVMCPU pVCpu = VMMGetCpuById(pVM, idCpu); 398 VMCPU_ASSERT_EMT(pVCpu); 399 rc = SELMR3GetSelectorInfo(pVM, pVCpu, Sel, pSelInfo); 400 401 /* 402 * 64-bit mode HACKS for making data and stack selectors wide open when 403 * queried. This is voodoo magic. 404 */ 405 if (fFlags & DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE) 368 PVMCPU pVCpu = VMMGetCpuById(pVM, idCpu); 369 VMCPU_ASSERT_EMT(pVCpu); 370 int rc = SELMR3GetSelectorInfo(pVCpu, Sel, pSelInfo); 371 372 /* 373 * 64-bit mode HACKS for making data and stack selectors wide open when 374 * queried. This is voodoo magic. 375 */ 376 if (fFlags & DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE) 377 { 378 /* Expand 64-bit data and stack selectors. The check is a bit bogus... */ 379 if ( RT_SUCCESS(rc) 380 && (pSelInfo->fFlags & ( DBGFSELINFO_FLAGS_LONG_MODE | DBGFSELINFO_FLAGS_REAL_MODE | DBGFSELINFO_FLAGS_PROT_MODE 381 | DBGFSELINFO_FLAGS_GATE | DBGFSELINFO_FLAGS_HYPER 382 | DBGFSELINFO_FLAGS_INVALID | DBGFSELINFO_FLAGS_NOT_PRESENT)) 383 == DBGFSELINFO_FLAGS_LONG_MODE 384 && pSelInfo->cbLimit != ~(RTGCPTR)0 385 && CPUMIsGuestIn64BitCode(pVCpu) ) 406 386 { 407 /* Expand 64-bit data and stack selectors. The check is a bit bogus... */ 408 if ( RT_SUCCESS(rc) 409 && (pSelInfo->fFlags & ( DBGFSELINFO_FLAGS_LONG_MODE | DBGFSELINFO_FLAGS_REAL_MODE | DBGFSELINFO_FLAGS_PROT_MODE 410 | DBGFSELINFO_FLAGS_GATE | DBGFSELINFO_FLAGS_HYPER 411 | DBGFSELINFO_FLAGS_INVALID | DBGFSELINFO_FLAGS_NOT_PRESENT)) 412 == DBGFSELINFO_FLAGS_LONG_MODE 413 && pSelInfo->cbLimit != ~(RTGCPTR)0 414 && CPUMIsGuestIn64BitCode(pVCpu) ) 415 { 416 pSelInfo->GCPtrBase = 0; 417 pSelInfo->cbLimit = ~(RTGCPTR)0; 418 } 419 else if ( Sel == 0 420 && CPUMIsGuestIn64BitCode(pVCpu)) 421 { 422 pSelInfo->GCPtrBase = 0; 423 pSelInfo->cbLimit = ~(RTGCPTR)0; 424 pSelInfo->Sel = 0; 425 pSelInfo->SelGate = 0; 426 pSelInfo->fFlags = DBGFSELINFO_FLAGS_LONG_MODE; 427 pSelInfo->u.Raw64.Gen.u1Present = 1; 428 pSelInfo->u.Raw64.Gen.u1Long = 1; 429 pSelInfo->u.Raw64.Gen.u1DescType = 1; 430 rc = VINF_SUCCESS; 431 } 387 pSelInfo->GCPtrBase = 0; 388 pSelInfo->cbLimit = ~(RTGCPTR)0; 432 389 } 433 } 434 else 435 { 436 if (!VM_IS_RAW_MODE_ENABLED(pVM)) 437 rc = VERR_INVALID_STATE; 438 else 439 rc = SELMR3GetShadowSelectorInfo(pVM, Sel, pSelInfo); 390 else if ( Sel == 0 391 && CPUMIsGuestIn64BitCode(pVCpu)) 392 { 393 pSelInfo->GCPtrBase = 0; 394 pSelInfo->cbLimit = ~(RTGCPTR)0; 395 pSelInfo->Sel = 0; 396 pSelInfo->SelGate = 0; 397 pSelInfo->fFlags = DBGFSELINFO_FLAGS_LONG_MODE; 398 pSelInfo->u.Raw64.Gen.u1Present = 1; 399 pSelInfo->u.Raw64.Gen.u1Long = 1; 400 pSelInfo->u.Raw64.Gen.u1DescType = 1; 401 rc = VINF_SUCCESS; 402 } 440 403 } 441 404 return rc; … … 473 436 UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE); 474 437 AssertReturn(idCpu < pUVM->cCpus, VERR_INVALID_CPU_ID); 475 AssertReturn(!(fFlags & ~(DBGFSELQI_FLAGS_DT_GUEST | DBGFSELQI_FLAGS_DT_SHADOW | DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE)), VERR_INVALID_PARAMETER); 476 AssertReturn( (fFlags & (DBGFSELQI_FLAGS_DT_SHADOW | DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE)) 477 != (DBGFSELQI_FLAGS_DT_SHADOW | DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE), VERR_INVALID_PARAMETER); 438 AssertReturn(!(fFlags & ~(DBGFSELQI_FLAGS_DT_GUEST | DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE)), VERR_INVALID_PARAMETER); 478 439 479 440 /* Clear the return data here on this thread. */
Note:
See TracChangeset
for help on using the changeset viewer.