| .. | .. |
|---|
| 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 | * |
|---|