diff options
Diffstat (limited to 'arch/x86/entry/entry_32.S')
| -rw-r--r-- | arch/x86/entry/entry_32.S | 21 | 
1 files changed, 12 insertions, 9 deletions
| diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S index 2767c625a52c..687e47f8a796 100644 --- a/arch/x86/entry/entry_32.S +++ b/arch/x86/entry/entry_32.S @@ -389,6 +389,13 @@  	 * that register for the time this macro runs  	 */ +	/* +	 * The high bits of the CS dword (__csh) are used for +	 * CS_FROM_ENTRY_STACK and CS_FROM_USER_CR3. Clear them in case +	 * hardware didn't do this for us. +	 */ +	andl	$(0x0000ffff), PT_CS(%esp) +  	/* Are we on the entry stack? Bail out if not! */  	movl	PER_CPU_VAR(cpu_entry_area), %ecx  	addl	$CPU_ENTRY_AREA_entry_stack + SIZEOF_entry_stack, %ecx @@ -407,12 +414,6 @@  	/* Load top of task-stack into %edi */  	movl	TSS_entry2task_stack(%edi), %edi -	/* -	 * Clear unused upper bits of the dword containing the word-sized CS -	 * slot in pt_regs in case hardware didn't clear it for us. -	 */ -	andl	$(0x0000ffff), PT_CS(%esp) -  	/* Special case - entry from kernel mode via entry stack */  #ifdef CONFIG_VM86  	movl	PT_EFLAGS(%esp), %ecx		# mix EFLAGS and CS @@ -782,7 +783,7 @@ GLOBAL(__begin_SYSENTER_singlestep_region)   * will ignore all of the single-step traps generated in this range.   */ -#ifdef CONFIG_XEN +#ifdef CONFIG_XEN_PV  /*   * Xen doesn't set %esp to be precisely what the normal SYSENTER   * entry point expects, so fix it up before using the normal path. @@ -1240,7 +1241,7 @@ ENTRY(spurious_interrupt_bug)  	jmp	common_exception  END(spurious_interrupt_bug) -#ifdef CONFIG_XEN +#ifdef CONFIG_XEN_PV  ENTRY(xen_hypervisor_callback)  	pushl	$-1				/* orig_ax = -1 => not a system call */  	SAVE_ALL @@ -1321,11 +1322,13 @@ ENTRY(xen_failsafe_callback)  	_ASM_EXTABLE(3b, 8b)  	_ASM_EXTABLE(4b, 9b)  ENDPROC(xen_failsafe_callback) +#endif /* CONFIG_XEN_PV */ +#ifdef CONFIG_XEN_PVHVM  BUILD_INTERRUPT3(xen_hvm_callback_vector, HYPERVISOR_CALLBACK_VECTOR,  		 xen_evtchn_do_upcall) +#endif -#endif /* CONFIG_XEN */  #if IS_ENABLED(CONFIG_HYPERV) |