VirtualBox

Changeset 4680 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Sep 10, 2007 4:07:34 PM (17 years ago)
Author:
vboxsync
Message:

PGMPhysGCPtr2HCPtr -> PGMPhysGCPtr2GCPhys + PGMPhysGCPhys2CCPtr + PGMPhysGCPhys2CCPtrRelease

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/TRPMAll.cpp

    r4071 r4680  
    476476            RTGCPTR   pHandler, dummy;
    477477            GCPTRTYPE(uint32_t *) pTrapStackGC;
    478 #ifndef IN_GC
    479             HCPTRTYPE(uint32_t *) pTrapStackHC;
    480 #endif
    481478
    482479            pHandler = (RTGCPTR)((GuestIdte.Gen.u16OffsetHigh << 16) | GuestIdte.Gen.u16OffsetLow);
     
    583580                 * Build trap stack frame on guest handler's stack
    584581                 */
     582                uint32_t *pTrapStack;
    585583#ifdef IN_GC
    586584                Assert(eflags.Bits.u1VM || (pRegFrame->ss & X86_SEL_RPL) != 0);
    587585                /* Check maximum amount we need (10 when executing in V86 mode) */
    588586                rc = PGMVerifyAccess(pVM, (RTGCUINTPTR)pTrapStackGC - 10*sizeof(uint32_t), 10 * sizeof(uint32_t), X86_PTE_RW);
     587                pTrapStack = pTrapStackGC;
    589588#else
    590589                Assert(eflags.Bits.u1VM || (pRegFrame->ss & X86_SEL_RPL) == 0 || (pRegFrame->ss & X86_SEL_RPL) == 3);
    591590                /* Check maximum amount we need (10 when executing in V86 mode) */
    592                 if (    PAGE_ADDRESS(pTrapStackGC) != PAGE_ADDRESS(pTrapStackGC - 10*sizeof(uint32_t)) /* fail if we cross a page boundary */
    593                     ||  VBOX_FAILURE((rc = PGMPhysGCPtr2HCPtr(pVM, pTrapStackGC, (PRTHCPTR)&pTrapStackHC)))
    594                    )
     591                if ((pTrapStackGC >> PAGE_SHIFT) != ((pTrapStackGC - 10*sizeof(uint32_t)) >> PAGE_SHIFT)) /* fail if we cross a page boundary */
     592                    goto failure;
     593
     594                RTGCPHYS GCPhysStack;
     595                rc = PGMPhysGCPtr2GCPhys(pVM, pTrapStackGC, &GCPhysStack);
     596                if (VBOX_SUCCESS(rc))
     597                    rc = PGMPhysGCPhys2CCPtr(pVM, GCPhysStack, (void **)&pTrapStack);
     598                if (VBOX_FAILURE(rc))
    595599                {
    596600                    AssertRC(rc);
     
    604608                    {
    605609                        Log(("TRAP%02X: (VM) Handler %04X:%08X Stack %04X:%08X RPL=%d CR2=%08X\n", iGate, GuestIdte.Gen.u16SegSel, pHandler, ss_r0, esp_r0, (pRegFrame->ss & X86_SEL_RPL), pVM->trpm.s.uActiveCR2));
    606                         CTXSUFF(pTrapStack)[--idx] = pRegFrame->gs;
    607                         CTXSUFF(pTrapStack)[--idx] = pRegFrame->fs;
    608                         CTXSUFF(pTrapStack)[--idx] = pRegFrame->ds;
    609                         CTXSUFF(pTrapStack)[--idx] = pRegFrame->es;
     610                        pTrapStack[--idx] = pRegFrame->gs;
     611                        pTrapStack[--idx] = pRegFrame->fs;
     612                        pTrapStack[--idx] = pRegFrame->ds;
     613                        pTrapStack[--idx] = pRegFrame->es;
    610614
    611615                        /* clear ds, es, fs & gs in current context */
     
    618622                    {
    619623                        if ((pRegFrame->ss & X86_SEL_RPL) == 1 && !eflags.Bits.u1VM)
    620                             CTXSUFF(pTrapStack)[--idx] = pRegFrame->ss & ~1;    /* Mask away traces of raw ring execution (ring 1). */
     624                            pTrapStack[--idx] = pRegFrame->ss & ~1;    /* Mask away traces of raw ring execution (ring 1). */
    621625                        else
    622                             CTXSUFF(pTrapStack)[--idx] = pRegFrame->ss;
    623 
    624                         CTXSUFF(pTrapStack)[--idx] = pRegFrame->esp;
     626                            pTrapStack[--idx] = pRegFrame->ss;
     627
     628                        pTrapStack[--idx] = pRegFrame->esp;
    625629                    }
    626630
    627631                    /* Note: We use the eflags copy, that includes the virtualized bits! */
    628632                    /* Note: Not really necessary as we grab include those bits in the trap/irq handler trampoline */
    629                     CTXSUFF(pTrapStack)[--idx] = eflags.u32;
     633                    pTrapStack[--idx] = eflags.u32;
    630634
    631635                    if ((pRegFrame->cs & X86_SEL_RPL) == 1 && !eflags.Bits.u1VM)
    632                         CTXSUFF(pTrapStack)[--idx] = pRegFrame->cs & ~1;    /* Mask away traces of raw ring execution (ring 1). */
     636                        pTrapStack[--idx] = pRegFrame->cs & ~1;    /* Mask away traces of raw ring execution (ring 1). */
    633637                    else
    634                         CTXSUFF(pTrapStack)[--idx] = pRegFrame->cs;
     638                        pTrapStack[--idx] = pRegFrame->cs;
    635639
    636640                    if (enmType == TRPM_SOFTWARE_INT)
    637641                    {
    638642                        Assert(opsize);
    639                         CTXSUFF(pTrapStack)[--idx] = pRegFrame->eip + opsize;    /* return address = next instruction */
     643                        pTrapStack[--idx] = pRegFrame->eip + opsize;    /* return address = next instruction */
    640644                    }
    641645                    else
    642                         CTXSUFF(pTrapStack)[--idx] = pRegFrame->eip;
     646                        pTrapStack[--idx] = pRegFrame->eip;
    643647
    644648                    if (enmError == TRPM_TRAP_HAS_ERRORCODE)
    645649                    {
    646                         CTXSUFF(pTrapStack)[--idx] = pVM->trpm.s.uActiveErrorCode;
     650                        pTrapStack[--idx] = pVM->trpm.s.uActiveErrorCode;
    647651                    }
    648652
     
    656660                    for (int j=idx;j<0;j++)
    657661                    {
    658                         LogFlow(("Stack %VGv pos %02d: %08x\n", &CTXSUFF(pTrapStack)[j], j, CTXSUFF(pTrapStack)[j]));
     662                        LogFlow(("Stack %VGv pos %02d: %08x\n", &pTrapStack[j], j, pTrapStack[j]));
    659663                    }
    660664                    const char *pszPrefix = "";
     
    706710                    pRegFrame->ss         = ss_r0 & ~X86_SEL_RPL;     /* set rpl to ring 0 */
    707711                    STAM_PROFILE_ADV_STOP(CTXSUFF(&pVM->trpm.s.StatForwardProf), a);
     712                    PGMPhysGCPhys2CCPtrRelease(pVM, GCPhysStack, pTrapStack);
    708713                    return VINF_SUCCESS;
    709714#endif
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