aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorRussell King <rmk@dyn-67.arm.linux.org.uk>2005-05-21 13:15:45 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2005-05-21 13:15:45 -0400
commit706fdd9faaad5bd52c774190a54c0fd1dfc0f418 (patch)
tree7f4cdbb7471348a95e48f7f7a0a80f86fb65a28e /arch/arm
parent187a51ad11351b009abab688fb7f6d6f3210a45f (diff)
[PATCH] ARM SMP: reallocate main IRQ handler code registers
By changing r9 -> r8 and r8 to 'tsk' (r9) we are able to remove one instruction from the preempt path. Signed-off-by: Russell King <rmk@arm.linux.org.uk>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/kernel/entry-armv.S35
1 files changed, 16 insertions, 19 deletions
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index b0efbf98d832..8ff82bc75eb1 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -144,20 +144,20 @@ __dabt_svc:
144__irq_svc: 144__irq_svc:
145 svc_entry irq 145 svc_entry irq
146#ifdef CONFIG_PREEMPT 146#ifdef CONFIG_PREEMPT
147 get_thread_info r8 147 get_thread_info tsk
148 ldr r9, [r8, #TI_PREEMPT] @ get preempt count 148 ldr r8, [tsk, #TI_PREEMPT] @ get preempt count
149 add r7, r9, #1 @ increment it 149 add r7, r8, #1 @ increment it
150 str r7, [r8, #TI_PREEMPT] 150 str r7, [tsk, #TI_PREEMPT]
151#endif 151#endif
152 irq_handler 152 irq_handler
153#ifdef CONFIG_PREEMPT 153#ifdef CONFIG_PREEMPT
154 ldr r0, [r8, #TI_FLAGS] @ get flags 154 ldr r0, [tsk, #TI_FLAGS] @ get flags
155 tst r0, #_TIF_NEED_RESCHED 155 tst r0, #_TIF_NEED_RESCHED
156 blne svc_preempt 156 blne svc_preempt
157preempt_return: 157preempt_return:
158 ldr r0, [r8, #TI_PREEMPT] @ read preempt value 158 ldr r0, [tsk, #TI_PREEMPT] @ read preempt value
159 str r8, [tsk, #TI_PREEMPT] @ restore preempt count
159 teq r0, r7 160 teq r0, r7
160 str r9, [r8, #TI_PREEMPT] @ restore preempt count
161 strne r0, [r0, -r0] @ bug() 161 strne r0, [r0, -r0] @ bug()
162#endif 162#endif
163 ldr r0, [sp, #S_PSR] @ irqs are already disabled 163 ldr r0, [sp, #S_PSR] @ irqs are already disabled
@@ -168,7 +168,7 @@ preempt_return:
168 168
169#ifdef CONFIG_PREEMPT 169#ifdef CONFIG_PREEMPT
170svc_preempt: 170svc_preempt:
171 teq r9, #0 @ was preempt count = 0 171 teq r8, #0 @ was preempt count = 0
172 ldreq r6, .LCirq_stat 172 ldreq r6, .LCirq_stat
173 movne pc, lr @ no 173 movne pc, lr @ no
174 ldr r0, [r6, #4] @ local_irq_count 174 ldr r0, [r6, #4] @ local_irq_count
@@ -176,9 +176,9 @@ svc_preempt:
176 adds r0, r0, r1 176 adds r0, r0, r1
177 movne pc, lr 177 movne pc, lr
178 mov r7, #0 @ preempt_schedule_irq 178 mov r7, #0 @ preempt_schedule_irq
179 str r7, [r8, #TI_PREEMPT] @ expects preempt_count == 0 179 str r7, [tsk, #TI_PREEMPT] @ expects preempt_count == 0
1801: bl preempt_schedule_irq @ irq en/disable is done inside 1801: bl preempt_schedule_irq @ irq en/disable is done inside
181 ldr r0, [r8, #TI_FLAGS] @ get new tasks TI_FLAGS 181 ldr r0, [tsk, #TI_FLAGS] @ get new tasks TI_FLAGS
182 tst r0, #_TIF_NEED_RESCHED 182 tst r0, #_TIF_NEED_RESCHED
183 beq preempt_return @ go again 183 beq preempt_return @ go again
184 b 1b 184 b 1b
@@ -338,21 +338,18 @@ __dabt_usr:
338__irq_usr: 338__irq_usr:
339 usr_entry irq 339 usr_entry irq
340 340
341 get_thread_info tsk
341#ifdef CONFIG_PREEMPT 342#ifdef CONFIG_PREEMPT
342 get_thread_info r8 343 ldr r8, [tsk, #TI_PREEMPT] @ get preempt count
343 ldr r9, [r8, #TI_PREEMPT] @ get preempt count 344 add r7, r8, #1 @ increment it
344 add r7, r9, #1 @ increment it 345 str r7, [tsk, #TI_PREEMPT]
345 str r7, [r8, #TI_PREEMPT]
346#endif 346#endif
347 irq_handler 347 irq_handler
348#ifdef CONFIG_PREEMPT 348#ifdef CONFIG_PREEMPT
349 ldr r0, [r8, #TI_PREEMPT] 349 ldr r0, [tsk, #TI_PREEMPT]
350 str r8, [tsk, #TI_PREEMPT]
350 teq r0, r7 351 teq r0, r7
351 str r9, [r8, #TI_PREEMPT]
352 strne r0, [r0, -r0] 352 strne r0, [r0, -r0]
353 mov tsk, r8
354#else
355 get_thread_info tsk
356#endif 353#endif
357 mov why, #0 354 mov why, #0
358 b ret_to_user 355 b ret_to_user