diff -r 59b8768d0d0d xen/arch/x86/hvm/svm/emulate.c --- a/xen/arch/x86/hvm/svm/emulate.c Wed Mar 05 11:18:25 2008 +0000 +++ b/xen/arch/x86/hvm/svm/emulate.c Mon Mar 10 13:05:14 2008 +0000 @@ -117,7 +117,9 @@ int __get_instruction_length_from_list(s } else { - inst_copy_from_guest(buffer, svm_rip2pointer(v), MAX_INST_LEN); + if ( inst_copy_from_guest(buffer, svm_rip2pointer(v), MAX_INST_LEN) + != MAX_INST_LEN ) + return 0; buf = buffer; } diff -r 59b8768d0d0d xen/arch/x86/hvm/svm/svm.c --- a/xen/arch/x86/hvm/svm/svm.c Wed Mar 05 11:18:25 2008 +0000 +++ b/xen/arch/x86/hvm/svm/svm.c Mon Mar 10 13:09:45 2008 +0000 @@ -943,6 +943,10 @@ static void svm_vmexit_do_cpuid(struct c { unsigned int eax, ebx, ecx, edx, inst_len; + inst_len = __get_instruction_length(current, INSTR_CPUID, NULL); + if ( inst_len == 0 ) + return; + eax = regs->eax; ebx = regs->ebx; ecx = regs->ecx; @@ -955,7 +959,6 @@ static void svm_vmexit_do_cpuid(struct c regs->ecx = ecx; regs->edx = edx; - inst_len = __get_instruction_length(current, INSTR_CPUID, NULL); __update_guest_eip(regs, inst_len); } @@ -1166,6 +1169,8 @@ static void svm_vmexit_do_hlt(struct vmc unsigned int inst_len; inst_len = __get_instruction_length(curr, INSTR_HLT, NULL); + if ( inst_len == 0 ) + return 0; __update_guest_eip(regs, inst_len); /* Check for pending exception or new interrupt. */ @@ -1354,6 +1359,8 @@ asmlinkage void svm_vmexit_handler(struc case VMEXIT_VMMCALL: inst_len = __get_instruction_length(v, INSTR_VMCALL, NULL); + if ( inst_len == 0 ) + break; HVMTRACE_1D(VMMCALL, v, regs->eax); rc = hvm_do_hypercall(regs); if ( rc != HVM_HCALL_preempted )