.. | .. |
---|
203 | 203 | .macro svc_exit, rpsr, irq = 0 |
---|
204 | 204 | .if \irq != 0 |
---|
205 | 205 | @ IRQs already off |
---|
206 | | -#ifdef CONFIG_TRACE_IRQFLAGS |
---|
207 | 206 | @ The parent context IRQs must have been enabled to get here in |
---|
208 | 207 | @ the first place, so there's no point checking the PSR I bit. |
---|
| 208 | +#ifdef CONFIG_IRQ_PIPELINE |
---|
| 209 | + mov r0, sp |
---|
| 210 | + bl kentry_exit_pipelined |
---|
| 211 | +#elif defined(CONFIG_TRACE_IRQFLAGS) |
---|
209 | 212 | bl trace_hardirqs_on |
---|
210 | 213 | #endif |
---|
211 | 214 | .else |
---|
212 | 215 | @ IRQs off again before pulling preserved data off the stack |
---|
213 | 216 | disable_irq_notrace |
---|
214 | | -#ifdef CONFIG_TRACE_IRQFLAGS |
---|
| 217 | +#ifdef CONFIG_IRQ_PIPELINE |
---|
| 218 | + mov r0, sp |
---|
| 219 | + bl kentry_exit_pipelined |
---|
| 220 | +#elif defined(CONFIG_TRACE_IRQFLAGS) |
---|
215 | 221 | tst \rpsr, #PSR_I_BIT |
---|
216 | 222 | bleq trace_hardirqs_on |
---|
217 | 223 | tst \rpsr, #PSR_I_BIT |
---|
.. | .. |
---|
402 | 408 | .endm |
---|
403 | 409 | |
---|
404 | 410 | /* |
---|
| 411 | + * Branch to the exception epilogue, skipping the in-band work |
---|
| 412 | + * if running over the out-of-band interrupt stage. |
---|
| 413 | + */ |
---|
| 414 | + .macro ret_to_user_pipelined, tmp |
---|
| 415 | +#ifdef CONFIG_IRQ_PIPELINE |
---|
| 416 | + ldr \tmp, [tsk, #TI_LOCAL_FLAGS] |
---|
| 417 | + tst \tmp, #_TLF_OOB |
---|
| 418 | + bne fast_ret_to_user |
---|
| 419 | +#endif |
---|
| 420 | + b ret_to_user |
---|
| 421 | + .endm |
---|
| 422 | + |
---|
| 423 | +/* |
---|
405 | 424 | * These are the registers used in the syscall handler, and allow us to |
---|
406 | 425 | * have in theory up to 7 arguments to a function - r0 to r6. |
---|
407 | 426 | * |
---|