Fixed trace cache CS.LIMIT demotion problem
This commit is contained in:
parent
880ee7f872
commit
71457f464f
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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];
|
||||
|
Loading…
x
Reference in New Issue
Block a user