VirtualBox

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


忽略:
時間撮記:
2017-3-27 上午10:25:29 (8 年 以前)
作者:
vboxsync
訊息:

REM: Do not mess with the TSS busy flag in CPU. Make sure that when loading TSS, the busy flag is set, not cleared. (bugref:8818)

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

圖例:

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

    r64655 r66262  
    24042404    pVM->rem.s.Env.tr.limit       = pCtx->tr.u32Limit;
    24052405    pVM->rem.s.Env.tr.flags       = (pCtx->tr.Attr.u & SEL_FLAGS_SMASK) << SEL_FLAGS_SHIFT;
    2406     /* Note! do_interrupt will fault if the busy flag is still set... */ /** @todo so fix do_interrupt then! */
    2407     pVM->rem.s.Env.tr.flags      &= ~DESC_TSS_BUSY_MASK;
    24082406
    24092407    /*
     
    27132711        ||  pCtx->tr.u64Base  != pVM->rem.s.Env.tr.base
    27142712        ||  pCtx->tr.u32Limit != pVM->rem.s.Env.tr.limit
    2715             /* Qemu and AMD/Intel have different ideas about the busy flag ... */ /** @todo just fix qemu! */
    2716         ||  pCtx->tr.Attr.u   != (  (pVM->rem.s.Env.tr.flags >> SEL_FLAGS_SHIFT) & (SEL_FLAGS_SMASK & ~DESC_INTEL_UNUSABLE)
    2717                                   ? (pVM->rem.s.Env.tr.flags | DESC_TSS_BUSY_MASK) >> SEL_FLAGS_SHIFT
    2718                                   : 0)
     2713        ||  pCtx->tr.Attr.u   != ((pVM->rem.s.Env.tr.flags >> SEL_FLAGS_SHIFT) & SEL_FLAGS_SMASK)
    27192714        ||  !(pCtx->tr.fFlags & CPUMSELREG_FLAGS_VALID)
    27202715       )
     
    27232718             pCtx->tr.Sel, pCtx->tr.u64Base, pCtx->tr.u32Limit, pCtx->tr.Attr.u,
    27242719             pVM->rem.s.Env.tr.selector, (uint64_t)pVM->rem.s.Env.tr.base, pVM->rem.s.Env.tr.limit,
    2725              (pVM->rem.s.Env.tr.flags >> SEL_FLAGS_SHIFT) & (SEL_FLAGS_SMASK & ~DESC_INTEL_UNUSABLE)
    2726              ? (pVM->rem.s.Env.tr.flags | DESC_TSS_BUSY_MASK) >> SEL_FLAGS_SHIFT : 0));
     2720             pVM->rem.s.Env.tr.flags >> SEL_FLAGS_SHIFT));
    27272721        pCtx->tr.Sel        = pVM->rem.s.Env.tr.selector;
    27282722        pCtx->tr.ValidSel   = pVM->rem.s.Env.tr.selector;
     
    27312725        pCtx->tr.u32Limit   = pVM->rem.s.Env.tr.limit;
    27322726        pCtx->tr.Attr.u     = (pVM->rem.s.Env.tr.flags >> SEL_FLAGS_SHIFT) & SEL_FLAGS_SMASK;
    2733         if (pCtx->tr.Attr.u & ~DESC_INTEL_UNUSABLE)
    2734             pCtx->tr.Attr.u |= DESC_TSS_BUSY_MASK >> SEL_FLAGS_SHIFT;
     2727        Assert(pCtx->tr.Attr.u & ~DESC_INTEL_UNUSABLE);
    27352728        STAM_COUNTER_INC(&gStatREMTRChange);
    27362729#ifdef VBOX_WITH_RAW_MODE
     
    29692962        ||  pCtx->tr.u64Base  != pVM->rem.s.Env.tr.base
    29702963        ||  pCtx->tr.u32Limit != pVM->rem.s.Env.tr.limit
    2971             /* Qemu and AMD/Intel have different ideas about the busy flag ... */
    2972         ||  pCtx->tr.Attr.u   != (  (pVM->rem.s.Env.tr.flags >> SEL_FLAGS_SHIFT) & (SEL_FLAGS_SMASK & ~DESC_INTEL_UNUSABLE)
    2973                                   ? (pVM->rem.s.Env.tr.flags | DESC_TSS_BUSY_MASK) >> SEL_FLAGS_SHIFT
    2974                                   : 0)
     2964        ||  pCtx->tr.Attr.u   != ((pVM->rem.s.Env.tr.flags >> SEL_FLAGS_SHIFT) & SEL_FLAGS_SMASK)
    29752965        ||  !(pCtx->tr.fFlags & CPUMSELREG_FLAGS_VALID)
    29762966       )
     
    29792969             pCtx->tr.Sel, pCtx->tr.u64Base, pCtx->tr.u32Limit, pCtx->tr.Attr.u,
    29802970             pVM->rem.s.Env.tr.selector, (uint64_t)pVM->rem.s.Env.tr.base, pVM->rem.s.Env.tr.limit,
    2981              (pVM->rem.s.Env.tr.flags >> SEL_FLAGS_SHIFT) & (SEL_FLAGS_SMASK & ~DESC_INTEL_UNUSABLE)
    2982              ? (pVM->rem.s.Env.tr.flags | DESC_TSS_BUSY_MASK) >> SEL_FLAGS_SHIFT : 0));
     2971             pVM->rem.s.Env.tr.flags >> SEL_FLAGS_SHIFT));
    29832972        pCtx->tr.Sel        = pVM->rem.s.Env.tr.selector;
    29842973        pCtx->tr.ValidSel   = pVM->rem.s.Env.tr.selector;
     
    29872976        pCtx->tr.u32Limit   = pVM->rem.s.Env.tr.limit;
    29882977        pCtx->tr.Attr.u     = (pVM->rem.s.Env.tr.flags >> SEL_FLAGS_SHIFT) & SEL_FLAGS_SMASK;
    2989         if (pCtx->tr.Attr.u & ~DESC_INTEL_UNUSABLE)
    2990             pCtx->tr.Attr.u |= DESC_TSS_BUSY_MASK >> SEL_FLAGS_SHIFT;
     2978        Assert(pCtx->tr.Attr.u & ~DESC_INTEL_UNUSABLE);
    29912979        STAM_COUNTER_INC(&gStatREMTRChange);
    29922980#ifdef VBOX_WITH_RAW_MODE
  • trunk/src/recompiler/target-i386/op_helper.c

    r58562 r66262  
    311311        cpu_abort(env, "invalid tss");
    312312    type = (env->tr.flags >> DESC_TYPE_SHIFT) & 0xf;
    313     if ((type & 7) != 1)
     313    if ((type & 7) != 3)
    314314        cpu_abort(env, "invalid tss type");
    315315    shift = type >> 3;
     
    596596    env->tr.flags = e2 & ~DESC_TSS_BUSY_MASK;
    597597#else
    598     env->tr.flags = e2 & (DESC_RAW_FLAG_BITS & ~(DESC_TSS_BUSY_MASK)); /** @todo stop clearing the busy bit, VT-x and AMD-V seems to set it in the hidden bits. */
     598    env->tr.flags = (e2 | DESC_TSS_BUSY_MASK) & DESC_RAW_FLAG_BITS;
    599599    env->tr.fVBoxFlags  = CPUMSELREG_FLAGS_VALID;
    600600    env->tr.newselector = 0;
     
    704704    /* TSS must be a valid 32 bit one */
    705705    if (!(env->tr.flags & DESC_P_MASK) ||
    706         ((env->tr.flags >> DESC_TYPE_SHIFT) & 0xf) != 9 ||
     706        ((env->tr.flags >> DESC_TYPE_SHIFT) & 0xf) != 11 ||
    707707        env->tr.limit < 103)
    708708        goto fail;
     
    11271127    /* TSS must be a valid 32 bit one */
    11281128    if (!(env->tr.flags & DESC_P_MASK) ||
    1129         ((env->tr.flags >> DESC_TYPE_SHIFT) & 0xf) != 9 ||
     1129        ((env->tr.flags >> DESC_TYPE_SHIFT) & 0xf) != 11 ||
    11301130        env->tr.limit < 103)
    11311131        goto fail;
     
    26392639            load_seg_cache_raw_dt(&env->tr, e1, e2);
    26402640        }
     2641        env->tr.flags |= DESC_TSS_BUSY_MASK;
    26412642        e2 |= DESC_TSS_BUSY_MASK;
    26422643        stl_kernel(ptr + 4, e2);
     
    61236124        cpu_abort(env, "invalid tss");
    61246125    type = (env->tr.flags >> DESC_TYPE_SHIFT) & 0xf;
    6125     if ((type & 7) != 1)
     6126    if ((type & 7) != 3)
    61266127        cpu_abort(env, "invalid tss type %d", type);
    61276128    shift = type >> 3;
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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