diff --git a/bochs/cpu/ctrl_xfer_pro.cc b/bochs/cpu/ctrl_xfer_pro.cc index c06eac01d..67fd6d336 100644 --- a/bochs/cpu/ctrl_xfer_pro.cc +++ b/bochs/cpu/ctrl_xfer_pro.cc @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////// -// $Id: ctrl_xfer_pro.cc,v 1.79 2009-12-04 16:53:12 sshwarts Exp $ +// $Id: ctrl_xfer_pro.cc,v 1.80 2009-12-17 11:11:58 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2001-2009 The Bochs Project @@ -92,6 +92,13 @@ BX_CPU_C::load_cs(bx_selector_t *selector, bx_descriptor_t *descriptor, Bit8u cp touch_segment(selector, descriptor); +#if BX_SUPPORT_TRACE_CACHE + // Handle special case of CS.LIMIT demotion (new descriptor limit is + // smaller than current one) + if (BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].cache.u.segment.limit_scaled > descriptor->u.segment.limit_scaled) + BX_CPU_THIS_PTR iCache.flushICacheEntries(); +#endif + BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector = *selector; BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].cache = *descriptor; BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.rpl = cpl; diff --git a/bochs/cpu/tasking.cc b/bochs/cpu/tasking.cc index 8a8fa548d..a9e0f0f33 100644 --- a/bochs/cpu/tasking.cc +++ b/bochs/cpu/tasking.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: tasking.cc,v 1.77 2009-12-04 16:53:12 sshwarts Exp $ +// $Id: tasking.cc,v 1.78 2009-12-17 11:11:58 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2001-2009 The Bochs Project @@ -647,6 +647,13 @@ void BX_CPU_C::task_switch(bxInstruction_c *i, bx_selector_t *tss_selector, touch_segment(&cs_selector, &cs_descriptor); +#if BX_SUPPORT_TRACE_CACHE + // Handle special case of CS.LIMIT demotion (new descriptor limit is + // smaller than current one) + if (BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].cache.u.segment.limit_scaled > cs_descriptor.u.segment.limit_scaled) + BX_CPU_THIS_PTR iCache.flushICacheEntries(); +#endif + // All checks pass, fill in shadow cache BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].cache = cs_descriptor; } diff --git a/bochs/cpu/vmx.cc b/bochs/cpu/vmx.cc index 2e027cc78..d012e9e54 100755 --- a/bochs/cpu/vmx.cc +++ b/bochs/cpu/vmx.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: vmx.cc,v 1.27 2009-12-10 07:57:32 sshwarts Exp $ +// $Id: vmx.cc,v 1.28 2009-12-17 11:11:58 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (c) 2009 Stanislav Shwartsman @@ -1297,6 +1297,13 @@ Bit32u BX_CPU_C::VMenterLoadCheckGuestState(Bit64u *qualification) // set flags directly, avoid setEFlags side effects BX_CPU_THIS_PTR eflags = (Bit32u) guest.rflags; BX_CPU_THIS_PTR lf_flags_status = 0; // OSZAPC flags are known. + +#if BX_SUPPORT_TRACE_CACHE + // Handle special case of CS.LIMIT demotion (new descriptor limit is + // smaller than current one) + if (BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].cache.u.segment.limit_scaled > guest.sregs[BX_SEG_REG_CS].cache.u.segment.limit_scaled) + BX_CPU_THIS_PTR iCache.flushICacheEntries(); +#endif for(unsigned segreg=0; segreg<6; segreg++) BX_CPU_THIS_PTR sregs[segreg] = guest.sregs[segreg];