diff options
Diffstat (limited to 'arch/i386/kernel/entry.S')
-rw-r--r-- | arch/i386/kernel/entry.S | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S index ffb236544270..32980b834935 100644 --- a/arch/i386/kernel/entry.S +++ b/arch/i386/kernel/entry.S | |||
@@ -1030,7 +1030,21 @@ ENTRY(xen_hypervisor_callback) | |||
1030 | CFI_ADJUST_CFA_OFFSET 4 | 1030 | CFI_ADJUST_CFA_OFFSET 4 |
1031 | SAVE_ALL | 1031 | SAVE_ALL |
1032 | TRACE_IRQS_OFF | 1032 | TRACE_IRQS_OFF |
1033 | mov %esp, %eax | 1033 | |
1034 | /* Check to see if we got the event in the critical | ||
1035 | region in xen_iret_direct, after we've reenabled | ||
1036 | events and checked for pending events. This simulates | ||
1037 | iret instruction's behaviour where it delivers a | ||
1038 | pending interrupt when enabling interrupts. */ | ||
1039 | movl PT_EIP(%esp),%eax | ||
1040 | cmpl $xen_iret_start_crit,%eax | ||
1041 | jb 1f | ||
1042 | cmpl $xen_iret_end_crit,%eax | ||
1043 | jae 1f | ||
1044 | |||
1045 | call xen_iret_crit_fixup | ||
1046 | |||
1047 | 1: mov %esp, %eax | ||
1034 | call xen_evtchn_do_upcall | 1048 | call xen_evtchn_do_upcall |
1035 | jmp ret_from_intr | 1049 | jmp ret_from_intr |
1036 | CFI_ENDPROC | 1050 | CFI_ENDPROC |