From mboxrd@z Thu Jan 1 00:00:00 1970 From: Arun Sharma Subject: [PATCH][5/5] cmpl workaround for mmio regions Date: Sun, 10 Jul 2005 12:04:24 -0700 Message-ID: <20050710190424.GA12777@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Ian Pratt , Keir Fraser Cc: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org cmpl workaround for mmio regions Although we don't normally expect a guest to use cmpl against a MMIO region, this may happen due to bugs. This workaround is needed for 64 bit linux-2.6. Signed-off-by: Chengyuan Li Signed-off-by: Arun Sharma diff -r b3872674fc9a -r 8b35a59e4a23 xen/arch/x86/vmx_platform.c --- a/xen/arch/x86/vmx_platform.c Fri Jul 8 18:06:34 2005 +++ b/xen/arch/x86/vmx_platform.c Fri Jul 8 18:58:08 2005 @@ -266,7 +266,7 @@ switch(mod) { case 0: - if (rm == 5) { + if (rm == 5 || rm == 4) { if (op16) inst = inst + 2; //disp16, skip 2 bytes else @@ -363,6 +363,11 @@ } switch(*inst) { + case 0x81: + /* This is only a workaround for cmpl instruction*/ + strcpy((char *)thread_inst->i_name, "cmp"); + return DECODE_success; + case 0x88: /* mov r8 to m8 */ thread_inst->op_size = BYTE; @@ -635,7 +640,6 @@ __vmread(GUEST_RIP, &eip); __vmread(INSTRUCTION_LEN, &inst_len); - __vmread(GUEST_RFLAGS, &eflags); vm86 = eflags & X86_EFLAGS_VM; @@ -737,6 +741,12 @@ inst_decoder_regs->eax, IOREQ_WRITE, 0); return; } + /* Workaround for cmp instruction */ + if (!strncmp((char *)mmio_inst.i_name, "cmp", 3)) { + inst_decoder_regs->eflags &= ~X86_EFLAGS_ZF; + __vmwrite(GUEST_RFLAGS, inst_decoder_regs->eflags); + return; + } domain_crash_synchronous(); }