r2300_switch.S 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * r2300_switch.S: R2300 specific task switching code.
  4. *
  5. * Copyright (C) 1994, 1995, 1996, 1999 by Ralf Baechle
  6. * Copyright (C) 1994, 1995, 1996 by Andreas Busse
  7. *
  8. * Multi-cpu abstraction and macros for easier reading:
  9. * Copyright (C) 1996 David S. Miller (davem@davemloft.net)
  10. *
  11. * Further modifications to make this work:
  12. * Copyright (c) 1998-2000 Harald Koerfgen
  13. */
  14. #include <asm/asm.h>
  15. #include <asm/cachectl.h>
  16. #include <asm/fpregdef.h>
  17. #include <asm/mipsregs.h>
  18. #include <asm/asm-offsets.h>
  19. #include <asm/regdef.h>
  20. #include <asm/stackframe.h>
  21. #include <asm/thread_info.h>
  22. #include <asm/asmmacro.h>
  23. .set mips1
  24. .align 5
  25. /*
  26. * task_struct *resume(task_struct *prev, task_struct *next,
  27. * struct thread_info *next_ti)
  28. */
  29. LEAF(resume)
  30. mfc0 t1, CP0_STATUS
  31. sw t1, THREAD_STATUS(a0)
  32. cpu_save_nonscratch a0
  33. sw ra, THREAD_REG31(a0)
  34. #if defined(CONFIG_STACKPROTECTOR) && !defined(CONFIG_SMP)
  35. PTR_LA t8, __stack_chk_guard
  36. LONG_L t9, TASK_STACK_CANARY(a1)
  37. LONG_S t9, 0(t8)
  38. #endif
  39. /*
  40. * The order of restoring the registers takes care of the race
  41. * updating $28, $29 and kernelsp without disabling ints.
  42. */
  43. move $28, a2
  44. cpu_restore_nonscratch a1
  45. addiu t1, $28, _THREAD_SIZE - 32
  46. sw t1, kernelsp
  47. mfc0 t1, CP0_STATUS /* Do we really need this? */
  48. li a3, 0xff01
  49. and t1, a3
  50. lw a2, THREAD_STATUS(a1)
  51. nor a3, $0, a3
  52. and a2, a3
  53. or a2, t1
  54. mtc0 a2, CP0_STATUS
  55. move v0, a0
  56. jr ra
  57. END(resume)