cmpl workaround for mmio regions
PATCH 5/5 cmpl workaround for mmio regions
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 <[email protected]>
Signed-off-by Arun Sharma <[email protected]>
xen/arch/x86/vmx_platform.c +12 -2
@@ -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 (); }