genex.S 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
  4. *
  5. * Derived from MIPS:
  6. * Copyright (C) 1994 - 2000, 2001, 2003 Ralf Baechle
  7. * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
  8. * Copyright (C) 2002, 2007 Maciej W. Rozycki
  9. * Copyright (C) 2001, 2012 MIPS Technologies, Inc. All rights reserved.
  10. */
  11. #include <asm/asm.h>
  12. #include <asm/asmmacro.h>
  13. #include <asm/loongarch.h>
  14. #include <asm/regdef.h>
  15. #include <asm/fpregdef.h>
  16. #include <asm/stackframe.h>
  17. #include <asm/thread_info.h>
  18. .align 5
  19. SYM_FUNC_START(__arch_cpu_idle)
  20. /* start of rollback region */
  21. LONG_L t0, tp, TI_FLAGS
  22. nop
  23. andi t0, t0, _TIF_NEED_RESCHED
  24. bnez t0, 1f
  25. nop
  26. nop
  27. nop
  28. idle 0
  29. /* end of rollback region */
  30. 1: jr ra
  31. SYM_FUNC_END(__arch_cpu_idle)
  32. SYM_FUNC_START(handle_vint)
  33. BACKUP_T0T1
  34. SAVE_ALL
  35. la.abs t1, __arch_cpu_idle
  36. LONG_L t0, sp, PT_ERA
  37. /* 32 byte rollback region */
  38. ori t0, t0, 0x1f
  39. xori t0, t0, 0x1f
  40. bne t0, t1, 1f
  41. LONG_S t0, sp, PT_ERA
  42. 1: move a0, sp
  43. move a1, sp
  44. la.abs t0, do_vint
  45. jirl ra, t0, 0
  46. RESTORE_ALL_AND_RET
  47. SYM_FUNC_END(handle_vint)
  48. SYM_FUNC_START(except_vec_cex)
  49. b cache_parity_error
  50. SYM_FUNC_END(except_vec_cex)
  51. .macro build_prep_badv
  52. csrrd t0, LOONGARCH_CSR_BADV
  53. PTR_S t0, sp, PT_BVADDR
  54. .endm
  55. .macro build_prep_fcsr
  56. movfcsr2gr a1, fcsr0
  57. .endm
  58. .macro build_prep_none
  59. .endm
  60. .macro BUILD_HANDLER exception handler prep
  61. .align 5
  62. SYM_FUNC_START(handle_\exception)
  63. BACKUP_T0T1
  64. SAVE_ALL
  65. build_prep_\prep
  66. move a0, sp
  67. la.abs t0, do_\handler
  68. jirl ra, t0, 0
  69. RESTORE_ALL_AND_RET
  70. SYM_FUNC_END(handle_\exception)
  71. .endm
  72. BUILD_HANDLER ade ade badv
  73. BUILD_HANDLER ale ale badv
  74. BUILD_HANDLER bp bp none
  75. BUILD_HANDLER fpe fpe fcsr
  76. BUILD_HANDLER fpu fpu none
  77. BUILD_HANDLER lsx lsx none
  78. BUILD_HANDLER lasx lasx none
  79. BUILD_HANDLER lbt lbt none
  80. BUILD_HANDLER ri ri none
  81. BUILD_HANDLER watch watch none
  82. BUILD_HANDLER reserved reserved none /* others */
  83. SYM_FUNC_START(handle_sys)
  84. la.abs t0, handle_syscall
  85. jr t0
  86. SYM_FUNC_END(handle_sys)