vbox的更動 66262 路徑 trunk/src/recompiler
- 時間撮記:
- 2017-3-27 上午10:25:29 (8 年 以前)
- 位置:
- trunk/src/recompiler
- 檔案:
-
- 修改 2 筆資料
圖例:
- 未更動
- 新增
- 刪除
-
trunk/src/recompiler/VBoxRecompiler.c
r64655 r66262 2404 2404 pVM->rem.s.Env.tr.limit = pCtx->tr.u32Limit; 2405 2405 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;2408 2406 2409 2407 /* … … 2713 2711 || pCtx->tr.u64Base != pVM->rem.s.Env.tr.base 2714 2712 || 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) 2719 2714 || !(pCtx->tr.fFlags & CPUMSELREG_FLAGS_VALID) 2720 2715 ) … … 2723 2718 pCtx->tr.Sel, pCtx->tr.u64Base, pCtx->tr.u32Limit, pCtx->tr.Attr.u, 2724 2719 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)); 2727 2721 pCtx->tr.Sel = pVM->rem.s.Env.tr.selector; 2728 2722 pCtx->tr.ValidSel = pVM->rem.s.Env.tr.selector; … … 2731 2725 pCtx->tr.u32Limit = pVM->rem.s.Env.tr.limit; 2732 2726 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); 2735 2728 STAM_COUNTER_INC(&gStatREMTRChange); 2736 2729 #ifdef VBOX_WITH_RAW_MODE … … 2969 2962 || pCtx->tr.u64Base != pVM->rem.s.Env.tr.base 2970 2963 || 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) 2975 2965 || !(pCtx->tr.fFlags & CPUMSELREG_FLAGS_VALID) 2976 2966 ) … … 2979 2969 pCtx->tr.Sel, pCtx->tr.u64Base, pCtx->tr.u32Limit, pCtx->tr.Attr.u, 2980 2970 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)); 2983 2972 pCtx->tr.Sel = pVM->rem.s.Env.tr.selector; 2984 2973 pCtx->tr.ValidSel = pVM->rem.s.Env.tr.selector; … … 2987 2976 pCtx->tr.u32Limit = pVM->rem.s.Env.tr.limit; 2988 2977 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); 2991 2979 STAM_COUNTER_INC(&gStatREMTRChange); 2992 2980 #ifdef VBOX_WITH_RAW_MODE -
trunk/src/recompiler/target-i386/op_helper.c
r58562 r66262 311 311 cpu_abort(env, "invalid tss"); 312 312 type = (env->tr.flags >> DESC_TYPE_SHIFT) & 0xf; 313 if ((type & 7) != 1)313 if ((type & 7) != 3) 314 314 cpu_abort(env, "invalid tss type"); 315 315 shift = type >> 3; … … 596 596 env->tr.flags = e2 & ~DESC_TSS_BUSY_MASK; 597 597 #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; 599 599 env->tr.fVBoxFlags = CPUMSELREG_FLAGS_VALID; 600 600 env->tr.newselector = 0; … … 704 704 /* TSS must be a valid 32 bit one */ 705 705 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 || 707 707 env->tr.limit < 103) 708 708 goto fail; … … 1127 1127 /* TSS must be a valid 32 bit one */ 1128 1128 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 || 1130 1130 env->tr.limit < 103) 1131 1131 goto fail; … … 2639 2639 load_seg_cache_raw_dt(&env->tr, e1, e2); 2640 2640 } 2641 env->tr.flags |= DESC_TSS_BUSY_MASK; 2641 2642 e2 |= DESC_TSS_BUSY_MASK; 2642 2643 stl_kernel(ptr + 4, e2); … … 6123 6124 cpu_abort(env, "invalid tss"); 6124 6125 type = (env->tr.flags >> DESC_TYPE_SHIFT) & 0xf; 6125 if ((type & 7) != 1)6126 if ((type & 7) != 3) 6126 6127 cpu_abort(env, "invalid tss type %d", type); 6127 6128 shift = type >> 3;
注意:
瀏覽 TracChangeset
來幫助您使用更動檢視器