fiqasm.S 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. /*
  2. * linux/arch/arm/kernel/fiqasm.S
  3. *
  4. * Derived from code originally in linux/arch/arm/kernel/fiq.c:
  5. *
  6. * Copyright (C) 1998 Russell King
  7. * Copyright (C) 1998, 1999 Phil Blundell
  8. * Copyright (C) 2011, Linaro Limited
  9. *
  10. * FIQ support written by Philip Blundell <philb@gnu.org>, 1998.
  11. *
  12. * FIQ support re-written by Russell King to be more generic
  13. *
  14. * v7/Thumb-2 compatibility modifications by Linaro Limited, 2011.
  15. */
  16. #include <linux/linkage.h>
  17. #include <asm/assembler.h>
  18. /*
  19. * Taking an interrupt in FIQ mode is death, so both these functions
  20. * disable irqs for the duration.
  21. */
  22. ENTRY(__set_fiq_regs)
  23. mov r2, #PSR_I_BIT | PSR_F_BIT | FIQ_MODE
  24. mrs r1, cpsr
  25. msr cpsr_c, r2 @ select FIQ mode
  26. mov r0, r0 @ avoid hazard prior to ARMv4
  27. ldmia r0!, {r8 - r12}
  28. ldr sp, [r0], #4
  29. ldr lr, [r0]
  30. msr cpsr_c, r1 @ return to SVC mode
  31. mov r0, r0 @ avoid hazard prior to ARMv4
  32. ret lr
  33. ENDPROC(__set_fiq_regs)
  34. ENTRY(__get_fiq_regs)
  35. mov r2, #PSR_I_BIT | PSR_F_BIT | FIQ_MODE
  36. mrs r1, cpsr
  37. msr cpsr_c, r2 @ select FIQ mode
  38. mov r0, r0 @ avoid hazard prior to ARMv4
  39. stmia r0!, {r8 - r12}
  40. str sp, [r0], #4
  41. str lr, [r0]
  42. msr cpsr_c, r1 @ return to SVC mode
  43. mov r0, r0 @ avoid hazard prior to ARMv4
  44. ret lr
  45. ENDPROC(__get_fiq_regs)