ctx_sw_asm.S 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
  4. *
  5. * Vineetg: Aug 2009
  6. * -Moved core context switch macro out of entry.S into this file.
  7. * -This is the more "natural" hand written assembler
  8. */
  9. #include <linux/linkage.h>
  10. #include <asm/entry.h> /* For the SAVE_* macros */
  11. #include <asm/asm-offsets.h>
  12. ; IN
  13. ; - r0: prev task (also current)
  14. ; - r1: next task
  15. ; OUT
  16. ; - r0: prev task (so r0 not touched)
  17. .section .sched.text,"ax",@progbits
  18. ENTRY_CFI(__switch_to)
  19. /* save kernel stack frame regs of @prev task */
  20. push blink
  21. CFI_DEF_CFA_OFFSET 4
  22. CFI_OFFSET r31, -4
  23. push fp
  24. CFI_DEF_CFA_OFFSET 8
  25. CFI_OFFSET r27, -8
  26. mov fp, sp
  27. CFI_DEF_CFA_REGISTER r27
  28. /* kernel mode callee regs of @prev */
  29. SAVE_CALLEE_SAVED_KERNEL
  30. /*
  31. * save final SP to @prev->thread_info.ksp
  32. * @prev is "current" so thread_info derived from SP
  33. */
  34. GET_CURR_THR_INFO_FROM_SP r10
  35. st sp, [r10, THREAD_INFO_KSP]
  36. /* update @next in _current_task[] and GP register caching it */
  37. SET_CURR_TASK_ON_CPU r1, r10
  38. /* load SP from @next->thread_info.ksp */
  39. ld r10, [r1, TASK_THREAD_INFO]
  40. ld sp, [r10, THREAD_INFO_KSP]
  41. /* restore callee regs, stack frame regs of @next */
  42. RESTORE_CALLEE_SAVED_KERNEL
  43. pop fp
  44. CFI_RESTORE r27
  45. CFI_DEF_CFA r28, 4
  46. pop blink
  47. CFI_RESTORE r31
  48. CFI_DEF_CFA_OFFSET 0
  49. j [blink]
  50. END_CFI(__switch_to)