VirtualBox

Changeset 1078 in vbox for trunk/src/recompiler/target-i386


Ignore:
Timestamp:
Feb 28, 2007 8:24:49 AM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
18970
Message:

Fixes for V86 segment syncing. (+ cleanup)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette