diff --git a/repos/ports/ports/virtualbox.hash b/repos/ports/ports/virtualbox.hash index 14571b6c4..35b0c24a3 100644 --- a/repos/ports/ports/virtualbox.hash +++ b/repos/ports/ports/virtualbox.hash @@ -1 +1 @@ -b925f6284e93e4865b1ee6a4b1e8c63e4e9611e0 +8b8762f34e586d96ec89085422452342c6908f80 diff --git a/repos/ports/ports/virtualbox5.hash b/repos/ports/ports/virtualbox5.hash index c185491d2..4d562db2b 100644 --- a/repos/ports/ports/virtualbox5.hash +++ b/repos/ports/ports/virtualbox5.hash @@ -1 +1 @@ -cc217111ff4444b66fb90dd688c09cefce6e4110 +720a329b2f1eb7b71e8b3c7542b9f744224d370a diff --git a/repos/ports/src/virtualbox/patches/rem_tss.patch b/repos/ports/src/virtualbox/patches/rem_tss.patch new file mode 100644 index 000000000..e1a74c78b --- /dev/null +++ b/repos/ports/src/virtualbox/patches/rem_tss.patch @@ -0,0 +1,34 @@ +--- a/src/app/virtualbox/src/recompiler/VBoxRecompiler.c +--- b/src/app/virtualbox/src/recompiler/VBoxRecompiler.c +@@ -2664,13 +2664,14 @@ + #endif + } + ++ bool busy_set = ((pCtx->tr.Attr.u & SEL_FLAGS_SMASK) << SEL_FLAGS_SHIFT) & DESC_TSS_BUSY_MASK; + if ( pCtx->tr.Sel != pVM->rem.s.Env.tr.selector + || pCtx->tr.ValidSel != pVM->rem.s.Env.tr.selector + || pCtx->tr.u64Base != pVM->rem.s.Env.tr.base + || pCtx->tr.u32Limit != pVM->rem.s.Env.tr.limit + /* Qemu and AMD/Intel have different ideas about the busy flag ... */ /** @todo just fix qemu! */ + || pCtx->tr.Attr.u != ( (pVM->rem.s.Env.tr.flags >> SEL_FLAGS_SHIFT) & (SEL_FLAGS_SMASK & ~DESC_INTEL_UNUSABLE) +- ? (pVM->rem.s.Env.tr.flags | DESC_TSS_BUSY_MASK) >> SEL_FLAGS_SHIFT ++ ? (pVM->rem.s.Env.tr.flags | (busy_set ? DESC_TSS_BUSY_MASK : 0)) >> SEL_FLAGS_SHIFT + : 0) + || !(pCtx->tr.fFlags & CPUMSELREG_FLAGS_VALID) + ) +@@ -2905,13 +2906,14 @@ + #endif + } + ++ bool busy_set = ((pCtx->tr.Attr.u & SEL_FLAGS_SMASK) << SEL_FLAGS_SHIFT) & DESC_TSS_BUSY_MASK; + if ( pCtx->tr.Sel != pVM->rem.s.Env.tr.selector + || pCtx->tr.ValidSel != pVM->rem.s.Env.tr.selector + || pCtx->tr.u64Base != pVM->rem.s.Env.tr.base + || pCtx->tr.u32Limit != pVM->rem.s.Env.tr.limit + /* Qemu and AMD/Intel have different ideas about the busy flag ... */ + || pCtx->tr.Attr.u != ( (pVM->rem.s.Env.tr.flags >> SEL_FLAGS_SHIFT) & (SEL_FLAGS_SMASK & ~DESC_INTEL_UNUSABLE) +- ? (pVM->rem.s.Env.tr.flags | DESC_TSS_BUSY_MASK) >> SEL_FLAGS_SHIFT ++ ? (pVM->rem.s.Env.tr.flags | (busy_set ? DESC_TSS_BUSY_MASK : 0)) >> SEL_FLAGS_SHIFT + : 0) + || !(pCtx->tr.fFlags & CPUMSELREG_FLAGS_VALID) + ) diff --git a/repos/ports/src/virtualbox/patches/series_common b/repos/ports/src/virtualbox/patches/series_common index f838bcb62..e3b8265ca 100644 --- a/repos/ports/src/virtualbox/patches/series_common +++ b/repos/ports/src/virtualbox/patches/series_common @@ -15,3 +15,4 @@ tm_retries.patch vmdk.patch tm_tpr.patch tm_4s.patch +rem_tss.patch diff --git a/repos/ports/src/virtualbox/spec/muen/sup.cc b/repos/ports/src/virtualbox/spec/muen/sup.cc index 8f66e6496..ad090537c 100644 --- a/repos/ports/src/virtualbox/spec/muen/sup.cc +++ b/repos/ports/src/virtualbox/spec/muen/sup.cc @@ -320,7 +320,6 @@ inline void check_vm_state(PVMCPU pVCpu, struct Subject_state *cur_state) Assert(cur_state->ldtr.base == pCtx->ldtr.u64Base); if(cur_state->ldtr.sel != 0) Assert(cur_state->ldtr.access == pCtx->ldtr.Attr.u); - Assert(pCtx->tr.Attr.u & X86_SEL_TYPE_SYS_TSS_BUSY_MASK); { Assert(cur_state->tr.sel == pCtx->tr.Sel); Assert(cur_state->tr.limit == pCtx->tr.u32Limit); @@ -455,7 +454,6 @@ int SUPR3CallVMMR0Fast(PVMR0 pVMR0, unsigned uOperation, VMCPUID idCpu) cur_state->ldtr.base = pCtx->ldtr.u64Base; cur_state->ldtr.access = pCtx->ldtr.Attr.u; } - Assert(pCtx->tr.Attr.u & X86_SEL_TYPE_SYS_TSS_BUSY_MASK); { cur_state->tr.sel = pCtx->tr.Sel; cur_state->tr.limit = pCtx->tr.u32Limit; diff --git a/repos/ports/src/virtualbox/spec/nova/vmx.h b/repos/ports/src/virtualbox/spec/nova/vmx.h index 5913c6f5d..cdfe86c62 100644 --- a/repos/ports/src/virtualbox/spec/nova/vmx.h +++ b/repos/ports/src/virtualbox/spec/nova/vmx.h @@ -111,7 +111,6 @@ static inline bool vmx_load_state(Nova::Utcb * utcb, VM * pVM, PVMCPU pVCpu) } /* tr */ - Assert(pCtx->tr.Attr.u & X86_SEL_TYPE_SYS_TSS_BUSY_MASK); { utcb->mtd |= Nova::Mtd::TR; diff --git a/repos/ports/src/virtualbox5/spec/nova/vmx.h b/repos/ports/src/virtualbox5/spec/nova/vmx.h index 5913c6f5d..cdfe86c62 100644 --- a/repos/ports/src/virtualbox5/spec/nova/vmx.h +++ b/repos/ports/src/virtualbox5/spec/nova/vmx.h @@ -111,7 +111,6 @@ static inline bool vmx_load_state(Nova::Utcb * utcb, VM * pVM, PVMCPU pVCpu) } /* tr */ - Assert(pCtx->tr.Attr.u & X86_SEL_TYPE_SYS_TSS_BUSY_MASK); { utcb->mtd |= Nova::Mtd::TR;