hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/arch/arm/kernel/entry-armv.S
....@@ -5,6 +5,7 @@
55 * Copyright (C) 1996,1997,1998 Russell King.
66 * ARM700 fix by Matthew Godbolt (linux-user@willothewisp.demon.co.uk)
77 * nommu support by Hyok S. Choi (hyok.choi@samsung.com)
8
+ * Copyright (C) 2005 Stelian Pop.
89 *
910 * Low-level vector interface routines
1011 *
....@@ -32,16 +33,24 @@
3233 #include "entry-header.S"
3334 #include <asm/entry-macro-multi.S>
3435 #include <asm/probes.h>
36
+#include <asm/dovetail.h>
3537
3638 /*
3739 * Interrupt handling.
3840 */
3941 .macro irq_handler
4042 #ifdef CONFIG_GENERIC_IRQ_MULTI_HANDLER
41
- ldr r1, =handle_arch_irq
4243 mov r0, sp
4344 badr lr, 9997f
45
+#ifdef CONFIG_IRQ_PIPELINE
46
+ ldr r1, =handle_arch_irq_pipelined
47
+ mov pc, r1
48
+#else
49
+ ldr r1, =handle_arch_irq
4450 ldr pc, [r1]
51
+#endif
52
+#elif CONFIG_IRQ_PIPELINE
53
+#error "Legacy IRQ handling not pipelined"
4554 #else
4655 arch_irq_handler_default
4756 #endif
....@@ -183,7 +192,10 @@
183192 uaccess_entry tsk, r0, r1, r2, \uaccess
184193
185194 .if \trace
186
-#ifdef CONFIG_TRACE_IRQFLAGS
195
+#ifdef CONFIG_IRQ_PIPELINE
196
+ mov r0, sp
197
+ bl kentry_enter_pipelined
198
+#elif defined(CONFIG_TRACE_IRQFLAGS)
187199 bl trace_hardirqs_off
188200 #endif
189201 .endif
....@@ -203,6 +215,10 @@
203215 __irq_svc:
204216 svc_entry
205217 irq_handler
218
+#ifdef CONFIG_IRQ_PIPELINE
219
+ tst r0, r0 @ skip epilogue if oob or in-band stalled
220
+ beq 1f
221
+#endif
206222
207223 #ifdef CONFIG_PREEMPTION
208224 ldr r8, [tsk, #TI_PREEMPT] @ get preempt count
....@@ -213,6 +229,7 @@
213229 blne svc_preempt
214230 #endif
215231
232
+1:
216233 svc_exit r5, irq = 1 @ return from exception
217234 UNWIND(.fnend )
218235 ENDPROC(__irq_svc)
....@@ -222,7 +239,7 @@
222239 #ifdef CONFIG_PREEMPTION
223240 svc_preempt:
224241 mov r8, lr
225
-1: bl preempt_schedule_irq @ irq en/disable is done inside
242
+1: bl arm_preempt_schedule_irq @ irq en/disable is done inside
226243 ldr r0, [tsk, #TI_FLAGS] @ get new tasks TI_FLAGS
227244 tst r0, #_TIF_NEED_RESCHED
228245 reteq r8 @ go again
....@@ -252,6 +269,16 @@
252269 #else
253270 svc_entry
254271 #endif
272
+#ifdef CONFIG_DOVETAIL
273
+ get_thread_info tsk
274
+ ldr r0, [tsk, #TI_PREEMPT] @ get preempt count
275
+ tst r0, #TI_OOB_MASK @ oob stage?
276
+ beq 1f
277
+ mov r0, #ARM_TRAP_UNDEFINSTR
278
+ mov r1, sp @ r1 = &regs
279
+ bl __oob_trap_notify
280
+1:
281
+#endif
255282
256283 mov r1, #4 @ PC correction to apply
257284 THUMB( tst r5, #PSR_T_BIT ) @ exception taken in Thumb mode?
....@@ -261,6 +288,15 @@
261288
262289 __und_svc_finish:
263290 get_thread_info tsk
291
+#ifdef CONFIG_DOVETAIL
292
+ ldr r0, [tsk, #TI_PREEMPT] @ get preempt count
293
+ tst r0, #TI_OOB_MASK @ oob stage?
294
+ beq 1f
295
+ mov r0, #ARM_TRAP_UNDEFINSTR
296
+ mov r1, sp @ r1 = &regs
297
+ bl __oob_trap_unwind
298
+1:
299
+#endif
264300 ldr r5, [sp, #S_PSR] @ Get SVC cpsr
265301 svc_exit r5 @ return from exception
266302 UNWIND(.fnend )
....@@ -391,7 +427,7 @@
391427
392428 .if \trace
393429 #ifdef CONFIG_TRACE_IRQFLAGS
394
- bl trace_hardirqs_off
430
+ bl trace_hardirqs_off_pipelined
395431 #endif
396432 ct_user_exit save = 0
397433 .endif
....@@ -427,8 +463,12 @@
427463 usr_entry
428464 kuser_cmpxchg_check
429465 irq_handler
430
- get_thread_info tsk
431466 mov why, #0
467
+#ifdef CONFIG_IRQ_PIPELINE
468
+ tst r0, r0
469
+ beq fast_ret_to_user @ skip epilogue if oob (in-band cannot be stalled)
470
+#endif
471
+ get_thread_info tsk
432472 b ret_to_user_from_irq
433473 UNWIND(.fnend )
434474 ENDPROC(__irq_usr)
....@@ -721,7 +761,7 @@
721761 UNWIND(.cantunwind )
722762 get_thread_info tsk
723763 mov why, #0
724
- b ret_to_user
764
+ ret_to_user_pipelined r1
725765 UNWIND(.fnend )
726766 ENDPROC(__pabt_usr)
727767 ENDPROC(ret_from_exception)