VirtualBox

vbox的更動 47709 路徑 trunk/src/recompiler


忽略:
時間撮記:
2013-8-13 下午07:34:18 (11 年 以前)
作者:
vboxsync
訊息:

REM: Attempt at better selector attribute handling, to avoid further weird bits turning up.

位置:
trunk/src/recompiler
檔案:
修改 3 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/recompiler/VBoxRecompiler.c

    r47550 r47709  
    46144614    uint32_t u32 = 0;
    46154615    int rc = IOMIOPortRead(env->pVM, env->pVCpu, (RTIOPORT)addr, &u32, 1);
     4616if (addr == 0x01f0) RTLogPrintf("ins: %#06x -> %#04x %d\n", addr, u32, rc);
    46164617    if (RT_LIKELY(rc == VINF_SUCCESS))
    46174618    {
     
    46344635    uint32_t u32 = 0;
    46354636    int rc = IOMIOPortRead(env->pVM, env->pVCpu, (RTIOPORT)addr, &u32, 2);
     4637if (addr == 0x01f0) RTLogPrintf("ins: %#06x -> %#06x %d\n", addr, u32, rc);
    46364638    if (RT_LIKELY(rc == VINF_SUCCESS))
    46374639    {
     
    46534655    uint32_t u32 = 0;
    46544656    int rc = IOMIOPortRead(env->pVM, env->pVCpu, (RTIOPORT)addr, &u32, 4);
     4657if (addr == 0x01f0) RTLogPrintf("ins: %#06x -> %#010x %d\n", addr, u32, rc);
    46554658    if (RT_LIKELY(rc == VINF_SUCCESS))
    46564659    {
  • trunk/src/recompiler/target-i386/cpu.h

    r47678 r47709  
    117117#define DESC_TSS_BUSY_MASK (1 << 9)
    118118#ifdef VBOX
    119 # define DESC_INTEL_UNUSABLE    RT_BIT_32(16+8) /**< Internal VT-x bit for NULL sectors. */
     119# define DESC_INTEL_UNUSABLE    RT_BIT_32(16+8)      /**< Internal VT-x bit for NULL sectors. */
     120# define DESC_RAW_FLAG_BITS     UINT32_C(0x00ffffff) /**< Flag bits we load from the descriptor. */
    120121#endif
    121122
     
    934935/* this function must always be used to load data in the segment
    935936   cache: it synchronizes the hflags with the segment cache values */
     937#ifndef VBOX
    936938static inline void cpu_x86_load_seg_cache(CPUX86State *env,
    937939                                          int seg_reg, unsigned int selector,
     
    939941                                          unsigned int limit,
    940942                                          unsigned int flags)
     943#else
     944static inline void cpu_x86_load_seg_cache_with_clean_flags(CPUX86State *env,
     945                                                           int seg_reg, unsigned int selector,
     946                                                           target_ulong base,
     947                                                           unsigned int limit,
     948                                                           unsigned int flags)
     949#endif
    941950{
    942951    SegmentCache *sc;
     
    947956    sc->base = base;
    948957    sc->limit = limit;
    949 #ifndef VBOX
    950958    sc->flags = flags;
    951 #else
    952     if (flags & DESC_P_MASK)
    953     {
    954         flags |= DESC_A_MASK;           /* Make sure the A bit is set to avoid trouble. */
    955         flags &= ~DESC_INTEL_UNUSABLE;
    956     }
    957     else if (selector < 4U)
    958         flags |= DESC_INTEL_UNUSABLE;
    959     else
    960         flags &= ~DESC_INTEL_UNUSABLE;
    961     sc->flags = flags;
     959#ifdef VBOX
    962960    sc->newselector = 0;
    963961    sc->fVBoxFlags  = CPUMSELREG_FLAGS_VALID;
     
    10061004}
    10071005
     1006#ifdef VBOX
     1007/* Raw input, adjust the flags adding the stupid intel flag when applicable. */
     1008static inline void cpu_x86_load_seg_cache(CPUX86State *env,
     1009                                          int seg_reg, unsigned int selector,
     1010                                          target_ulong base,
     1011                                          unsigned int limit,
     1012                                          unsigned int flags)
     1013{
     1014    flags &= DESC_RAW_FLAG_BITS;
     1015    if (flags & DESC_P_MASK)
     1016        flags |= DESC_A_MASK;           /* Make sure the A bit is set to avoid trouble. */
     1017    else if (selector < 4U)
     1018        flags |= DESC_INTEL_UNUSABLE;
     1019    cpu_x86_load_seg_cache_with_clean_flags(env, seg_reg, selector, base, limit, flags);
     1020}
     1021#endif
     1022
    10081023static inline void cpu_x86_load_seg_cache_sipi(CPUX86State *env,
    10091024                                               int sipi_vector)
  • trunk/src/recompiler/target-i386/op_helper.c

    r47666 r47709  
    272272    sc->base = get_seg_base(e1, e2);
    273273    sc->limit = get_seg_limit(e1, e2);
     274#ifndef VBOX
    274275    sc->flags = e2;
    275 #ifdef VBOX
    276     sc->flags &= ~DESC_INTEL_UNUSABLE;
     276#else
     277    sc->flags = e2 & DESC_RAW_FLAG_BITS;
    277278    sc->newselector = 0;
    278279    sc->fVBoxFlags  = CPUMSELREG_FLAGS_VALID;
     
    25832584        env->tr.limit = 0;
    25842585        env->tr.flags = 0;
    2585 #ifdef VBOX
     2586#ifdef VBOX /** @todo can TR really be 0? If so, what're the hidden attributes? */
    25862587        env->tr.flags = DESC_INTEL_UNUSABLE;
    25872588        env->tr.fVBoxFlags  = CPUMSELREG_FLAGS_VALID;
     
    26772678            e2 = DESC_INTEL_UNUSABLE;
    26782679        }
    2679         cpu_x86_load_seg_cache(env, seg_reg, selector, 0, 0, e2);
     2680        cpu_x86_load_seg_cache_with_clean_flags(env, seg_reg, selector, 0, 0, e2);
    26802681#endif
    26812682    } else {
     
    33553356                if (!(e2 & DESC_A_MASK))
    33563357                    e2 = set_segment_accessed(new_cs, e2);
    3357                 cpu_x86_load_seg_cache(env, R_SS, new_ss,
    3358                                        0, 0xffffffff,
    3359                                        DESC_INTEL_UNUSABLE | (rpl << DESC_DPL_SHIFT) );
     3358                cpu_x86_load_seg_cache_with_clean_flags(env, R_SS, new_ss,
     3359                                                        0, 0xffffffff,
     3360                                                        DESC_INTEL_UNUSABLE | (rpl << DESC_DPL_SHIFT) );
    33603361                ss_e2 = DESC_B_MASK; /* not really used */
    33613362            } else
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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