diff options
Diffstat (limited to 'arch/x86/include/asm/asm.h')
-rw-r--r-- | arch/x86/include/asm/asm.h | 57 |
1 files changed, 25 insertions, 32 deletions
diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h index 990770f9e76b..21b086786404 100644 --- a/arch/x86/include/asm/asm.h +++ b/arch/x86/include/asm/asm.h | |||
@@ -120,16 +120,32 @@ | |||
120 | /* Exception table entry */ | 120 | /* Exception table entry */ |
121 | #ifdef __ASSEMBLY__ | 121 | #ifdef __ASSEMBLY__ |
122 | # define _ASM_EXTABLE_HANDLE(from, to, handler) \ | 122 | # define _ASM_EXTABLE_HANDLE(from, to, handler) \ |
123 | .pushsection "__ex_table","a" ; \ | 123 | ASM_EXTABLE_HANDLE from to handler |
124 | .balign 4 ; \ | 124 | |
125 | .long (from) - . ; \ | 125 | .macro ASM_EXTABLE_HANDLE from:req to:req handler:req |
126 | .long (to) - . ; \ | 126 | .pushsection "__ex_table","a" |
127 | .long (handler) - . ; \ | 127 | .balign 4 |
128 | .long (\from) - . | ||
129 | .long (\to) - . | ||
130 | .long (\handler) - . | ||
128 | .popsection | 131 | .popsection |
132 | .endm | ||
133 | #else /* __ASSEMBLY__ */ | ||
134 | |||
135 | # define _ASM_EXTABLE_HANDLE(from, to, handler) \ | ||
136 | "ASM_EXTABLE_HANDLE from=" #from " to=" #to \ | ||
137 | " handler=\"" #handler "\"\n\t" | ||
138 | |||
139 | /* For C file, we already have NOKPROBE_SYMBOL macro */ | ||
140 | |||
141 | #endif /* __ASSEMBLY__ */ | ||
129 | 142 | ||
130 | # define _ASM_EXTABLE(from, to) \ | 143 | # define _ASM_EXTABLE(from, to) \ |
131 | _ASM_EXTABLE_HANDLE(from, to, ex_handler_default) | 144 | _ASM_EXTABLE_HANDLE(from, to, ex_handler_default) |
132 | 145 | ||
146 | # define _ASM_EXTABLE_UA(from, to) \ | ||
147 | _ASM_EXTABLE_HANDLE(from, to, ex_handler_uaccess) | ||
148 | |||
133 | # define _ASM_EXTABLE_FAULT(from, to) \ | 149 | # define _ASM_EXTABLE_FAULT(from, to) \ |
134 | _ASM_EXTABLE_HANDLE(from, to, ex_handler_fault) | 150 | _ASM_EXTABLE_HANDLE(from, to, ex_handler_fault) |
135 | 151 | ||
@@ -145,6 +161,7 @@ | |||
145 | _ASM_PTR (entry); \ | 161 | _ASM_PTR (entry); \ |
146 | .popsection | 162 | .popsection |
147 | 163 | ||
164 | #ifdef __ASSEMBLY__ | ||
148 | .macro ALIGN_DESTINATION | 165 | .macro ALIGN_DESTINATION |
149 | /* check for bad alignment of destination */ | 166 | /* check for bad alignment of destination */ |
150 | movl %edi,%ecx | 167 | movl %edi,%ecx |
@@ -165,34 +182,10 @@ | |||
165 | jmp copy_user_handle_tail | 182 | jmp copy_user_handle_tail |
166 | .previous | 183 | .previous |
167 | 184 | ||
168 | _ASM_EXTABLE(100b,103b) | 185 | _ASM_EXTABLE_UA(100b, 103b) |
169 | _ASM_EXTABLE(101b,103b) | 186 | _ASM_EXTABLE_UA(101b, 103b) |
170 | .endm | 187 | .endm |
171 | 188 | #endif /* __ASSEMBLY__ */ | |
172 | #else | ||
173 | # define _EXPAND_EXTABLE_HANDLE(x) #x | ||
174 | # define _ASM_EXTABLE_HANDLE(from, to, handler) \ | ||
175 | " .pushsection \"__ex_table\",\"a\"\n" \ | ||
176 | " .balign 4\n" \ | ||
177 | " .long (" #from ") - .\n" \ | ||
178 | " .long (" #to ") - .\n" \ | ||
179 | " .long (" _EXPAND_EXTABLE_HANDLE(handler) ") - .\n" \ | ||
180 | " .popsection\n" | ||
181 | |||
182 | # define _ASM_EXTABLE(from, to) \ | ||
183 | _ASM_EXTABLE_HANDLE(from, to, ex_handler_default) | ||
184 | |||
185 | # define _ASM_EXTABLE_FAULT(from, to) \ | ||
186 | _ASM_EXTABLE_HANDLE(from, to, ex_handler_fault) | ||
187 | |||
188 | # define _ASM_EXTABLE_EX(from, to) \ | ||
189 | _ASM_EXTABLE_HANDLE(from, to, ex_handler_ext) | ||
190 | |||
191 | # define _ASM_EXTABLE_REFCOUNT(from, to) \ | ||
192 | _ASM_EXTABLE_HANDLE(from, to, ex_handler_refcount) | ||
193 | |||
194 | /* For C file, we already have NOKPROBE_SYMBOL macro */ | ||
195 | #endif | ||
196 | 189 | ||
197 | #ifndef __ASSEMBLY__ | 190 | #ifndef __ASSEMBLY__ |
198 | /* | 191 | /* |