| /* |
| * linux/arch/arm/kernel/fiqasm.S |
| * |
| * Derived from code originally in linux/arch/arm/kernel/fiq.c: |
| * |
| * Copyright (C) 1998 Russell King |
| * Copyright (C) 1998, 1999 Phil Blundell |
| * Copyright (C) 2011, Linaro Limited |
| * |
| * FIQ support written by Philip Blundell <philb@gnu.org>, 1998. |
| * |
| * FIQ support re-written by Russell King to be more generic |
| * |
| * v7/Thumb-2 compatibility modifications by Linaro Limited, 2011. |
| */ |
| |
| #include <linux/linkage.h> |
| #include <asm/assembler.h> |
| |
| /* |
| * Taking an interrupt in FIQ mode is death, so both these functions |
| * disable irqs for the duration. |
| */ |
| |
| ENTRY(__set_fiq_regs) |
| mov r2, #PSR_I_BIT | PSR_F_BIT | FIQ_MODE |
| mrs r1, cpsr |
| msr cpsr_c, r2 @ select FIQ mode |
| mov r0, r0 @ avoid hazard prior to ARMv4 |
| ldmia r0!, {r8 - r12} |
| ldr sp, [r0], #4 |
| ldr lr, [r0] |
| msr cpsr_c, r1 @ return to SVC mode |
| mov r0, r0 @ avoid hazard prior to ARMv4 |
| mov pc, lr |
| ENDPROC(__set_fiq_regs) |
| |
| ENTRY(__get_fiq_regs) |
| mov r2, #PSR_I_BIT | PSR_F_BIT | FIQ_MODE |
| mrs r1, cpsr |
| msr cpsr_c, r2 @ select FIQ mode |
| mov r0, r0 @ avoid hazard prior to ARMv4 |
| stmia r0!, {r8 - r12} |
| str sp, [r0], #4 |
| str lr, [r0] |
| msr cpsr_c, r1 @ return to SVC mode |
| mov r0, r0 @ avoid hazard prior to ARMv4 |
| mov pc, lr |
| ENDPROC(__get_fiq_regs) |