VirtualBox

Changeset 1078 in vbox


Ignore:
Timestamp:
Feb 28, 2007 8:24:49 AM (18 years ago)
Author:
vboxsync
Message:

Fixes for V86 segment syncing. (+ cleanup)

Location:
trunk/src/recompiler
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/recompiler/VBoxRecompiler.c

    r1057 r1078  
    5555#include <iprt/string.h>
    5656
    57 ////#define VBOX_RAW_V86
    5857
    5958/* Don't wanna include everything. */
     
    17551754        {
    17561755            Log2(("REMR3State: SS changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_SS].selector, pCtx->ss));
    1757             if (pCtx->eflags.Bits.u1VM == 1)
     1756
     1757            cpu_x86_set_cpl(&pVM->rem.s.Env, (pCtx->eflags.Bits.u1VM) ? 3 : (pCtx->ss & 3));
     1758            sync_seg(&pVM->rem.s.Env, R_SS, pCtx->ss);
     1759#ifdef VBOX_WITH_STATISTICS
     1760            if (pVM->rem.s.Env.segs[R_SS].newselector)
    17581761            {
    1759                 cpu_x86_set_cpl(&pVM->rem.s.Env, 3);
    1760                 pVM->rem.s.Env.segs[R_SS].selector = (uint16_t)pCtx->ss;
     1762                STAM_COUNTER_INC(&gStatSelOutOfSync[R_SS]);
    17611763            }
    1762             else
    1763             {
    1764                 cpu_x86_set_cpl(&pVM->rem.s.Env, pCtx->ss & 3);
    1765                 sync_seg(&pVM->rem.s.Env, R_SS, pCtx->ss);
    1766 #ifdef VBOX_WITH_STATISTICS
    1767                 if (pVM->rem.s.Env.segs[R_SS].newselector)
    1768                 {
    1769                     STAM_COUNTER_INC(&gStatSelOutOfSync[R_SS]);
    1770                 }
    17711764#endif
    1772             }
    17731765        }
    17741766        else
     
    17781770        {
    17791771            Log2(("REMR3State: ES changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_ES].selector, pCtx->es));
    1780             if (pCtx->eflags.Bits.u1VM == 1)
     1772            sync_seg(&pVM->rem.s.Env, R_ES, pCtx->es);
     1773#ifdef VBOX_WITH_STATISTICS
     1774            if (pVM->rem.s.Env.segs[R_ES].newselector)
    17811775            {
    1782                 pVM->rem.s.Env.segs[R_ES].selector = (uint16_t)pCtx->es;
     1776                STAM_COUNTER_INC(&gStatSelOutOfSync[R_ES]);
    17831777            }
    1784             else
    1785             {
    1786                 sync_seg(&pVM->rem.s.Env, R_ES, pCtx->es);
    1787 #ifdef VBOX_WITH_STATISTICS
    1788                 if (pVM->rem.s.Env.segs[R_ES].newselector)
    1789                 {
    1790                     STAM_COUNTER_INC(&gStatSelOutOfSync[R_ES]);
    1791                 }
    17921778#endif
    1793             }
    17941779        }
    17951780        else
     
    17991784        {
    18001785            Log2(("REMR3State: CS changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_CS].selector, pCtx->cs));
    1801             if (pCtx->eflags.Bits.u1VM == 1)
     1786            sync_seg(&pVM->rem.s.Env, R_CS, pCtx->cs);
     1787#ifdef VBOX_WITH_STATISTICS
     1788            if (pVM->rem.s.Env.segs[R_CS].newselector)
    18021789            {
    1803                 pVM->rem.s.Env.segs[R_CS].selector = (uint16_t)pCtx->cs;
     1790                STAM_COUNTER_INC(&gStatSelOutOfSync[R_CS]);
    18041791            }
    1805             else
    1806             {
    1807                 sync_seg(&pVM->rem.s.Env, R_CS, pCtx->cs);
    1808 #ifdef VBOX_WITH_STATISTICS
    1809                 if (pVM->rem.s.Env.segs[R_CS].newselector)
    1810                 {
    1811                     STAM_COUNTER_INC(&gStatSelOutOfSync[R_CS]);
    1812                 }
    18131792#endif
    1814             }
    18151793        }
    18161794        else
     
    18201798        {
    18211799            Log2(("REMR3State: DS changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_DS].selector, pCtx->ds));
    1822             if (pCtx->eflags.Bits.u1VM == 1)
     1800            sync_seg(&pVM->rem.s.Env, R_DS, pCtx->ds);
     1801#ifdef VBOX_WITH_STATISTICS
     1802            if (pVM->rem.s.Env.segs[R_DS].newselector)
    18231803            {
    1824                 pVM->rem.s.Env.segs[R_DS].selector = (uint16_t)pCtx->ds;
     1804                STAM_COUNTER_INC(&gStatSelOutOfSync[R_DS]);
    18251805            }
    1826             else
    1827             {
    1828                 sync_seg(&pVM->rem.s.Env, R_DS, pCtx->ds);
    1829 #ifdef VBOX_WITH_STATISTICS
    1830                 if (pVM->rem.s.Env.segs[R_DS].newselector)
    1831                 {
    1832                     STAM_COUNTER_INC(&gStatSelOutOfSync[R_DS]);
    1833                 }
    18341806#endif
    1835             }
    18361807        }
    18371808        else
     
    18431814        {
    18441815            Log2(("REMR3State: FS changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_FS].selector, pCtx->fs));
    1845             if (pCtx->eflags.Bits.u1VM == 1)
     1816            sync_seg(&pVM->rem.s.Env, R_FS, pCtx->fs);
     1817#ifdef VBOX_WITH_STATISTICS
     1818            if (pVM->rem.s.Env.segs[R_FS].newselector)
    18461819            {
    1847                 pVM->rem.s.Env.segs[R_FS].selector = (uint16_t)pCtx->fs;
     1820                STAM_COUNTER_INC(&gStatSelOutOfSync[R_FS]);
    18481821            }
    1849             else
    1850             {
    1851                 sync_seg(&pVM->rem.s.Env, R_FS, pCtx->fs);
    1852 #ifdef VBOX_WITH_STATISTICS
    1853                 if (pVM->rem.s.Env.segs[R_FS].newselector)
    1854                 {
    1855                     STAM_COUNTER_INC(&gStatSelOutOfSync[R_FS]);
    1856                 }
    18571822#endif
    1858             }
    18591823        }
    18601824        else
     
    18641828        {
    18651829            Log2(("REMR3State: GS changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_GS].selector, pCtx->gs));
    1866             if (pCtx->eflags.Bits.u1VM == 1)
     1830            sync_seg(&pVM->rem.s.Env, R_GS, pCtx->gs);
     1831#ifdef VBOX_WITH_STATISTICS
     1832            if (pVM->rem.s.Env.segs[R_GS].newselector)
    18671833            {
    1868                 pVM->rem.s.Env.segs[R_GS].selector = (uint16_t)pCtx->gs;
     1834                STAM_COUNTER_INC(&gStatSelOutOfSync[R_GS]);
    18691835            }
    1870             else
    1871             {
    1872                 sync_seg(&pVM->rem.s.Env, R_GS, pCtx->gs);
    1873 #ifdef VBOX_WITH_STATISTICS
    1874                 if (pVM->rem.s.Env.segs[R_GS].newselector)
    1875                 {
    1876                     STAM_COUNTER_INC(&gStatSelOutOfSync[R_GS]);
    1877                 }
    18781836#endif
    1879             }
    18801837        }
    18811838        else
  • trunk/src/recompiler/target-i386/helper.c

    r1 r1078  
    37303730    CPUX86State *savedenv = env;
    37313731    env = env1;
    3732 #ifdef VBOX
    3733     if (setjmp(env1->jmp_env) == 0)
     3732
     3733    if (env->eflags & X86_EFL_VM)
    37343734    {
    3735 #endif
    3736     if (seg_reg == R_CS)
    3737     {
    3738         uint32_t e1, e2;
    3739         load_segment(&e1, &e2, selector);
    3740         cpu_x86_load_seg_cache(env, R_CS, selector,
    3741                        get_seg_base(e1, e2),
    3742                        get_seg_limit(e1, e2),
    3743                        e2);
    3744     }
    3745     else
    3746         load_seg(seg_reg, selector);
    3747     env = savedenv;
    3748 
    3749 #ifdef VBOX
     3735        load_seg_vm(seg_reg, selector);
     3736
     3737        env = savedenv;
     3738
    37503739        /* Successful sync. */
    37513740        env1->segs[seg_reg].newselector = 0;
    37523741    }
    3753     else 
     3742    else
    37543743    {
    3755         env = savedenv;
    3756 
    3757         /* Postpone sync until the guest uses the selector. */
    3758         env1->segs[seg_reg].selector    = selector;     /* hidden values are now incorrect, but will be resynced when this register is accessed. */
    3759         env1->segs[seg_reg].newselector = selector;
     3744        if (setjmp(env1->jmp_env) == 0)
     3745        {
     3746            if (seg_reg == R_CS)
     3747            {
     3748                uint32_t e1, e2;
     3749                load_segment(&e1, &e2, selector);
     3750                cpu_x86_load_seg_cache(env, R_CS, selector,
     3751                               get_seg_base(e1, e2),
     3752                               get_seg_limit(e1, e2),
     3753                               e2);
     3754            }
     3755            else
     3756                load_seg(seg_reg, selector);
     3757            env = savedenv;
     3758
     3759            /* Successful sync. */
     3760            env1->segs[seg_reg].newselector = 0;
     3761        }
     3762        else
     3763        {
     3764            env = savedenv;
     3765
     3766            /* Postpone sync until the guest uses the selector. */
     3767            env1->segs[seg_reg].selector    = selector;     /* hidden values are now incorrect, but will be resynced when this register is accessed. */
     3768            env1->segs[seg_reg].newselector = selector;
    37603769#ifdef VBOX_STRICT
    3761         printf("sync_seg: out of sync seg_reg=%d selector=%#x\n", seg_reg, selector);
    3762 #endif
    3763     }
    3764 #endif
     3770            printf("sync_seg: out of sync seg_reg=%d selector=%#x\n", seg_reg, selector);
     3771#endif
     3772        }
     3773    }
    37653774
    37663775}
     
    37773786    CPUX86State *saved_env = env;
    37783787    target_ulong saved_T0 = T0;
    3779 #ifdef VBOX
    37803788    if (setjmp(env1->jmp_env) == 0)
    37813789    {
    3782 #endif
    37833790        env = env1;
    37843791        T0 = selector;
     
    37863793        T0 = saved_T0;
    37873794        env = saved_env;
    3788 #ifdef VBOX
    37893795    }
    37903796    else
     
    37963802#endif
    37973803    }
    3798 #endif
    37993804}
    38003805
     
    41694174//*****************************************************************************
    41704175
    4171 #endif
    4172 
     4176#endif /* VBOX */
     4177
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