[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen stable-4.6] x86emul: fix rIP handling
commit 54ea2be5ecf517e379e9287472d84f8de24f867d Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Fri Mar 4 13:03:16 2016 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Fri Mar 4 13:03:16 2016 +0100 x86emul: fix rIP handling Deal with rIP just like with any other register: Truncate to designated width upon entry, write back the zero-extended 32-bit value when emulating 32-bit code, and leave the upper 48 bits unchanged for 16-bit code. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> master commit: 0640ffb67fb92e2561c63b9308c27b71281fdd72 master date: 2016-02-18 15:05:34 +0100 --- xen/arch/x86/x86_emulate/x86_emulate.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/x86_emulate/x86_emulate.c b/xen/arch/x86/x86_emulate/x86_emulate.c index 56aef3e..5fb0f7f 100644 --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -570,7 +570,6 @@ do{ asm volatile ( \ /* Fetch next part of the instruction being emulated. */ #define insn_fetch_bytes(_size) \ ({ unsigned long _x = 0, _eip = _regs.eip; \ - if ( !mode_64bit() ) _eip = (uint32_t)_eip; /* ignore upper dword */ \ _regs.eip += (_size); /* real hardware doesn't truncate */ \ generate_exception_if((uint8_t)(_regs.eip - \ ctxt->regs->eip) > MAX_INST_LEN, \ @@ -1491,6 +1490,10 @@ x86_emulate( #endif } + /* Truncate rIP to def_ad_bytes (2 or 4) if necessary. */ + if ( def_ad_bytes < sizeof(_regs.eip) ) + _regs.eip &= (1UL << (def_ad_bytes * 8)) - 1; + /* Prefix bytes. */ for ( ; ; ) { @@ -3803,6 +3806,21 @@ x86_emulate( /* Commit shadow register state. */ _regs.eflags &= ~EFLG_RF; + switch ( __builtin_expect(def_ad_bytes, sizeof(_regs.eip)) ) + { + uint16_t ip; + + case 2: + ip = _regs.eip; + _regs.eip = ctxt->regs->eip; + *(uint16_t *)&_regs.eip = ip; + break; +#ifdef __x86_64__ + case 4: + _regs.rip = _regs._eip; + break; +#endif + } *ctxt->regs = _regs; done: -- generated by git-patchbot for /home/xen/git/xen.git#stable-4.6 _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |