xref: /linux/arch/x86/um/shared/sysdep/faultinfo_32.h (revision 01f95500a162fca88cefab9ed64ceded5afabc12)
1 /*
2  * Copyright (C) 2004 Fujitsu Siemens Computers GmbH
3  * Author: Bodo Stroesser <bstroesser@fujitsu-siemens.com>
4  * Licensed under the GPL
5  */
6 
7 #ifndef __FAULTINFO_I386_H
8 #define __FAULTINFO_I386_H
9 
10 /* this structure contains the full arch-specific faultinfo
11  * from the traps.
12  * On i386, ptrace_faultinfo unfortunately doesn't provide
13  * all the info, since trap_no is missing.
14  * All common elements are defined at the same position in
15  * both structures, thus making it easy to copy the
16  * contents without knowledge about the structure elements.
17  */
18 struct faultinfo {
19         int error_code; /* in ptrace_faultinfo misleadingly called is_write */
20         unsigned long cr2; /* in ptrace_faultinfo called addr */
21         int trap_no; /* missing in ptrace_faultinfo */
22 };
23 
24 #define FAULT_WRITE(fi) ((fi).error_code & 2)
25 #define FAULT_ADDRESS(fi) ((fi).cr2)
26 
27 /* This is Page Fault */
28 #define SEGV_IS_FIXABLE(fi)	((fi)->trap_no == 14)
29 
30 #define PTRACE_FULL_FAULTINFO 0
31 
32 #define ___backtrack_faulted(_faulted)					\
33 	asm volatile (							\
34 		"movl $__get_kernel_nofault_faulted_%=,%1\n"		\
35 		"mov $0, %0\n"						\
36 		"jmp _end_%=\n"						\
37 		"__get_kernel_nofault_faulted_%=:\n"			\
38 		"mov $1, %0;"						\
39 		"_end_%=:"						\
40 		: "=r" (_faulted),					\
41 		  "=m" (current->thread.segv_continue) ::		\
42 	)
43 
44 #endif
45