|
@@ -1016,7 +1016,7 @@ ENTRY(xen_sysenter_target)
|
|
|
|
|
|
ENTRY(xen_hypervisor_callback)
|
|
|
CFI_STARTPROC
|
|
|
- pushl_cfi $0
|
|
|
+ pushl_cfi $-1 /* orig_ax = -1 => not a system call */
|
|
|
SAVE_ALL
|
|
|
TRACE_IRQS_OFF
|
|
|
|
|
@@ -1058,14 +1058,16 @@ ENTRY(xen_failsafe_callback)
|
|
|
2: mov 8(%esp),%es
|
|
|
3: mov 12(%esp),%fs
|
|
|
4: mov 16(%esp),%gs
|
|
|
+ /* EAX == 0 => Category 1 (Bad segment)
|
|
|
+ EAX != 0 => Category 2 (Bad IRET) */
|
|
|
testl %eax,%eax
|
|
|
popl_cfi %eax
|
|
|
lea 16(%esp),%esp
|
|
|
CFI_ADJUST_CFA_OFFSET -16
|
|
|
jz 5f
|
|
|
addl $16,%esp
|
|
|
- jmp iret_exc # EAX != 0 => Category 2 (Bad IRET)
|
|
|
-5: pushl_cfi $0 # EAX == 0 => Category 1 (Bad segment)
|
|
|
+ jmp iret_exc
|
|
|
+5: pushl_cfi $-1 /* orig_ax = -1 => not a system call */
|
|
|
SAVE_ALL
|
|
|
jmp ret_from_exception
|
|
|
CFI_ENDPROC
|