forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.3 KiB
53 lines
1.3 KiB
/* |
|
* 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 |
|
ret 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 |
|
ret lr |
|
ENDPROC(__get_fiq_regs) |
|
|
|
ENTRY(__FIQ_Branch) |
|
mov pc, r8 |
|
ENDPROC(__FIQ_Branch)
|
|
|