Changeset 22105 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Aug 8, 2009 2:54:59 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 50854
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/DBGFAddr.cpp
r19463 r22105 69 69 { 70 70 DBGFSELINFO SelInfo; 71 int rc = DBGFR3SelQueryInfo(pVM, idCpu, Sel, DBGFSELQI_FLAGS_DT_GUEST , &SelInfo);71 int rc = DBGFR3SelQueryInfo(pVM, idCpu, Sel, DBGFSELQI_FLAGS_DT_GUEST | DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE, &SelInfo); 72 72 if (RT_FAILURE(rc)) 73 73 return rc; -
trunk/src/VBox/VMM/DBGFMem.cpp
r20868 r22105 403 403 */ 404 404 int rc; 405 if (!(fFlags & DBGFSELQI_FLAGS_DT_ GUEST))405 if (!(fFlags & DBGFSELQI_FLAGS_DT_SHADOW)) 406 406 { 407 407 PVMCPU pVCpu = VMMGetCpuById(pVM, idCpu); 408 408 VMCPU_ASSERT_EMT(pVCpu); 409 409 rc = SELMR3GetSelectorInfo(pVM, pVCpu, Sel, pSelInfo); 410 411 /* 412 * 64-bit mode HACKS for making data and stack selectors wide open when 413 * queried. This is voodoo magic. 414 */ 415 if (fFlags & DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE) 416 { 417 /* Expand 64-bit data and stack selectors. The check is a bit bogus... */ 418 if ( RT_SUCCESS(rc) 419 && (pSelInfo->fFlags & ( DBGFSELINFO_FLAGS_LONG_MODE | DBGFSELINFO_FLAGS_REAL_MODE | DBGFSELINFO_FLAGS_PROT_MODE 420 | DBGFSELINFO_FLAGS_GATE | DBGFSELINFO_FLAGS_HYPER 421 | DBGFSELINFO_FLAGS_INVALID | DBGFSELINFO_FLAGS_NOT_PRESENT)) 422 == DBGFSELINFO_FLAGS_LONG_MODE 423 && pSelInfo->cbLimit != ~(RTGCPTR)0 424 && CPUMIsGuestIn64BitCode(pVCpu, CPUMGetGuestCtxCore(pVCpu)) ) 425 { 426 pSelInfo->GCPtrBase = 0; 427 pSelInfo->cbLimit = ~(RTGCPTR)0; 428 } 429 else if ( Sel == 0 430 && CPUMIsGuestIn64BitCode(pVCpu, CPUMGetGuestCtxCore(pVCpu))) 431 { 432 pSelInfo->GCPtrBase = 0; 433 pSelInfo->cbLimit = ~(RTGCPTR)0; 434 pSelInfo->Sel = 0; 435 pSelInfo->SelGate = 0; 436 pSelInfo->fFlags = DBGFSELINFO_FLAGS_LONG_MODE; 437 pSelInfo->u.Raw64.Gen.u1Present = 1; 438 pSelInfo->u.Raw64.Gen.u1Long = 1; 439 pSelInfo->u.Raw64.Gen.u1DescType = 1; 440 rc = VINF_SUCCESS; 441 } 442 } 410 443 } 411 444 else … … 449 482 { 450 483 AssertReturn(idCpu < pVM->cCPUs, VERR_INVALID_PARAMETER); 451 AssertReturn(!(fFlags & ~(DBGFSELQI_FLAGS_DT_GUEST | DBGFSELQI_FLAGS_DT_SHADOW)), VERR_INVALID_PARAMETER); 484 AssertReturn(!(fFlags & ~(DBGFSELQI_FLAGS_DT_GUEST | DBGFSELQI_FLAGS_DT_SHADOW | DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE)), VERR_INVALID_PARAMETER); 485 AssertReturn( (fFlags & (DBGFSELQI_FLAGS_DT_SHADOW | DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE)) 486 != (DBGFSELQI_FLAGS_DT_SHADOW | DBGFSELQI_FLAGS_DT_ADJ_64BIT_MODE), VERR_INVALID_PARAMETER); 452 487 453 488 /* Clear the return data here on this thread. */ -
trunk/src/VBox/VMM/SELM.cpp
r22104 r22105 2055 2055 if (Desc.Gen.u1DescType) 2056 2056 { 2057 /* 2058 * 64-bit code selectors are wide open, it's not possible to detect 2059 * 64-bit data or stack selectors without also dragging in assumptions 2060 * about current CS (i.e. that's we're executing in 64-bit mode). So, 2061 * the selinfo user needs to deal with this in the context the info is 2062 * used unfortunately. 2063 */ 2057 2064 if ( Desc.Gen.u1Long 2058 2065 && !Desc.Gen.u1DefBig 2059 2066 && (Desc.Gen.u4Type & X86_SEL_TYPE_CODE)) 2060 2067 { 2061 /* 64-bit code selectors are wide open. It's not possible to 2062 detect 64-bit data or stack selectors without also dragging 2063 in assumptions about current CS. So, the selinfo user needs 2064 to deal with this in the context the info is used unfortunately. 2065 Note. We ignore the segment limit hacks that was added by AMD. */ 2068 /* Note! We ignore the segment limit hacks that was added by AMD. */ 2066 2069 pSelInfo->GCPtrBase = 0; 2067 2070 pSelInfo->cbLimit = ~(RTGCUINTPTR)0;
Note:
See TracChangeset
for help on using the changeset viewer.