diff options
Diffstat (limited to 'arch/x86/kernel/entry_64.S')
| -rw-r--r-- | arch/x86/kernel/entry_64.S | 46 | 
1 files changed, 24 insertions, 22 deletions
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index cb3c591339a..72720894103 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S @@ -828,23 +828,6 @@ int_restore_rest:  	CFI_ENDPROC  END(system_call) -/* - * Certain special system calls that need to save a complete full stack frame. - */ -	.macro PTREGSCALL label,func,arg -ENTRY(\label) -	PARTIAL_FRAME 1 8		/* offset 8: return address */ -	subq $REST_SKIP, %rsp -	CFI_ADJUST_CFA_OFFSET REST_SKIP -	call save_rest -	DEFAULT_FRAME 0 8		/* offset 8: return address */ -	leaq 8(%rsp), \arg	/* pt_regs pointer */ -	call \func -	jmp ptregscall_common -	CFI_ENDPROC -END(\label) -	.endm -  	.macro FORK_LIKE func  ENTRY(stub_\func)  	CFI_STARTPROC @@ -861,10 +844,22 @@ ENTRY(stub_\func)  END(stub_\func)  	.endm +	.macro FIXED_FRAME label,func +ENTRY(\label) +	CFI_STARTPROC +	PARTIAL_FRAME 0 8		/* offset 8: return address */ +	FIXUP_TOP_OF_STACK %r11, 8-ARGOFFSET +	call \func +	RESTORE_TOP_OF_STACK %r11, 8-ARGOFFSET +	ret +	CFI_ENDPROC +END(\label) +	.endm +  	FORK_LIKE  clone  	FORK_LIKE  fork  	FORK_LIKE  vfork -	PTREGSCALL stub_iopl, sys_iopl, %rsi +	FIXED_FRAME stub_iopl, sys_iopl  ENTRY(ptregscall_common)  	DEFAULT_FRAME 1 8	/* offset 8: return address */ @@ -886,7 +881,6 @@ ENTRY(stub_execve)  	SAVE_REST  	FIXUP_TOP_OF_STACK %r11  	call sys_execve -	RESTORE_TOP_OF_STACK %r11  	movq %rax,RAX(%rsp)  	RESTORE_REST  	jmp int_ret_from_sys_call @@ -902,7 +896,6 @@ ENTRY(stub_rt_sigreturn)  	addq $8, %rsp  	PARTIAL_FRAME 0  	SAVE_REST -	movq %rsp,%rdi  	FIXUP_TOP_OF_STACK %r11  	call sys_rt_sigreturn  	movq %rax,RAX(%rsp) # fixme, this could be done at the higher layer @@ -917,7 +910,6 @@ ENTRY(stub_x32_rt_sigreturn)  	addq $8, %rsp  	PARTIAL_FRAME 0  	SAVE_REST -	movq %rsp,%rdi  	FIXUP_TOP_OF_STACK %r11  	call sys32_x32_rt_sigreturn  	movq %rax,RAX(%rsp) # fixme, this could be done at the higher layer @@ -1174,6 +1166,11 @@ apicinterrupt LOCAL_TIMER_VECTOR \  apicinterrupt X86_PLATFORM_IPI_VECTOR \  	x86_platform_ipi smp_x86_platform_ipi +#ifdef CONFIG_HAVE_KVM +apicinterrupt POSTED_INTR_VECTOR \ +	kvm_posted_intr_ipi smp_kvm_posted_intr_ipi +#endif +  apicinterrupt THRESHOLD_APIC_VECTOR \  	threshold_interrupt smp_threshold_interrupt  apicinterrupt THERMAL_APIC_VECTOR \ @@ -1454,11 +1451,16 @@ ENTRY(xen_failsafe_callback)  	CFI_ENDPROC  END(xen_failsafe_callback) -apicinterrupt XEN_HVM_EVTCHN_CALLBACK \ +apicinterrupt HYPERVISOR_CALLBACK_VECTOR \  	xen_hvm_callback_vector xen_evtchn_do_upcall  #endif /* CONFIG_XEN */ +#if IS_ENABLED(CONFIG_HYPERV) +apicinterrupt HYPERVISOR_CALLBACK_VECTOR \ +	hyperv_callback_vector hyperv_vector_handler +#endif /* CONFIG_HYPERV */ +  /*   * Some functions should be protected against kprobes   */  |