aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/entry_64.S
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy@goop.org>2008-07-08 18:07:09 -0400
committerIngo Molnar <mingo@elte.hu>2008-07-16 05:04:41 -0400
commit4a5c3e77f70b3ea8b361d7fa9eb2e4dad18f70ae (patch)
tree8dd0085bb4dc6eeceb5a6dd070b9a05890d2d756 /arch/x86/kernel/entry_64.S
parent0775b3dbcb6d17b531b36df520ddab735647f3f7 (diff)
xen64: implement failsafe callback
Implement the failsafe callback, so that iret and segment register load exceptions are reported to the kernel. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Cc: Stephen Tweedie <sct@redhat.com> Cc: Eduardo Habkost <ehabkost@redhat.com> Cc: Mark McLoughlin <markmc@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/entry_64.S')
-rw-r--r--arch/x86/kernel/entry_64.S16
1 files changed, 9 insertions, 7 deletions
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S
index 7cc2de796146..6aa6932e21b1 100644
--- a/arch/x86/kernel/entry_64.S
+++ b/arch/x86/kernel/entry_64.S
@@ -1365,10 +1365,8 @@ END(do_hypervisor_callback)
1365# with its current contents: any discrepancy means we in category 1. 1365# with its current contents: any discrepancy means we in category 1.
1366*/ 1366*/
1367ENTRY(xen_failsafe_callback) 1367ENTRY(xen_failsafe_callback)
1368#if 1 1368 framesz = (RIP-0x30) /* workaround buggy gas */
1369 ud2a 1369 _frame framesz
1370#else
1371 _frame (RIP-0x30)
1372 CFI_REL_OFFSET rcx, 0 1370 CFI_REL_OFFSET rcx, 0
1373 CFI_REL_OFFSET r11, 8 1371 CFI_REL_OFFSET r11, 8
1374 movw %ds,%cx 1372 movw %ds,%cx
@@ -1391,8 +1389,13 @@ ENTRY(xen_failsafe_callback)
1391 CFI_RESTORE r11 1389 CFI_RESTORE r11
1392 addq $0x30,%rsp 1390 addq $0x30,%rsp
1393 CFI_ADJUST_CFA_OFFSET -0x30 1391 CFI_ADJUST_CFA_OFFSET -0x30
1394 movq $11,%rdi /* SIGSEGV */ 1392 pushq $0
1395 jmp do_exit 1393 CFI_ADJUST_CFA_OFFSET 8
1394 pushq %r11
1395 CFI_ADJUST_CFA_OFFSET 8
1396 pushq %rcx
1397 CFI_ADJUST_CFA_OFFSET 8
1398 jmp general_protection
1396 CFI_RESTORE_STATE 1399 CFI_RESTORE_STATE
13971: /* Segment mismatch => Category 1 (Bad segment). Retry the IRET. */ 14001: /* Segment mismatch => Category 1 (Bad segment). Retry the IRET. */
1398 movq (%rsp),%rcx 1401 movq (%rsp),%rcx
@@ -1406,7 +1409,6 @@ ENTRY(xen_failsafe_callback)
1406 SAVE_ALL 1409 SAVE_ALL
1407 jmp error_exit 1410 jmp error_exit
1408 CFI_ENDPROC 1411 CFI_ENDPROC
1409#endif
1410END(xen_failsafe_callback) 1412END(xen_failsafe_callback)
1411 1413
1412#endif /* CONFIG_XEN */ 1414#endif /* CONFIG_XEN */