VirtualBox

Changeset 73323 in vbox


Ignore:
Timestamp:
Jul 23, 2018 2:06:19 PM (7 years ago)
Author:
vboxsync
Message:

NEM/win: Deal with DRx state import assertions if DR7 isn't already imported (recalc hyper DRx). bugref:9044

Location:
trunk/src/VBox/VMM
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/NEMAllNativeTemplate-win.cpp.h

    r73282 r73323  
    591591
    592592    /* Debug registers. */
     593    if (fWhat & CPUMCTX_EXTRN_DR7)
     594        aenmNames[iReg++] = WHvX64RegisterDr7;
    593595    if (fWhat & CPUMCTX_EXTRN_DR0_DR3)
    594596    {
     597        if (!(fWhat & CPUMCTX_EXTRN_DR7) && (pVCpu->cpum.GstCtx.fExtrn & CPUMCTX_EXTRN_DR7))
     598        {
     599            fWhat |= CPUMCTX_EXTRN_DR7;
     600            aenmNames[iReg++] = WHvX64RegisterDr7;
     601        }
    595602        aenmNames[iReg++] = WHvX64RegisterDr0;
    596603        aenmNames[iReg++] = WHvX64RegisterDr1;
     
    600607    if (fWhat & CPUMCTX_EXTRN_DR6)
    601608        aenmNames[iReg++] = WHvX64RegisterDr6;
    602     if (fWhat & CPUMCTX_EXTRN_DR7)
    603         aenmNames[iReg++] = WHvX64RegisterDr7;
    604609
    605610    /* Floating point state. */
     
    889894
    890895    /* Debug registers. */
    891     /** @todo fixme */
     896    if (fWhat & CPUMCTX_EXTRN_DR7)
     897    {
     898        Assert(aenmNames[iReg] == WHvX64RegisterDr7);
     899        if (pVCpu->cpum.GstCtx.dr[7] != aValues[iReg].Reg64)
     900            CPUMSetGuestDR7(pVCpu, aValues[iReg].Reg64);
     901        pVCpu->cpum.GstCtx.fExtrn &= ~CPUMCTX_EXTRN_DR7; /* Hack alert! Avoids asserting when processing CPUMCTX_EXTRN_DR0_DR3. */
     902        iReg++;
     903    }
    892904    if (fWhat & CPUMCTX_EXTRN_DR0_DR3)
    893905    {
     
    912924        if (pVCpu->cpum.GstCtx.dr[6] != aValues[iReg].Reg64)
    913925            CPUMSetGuestDR6(pVCpu, aValues[iReg].Reg64);
    914         iReg++;
    915     }
    916     if (fWhat & CPUMCTX_EXTRN_DR7)
    917     {
    918         Assert(aenmNames[iReg] == WHvX64RegisterDr7);
    919         if (pVCpu->cpum.GstCtx.dr[7] != aValues[iReg].Reg64)
    920             CPUMSetGuestDR7(pVCpu, aValues[iReg].Reg64);
    921926        iReg++;
    922927    }
  • trunk/src/VBox/VMM/VMMR0/NEMR0Native-win.cpp

    r73282 r73323  
    14191419
    14201420    /* Debug registers. */
     1421    if (fWhat & CPUMCTX_EXTRN_DR7)
     1422        pInput->Names[iReg++] = HvX64RegisterDr7;
    14211423    if (fWhat & CPUMCTX_EXTRN_DR0_DR3)
    14221424    {
     1425        if (!(fWhat & CPUMCTX_EXTRN_DR7) && (pCtx->fExtrn & CPUMCTX_EXTRN_DR7))
     1426        {
     1427            fWhat |= CPUMCTX_EXTRN_DR7;
     1428            pInput->Names[iReg++] = HvX64RegisterDr7;
     1429        }
    14231430        pInput->Names[iReg++] = HvX64RegisterDr0;
    14241431        pInput->Names[iReg++] = HvX64RegisterDr1;
     
    14281435    if (fWhat & CPUMCTX_EXTRN_DR6)
    14291436        pInput->Names[iReg++] = HvX64RegisterDr6;
    1430     if (fWhat & CPUMCTX_EXTRN_DR7)
    1431         pInput->Names[iReg++] = HvX64RegisterDr7;
    14321437
    14331438    /* Floating point state. */
     
    17651770
    17661771    /* Debug registers. */
    1767 /** @todo fixme */
    1768 /** @todo There are recalc issues here. Recalc will get register content and
    1769  * that may assert since we doesn't clear CPUMCTX_EXTRN_ until the end. */
     1772    if (fWhat & CPUMCTX_EXTRN_DR7)
     1773    {
     1774        Assert(pInput->Names[iReg] == HvX64RegisterDr7);
     1775        if (pCtx->dr[7] != paValues[iReg].Reg64)
     1776            CPUMSetGuestDR7(pVCpu, paValues[iReg].Reg64);
     1777        pCtx->fExtrn &= ~CPUMCTX_EXTRN_DR7; /* Hack alert! Avoids asserting when processing CPUMCTX_EXTRN_DR0_DR3. */
     1778        iReg++;
     1779    }
    17701780    if (fWhat & CPUMCTX_EXTRN_DR0_DR3)
    17711781    {
     
    17901800        if (pCtx->dr[6] != paValues[iReg].Reg64)
    17911801            CPUMSetGuestDR6(pVCpu, paValues[iReg].Reg64);
    1792         iReg++;
    1793     }
    1794     if (fWhat & CPUMCTX_EXTRN_DR7)
    1795     {
    1796         Assert(pInput->Names[iReg] == HvX64RegisterDr7);
    1797         if (pCtx->dr[7] != paValues[iReg].Reg64)
    1798             CPUMSetGuestDR7(pVCpu, paValues[iReg].Reg64);
    17991802        iReg++;
    18001803    }
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