diff options
Diffstat (limited to 'arch/x86/kvm/emulate.c')
| -rw-r--r-- | arch/x86/kvm/emulate.c | 17 | 
1 files changed, 10 insertions, 7 deletions
| diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 16bf6655aa85..d90cdc77e077 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -425,8 +425,10 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *));  	#op " %al \n\t" \  	FOP_RET -asm(".global kvm_fastop_exception \n" -    "kvm_fastop_exception: xor %esi, %esi; ret"); +asm(".pushsection .fixup, \"ax\"\n" +    ".global kvm_fastop_exception \n" +    "kvm_fastop_exception: xor %esi, %esi; ret\n" +    ".popsection");  FOP_START(setcc)  FOP_SETCC(seto) @@ -4102,10 +4104,12 @@ static int check_cr_write(struct x86_emulate_ctxt *ctxt)  		ctxt->ops->get_msr(ctxt, MSR_EFER, &efer);  		if (efer & EFER_LMA) {  			u64 maxphyaddr; -			u32 eax = 0x80000008; +			u32 eax, ebx, ecx, edx; -			if (ctxt->ops->get_cpuid(ctxt, &eax, NULL, NULL, -						 NULL, false)) +			eax = 0x80000008; +			ecx = 0; +			if (ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx, +						 &edx, false))  				maxphyaddr = eax & 0xff;  			else  				maxphyaddr = 36; @@ -5296,7 +5300,6 @@ static void fetch_possible_mmx_operand(struct x86_emulate_ctxt *ctxt,  static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *))  { -	register void *__sp asm(_ASM_SP);  	ulong flags = (ctxt->eflags & EFLAGS_MASK) | X86_EFLAGS_IF;  	if (!(ctxt->d & ByteOp)) @@ -5304,7 +5307,7 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *))  	asm("push %[flags]; popf; call *%[fastop]; pushf; pop %[flags]\n"  	    : "+a"(ctxt->dst.val), "+d"(ctxt->src.val), [flags]"+D"(flags), -	      [fastop]"+S"(fop), "+r"(__sp) +	      [fastop]"+S"(fop), ASM_CALL_CONSTRAINT  	    : "c"(ctxt->src2.val));  	ctxt->eflags = (ctxt->eflags & ~EFLAGS_MASK) | (flags & EFLAGS_MASK); |