| .. | .. |
|---|
| 209 | 209 | |
|---|
| 210 | 210 | #ifdef CONFIG_PREEMPT |
|---|
| 211 | 211 | ldr r8, [tsk, #TI_PREEMPT] @ get preempt count |
|---|
| 212 | | - ldr r0, [tsk, #TI_FLAGS] @ get flags |
|---|
| 213 | 212 | teq r8, #0 @ if preempt count != 0 |
|---|
| 213 | + bne 1f @ return from exeption |
|---|
| 214 | + ldr r0, [tsk, #TI_FLAGS] @ get flags |
|---|
| 215 | + tst r0, #_TIF_NEED_RESCHED @ if NEED_RESCHED is set |
|---|
| 216 | + blne svc_preempt @ preempt! |
|---|
| 217 | + |
|---|
| 218 | + ldr r8, [tsk, #TI_PREEMPT_LAZY] @ get preempt lazy count |
|---|
| 219 | + teq r8, #0 @ if preempt lazy count != 0 |
|---|
| 214 | 220 | movne r0, #0 @ force flags to 0 |
|---|
| 215 | | - tst r0, #_TIF_NEED_RESCHED |
|---|
| 221 | + tst r0, #_TIF_NEED_RESCHED_LAZY |
|---|
| 216 | 222 | blne svc_preempt |
|---|
| 223 | +1: |
|---|
| 217 | 224 | #endif |
|---|
| 218 | 225 | |
|---|
| 219 | 226 | svc_exit r5, irq = 1 @ return from exception |
|---|
| .. | .. |
|---|
| 228 | 235 | 1: bl preempt_schedule_irq @ irq en/disable is done inside |
|---|
| 229 | 236 | ldr r0, [tsk, #TI_FLAGS] @ get new tasks TI_FLAGS |
|---|
| 230 | 237 | tst r0, #_TIF_NEED_RESCHED |
|---|
| 238 | + bne 1b |
|---|
| 239 | + tst r0, #_TIF_NEED_RESCHED_LAZY |
|---|
| 231 | 240 | reteq r8 @ go again |
|---|
| 232 | | - b 1b |
|---|
| 241 | + ldr r0, [tsk, #TI_PREEMPT_LAZY] @ get preempt lazy count |
|---|
| 242 | + teq r0, #0 @ if preempt lazy count != 0 |
|---|
| 243 | + beq 1b |
|---|
| 244 | + ret r8 @ go again |
|---|
| 245 | + |
|---|
| 233 | 246 | #endif |
|---|
| 234 | 247 | |
|---|
| 235 | 248 | __und_fault: |
|---|