VirtualBox

Ignore:
Timestamp:
Apr 4, 2008 12:48:18 PM (17 years ago)
Author:
vboxsync
Message:

Moved WP check to the right place; fixes stuck boot of XP with hwaccm enable

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r7730 r7739  
    522522            STAM_PROFILE_STOP(&pVM->pgm.s.StatHandlers, b);
    523523
    524             /* Check to see if we need to emulate the instruction as X86_CR0_WP has been cleared. */
    525             if (    CPUMGetGuestCPL(pVM, pRegFrame) == 0
    526                 &&  ((CPUMGetGuestCR0(pVM) & (X86_CR0_WP|X86_CR0_PG)) == X86_CR0_PG)
    527                 &&  (uErr & X86_TRAP_PF_RW))
    528             {
    529                 uint64_t fPageGst;
    530                 rc = PGMGstGetPage(pVM, pvFault, &fPageGst, NULL);
    531                 if (    VBOX_SUCCESS(rc)
    532                     && !(fPageGst & X86_PTE_RW))
    533                 {
    534                     rc = PGMInterpretInstruction(pVM, pRegFrame, pvFault);
    535                     if (VBOX_SUCCESS(rc))
    536                         STAM_COUNTER_INC(&pVM->pgm.s.StatTrap0eWPEmulGC);
    537                     else
    538                         STAM_COUNTER_INC(&pVM->pgm.s.StatTrap0eWPEmulR3);
    539                     return rc;
    540                 }
    541                 else
    542                     AssertFailed(); /* This shouldn't happen; the above check is paranoid. */
    543             }
    544 
    545524# ifdef PGM_OUT_OF_SYNC_IN_GC
    546525            /*
     
    697676                        return VINF_SUCCESS;
    698677                    }
     678
     679                    /* Check to see if we need to emulate the instruction as X86_CR0_WP has been cleared. */
     680                    if (    CPUMGetGuestCPL(pVM, pRegFrame) == 0
     681                        &&  ((CPUMGetGuestCR0(pVM) & (X86_CR0_WP|X86_CR0_PG)) == X86_CR0_PG)
     682                        &&  (uErr & (X86_TRAP_PF_RW | X86_TRAP_PF_P)) == (X86_TRAP_PF_RW | X86_TRAP_PF_P))
     683                    {
     684                        uint64_t fPageGst;
     685                        rc = PGMGstGetPage(pVM, pvFault, &fPageGst, NULL);
     686                        if (    VBOX_SUCCESS(rc)
     687                            && !(fPageGst & X86_PTE_RW))
     688                        {
     689                            rc = PGMInterpretInstruction(pVM, pRegFrame, pvFault);
     690                            if (VBOX_SUCCESS(rc))
     691                                STAM_COUNTER_INC(&pVM->pgm.s.StatTrap0eWPEmulGC);
     692                            else
     693                                STAM_COUNTER_INC(&pVM->pgm.s.StatTrap0eWPEmulR3);
     694                            return rc;
     695                        }
     696                        else
     697                            AssertMsgFailed(("Unexpected r/w page %x flag=%x\n", pvFault, (uint32_t)fPageGst));
     698                    }
     699
    699700                }
    700701
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