11/ *
22 * arch/xtensa/kernel/align.S
33 *
4- * Handle unalignment exceptions in kernel space .
4+ * Handle unalignment and load/store exceptions .
55 *
66 * This file is subject to the terms and conditions of the GNU General
77 * Public License. See the file "COPYING" in the main directory of
2626#define LOAD_EXCEPTION_HANDLER
2727#endif
2828
29- #if XCHAL_UNALIGNED_STORE_EXCEPTION || defined LOAD_EXCEPTION_HANDLER
29+ #if XCHAL_UNALIGNED_STORE_EXCEPTION || defined CONFIG_XTENSA_LOAD_STORE
30+ #define STORE_EXCEPTION_HANDLER
31+ #endif
32+
33+ #if defined LOAD_EXCEPTION_HANDLER || defined STORE_EXCEPTION_HANDLER
3034#define ANY_EXCEPTION_HANDLER
3135#endif
3236
33- #if XCHAL_HAVE_WINDOWED
37+ #if XCHAL_HAVE_WINDOWED && defined CONFIG_MMU
3438#define UNALIGNED_USER_EXCEPTION
3539#endif
3640
37- / * First - level exception handler for unaligned exceptions.
38- *
39- * Note: This handler works only for kernel exceptions. Unaligned user
40- * access should get a seg fault.
41- * /
42-
4341/ * Big and little endian 16 - bit values are located in
4442 * different halves of a register. HWORD_START helps to
4543 * abstract the notion of extracting a 16 - bit value from a
@@ -228,8 +226,6 @@ ENDPROC(fast_load_store)
228226#ifdef ANY_EXCEPTION_HANDLER
229227ENTRY(fast_unaligned)
230228
231- #if XCHAL_UNALIGNED_LOAD_EXCEPTION || XCHAL_UNALIGNED_STORE_EXCEPTION
232-
233229 call0 .Lsave_and_load_instruction
234230
235231 / * Analyze the instruction (load or store?). * /
@@ -244,8 +240,7 @@ ENTRY(fast_unaligned)
244240 / * 'store indicator bit' not set , jump * /
245241 _bbci.l a4 , OP1_SI_BIT + INSN_OP1 , .Lload
246242
247- #endif
248- #if XCHAL_UNALIGNED_STORE_EXCEPTION
243+ #ifdef STORE_EXCEPTION_HANDLER
249244
250245 / * Store: Jump to table entry to get the value in the source register. * /
251246
@@ -254,7 +249,7 @@ ENTRY(fast_unaligned)
254249 addx8 a5 , a6 , a5
255250 jx a5 # jump into table
256251#endif
257- #if XCHAL_UNALIGNED_LOAD_EXCEPTION
252+ #ifdef LOAD_EXCEPTION_HANDLER
258253
259254 / * Load: Load memory address. * /
260255
@@ -328,7 +323,7 @@ ENTRY(fast_unaligned)
328323 mov a14 , a3 ; _j .Lexit; .align 8
329324 mov a15 , a3 ; _j .Lexit; .align 8
330325#endif
331- #if XCHAL_UNALIGNED_STORE_EXCEPTION
326+ #ifdef STORE_EXCEPTION_HANDLER
332327.Lstore_table:
333328 l32i a3 , a2 , PT_AREG0 ; _j .Lstore_w; .align 8
334329 mov a3 , a1 ; _j .Lstore_w; .align 8 # fishy??
@@ -348,7 +343,6 @@ ENTRY(fast_unaligned)
348343 mov a3 , a15 ; _j .Lstore_w; .align 8
349344#endif
350345
351- #ifdef ANY_EXCEPTION_HANDLER
352346 / * We cannot handle this exception. * /
353347
354348 . extern _kernel_exception
@@ -377,8 +371,8 @@ ENTRY(fast_unaligned)
377371
3783722 : movi a0 , _user_exception
379373 jx a0
380- #endif
381- #if XCHAL_UNALIGNED_STORE_EXCEPTION
374+
375+ #ifdef STORE_EXCEPTION_HANDLER
382376
383377 # a7: instruction pointer , a4: instruction , a3: value
384378.Lstore_w:
@@ -444,7 +438,7 @@ ENTRY(fast_unaligned)
444438 s32i a6 , a4 , 4
445439#endif
446440#endif
447- #ifdef ANY_EXCEPTION_HANDLER
441+
448442.Lexit:
449443#if XCHAL_HAVE_LOOPS
450444 rsr a4 , lend # check if we reached LEND
@@ -539,7 +533,7 @@ ENTRY(fast_unaligned)
539533 __src_b a4 , a4 , a5 # a4 has the instruction
540534
541535 ret
542- #endif
536+
543537ENDPROC(fast_unaligned)
544538
545539ENTRY(fast_unaligned_fixup)
0 commit comments