assembler.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2023 StarFive Technology Co., Ltd.
  4. *
  5. * Author: Jee Heng Sia <jeeheng.sia@starfivetech.com>
  6. */
  7. #ifndef __ASSEMBLY__
  8. #error "Only include this from assembly code"
  9. #endif
  10. #ifndef __ASM_ASSEMBLER_H
  11. #define __ASM_ASSEMBLER_H
  12. #include <asm/asm.h>
  13. #include <asm/asm-offsets.h>
  14. #include <asm/csr.h>
  15. /*
  16. * suspend_restore_csrs - restore CSRs
  17. */
  18. .macro suspend_restore_csrs
  19. REG_L t0, (SUSPEND_CONTEXT_REGS + PT_EPC)(a0)
  20. csrw CSR_EPC, t0
  21. REG_L t0, (SUSPEND_CONTEXT_REGS + PT_STATUS)(a0)
  22. csrw CSR_STATUS, t0
  23. REG_L t0, (SUSPEND_CONTEXT_REGS + PT_BADADDR)(a0)
  24. csrw CSR_TVAL, t0
  25. REG_L t0, (SUSPEND_CONTEXT_REGS + PT_CAUSE)(a0)
  26. csrw CSR_CAUSE, t0
  27. .endm
  28. /*
  29. * suspend_restore_regs - Restore registers (except A0 and T0-T6)
  30. */
  31. .macro suspend_restore_regs
  32. REG_L ra, (SUSPEND_CONTEXT_REGS + PT_RA)(a0)
  33. REG_L sp, (SUSPEND_CONTEXT_REGS + PT_SP)(a0)
  34. REG_L gp, (SUSPEND_CONTEXT_REGS + PT_GP)(a0)
  35. REG_L tp, (SUSPEND_CONTEXT_REGS + PT_TP)(a0)
  36. REG_L s0, (SUSPEND_CONTEXT_REGS + PT_S0)(a0)
  37. REG_L s1, (SUSPEND_CONTEXT_REGS + PT_S1)(a0)
  38. REG_L a1, (SUSPEND_CONTEXT_REGS + PT_A1)(a0)
  39. REG_L a2, (SUSPEND_CONTEXT_REGS + PT_A2)(a0)
  40. REG_L a3, (SUSPEND_CONTEXT_REGS + PT_A3)(a0)
  41. REG_L a4, (SUSPEND_CONTEXT_REGS + PT_A4)(a0)
  42. REG_L a5, (SUSPEND_CONTEXT_REGS + PT_A5)(a0)
  43. REG_L a6, (SUSPEND_CONTEXT_REGS + PT_A6)(a0)
  44. REG_L a7, (SUSPEND_CONTEXT_REGS + PT_A7)(a0)
  45. REG_L s2, (SUSPEND_CONTEXT_REGS + PT_S2)(a0)
  46. REG_L s3, (SUSPEND_CONTEXT_REGS + PT_S3)(a0)
  47. REG_L s4, (SUSPEND_CONTEXT_REGS + PT_S4)(a0)
  48. REG_L s5, (SUSPEND_CONTEXT_REGS + PT_S5)(a0)
  49. REG_L s6, (SUSPEND_CONTEXT_REGS + PT_S6)(a0)
  50. REG_L s7, (SUSPEND_CONTEXT_REGS + PT_S7)(a0)
  51. REG_L s8, (SUSPEND_CONTEXT_REGS + PT_S8)(a0)
  52. REG_L s9, (SUSPEND_CONTEXT_REGS + PT_S9)(a0)
  53. REG_L s10, (SUSPEND_CONTEXT_REGS + PT_S10)(a0)
  54. REG_L s11, (SUSPEND_CONTEXT_REGS + PT_S11)(a0)
  55. .endm
  56. /*
  57. * copy_page - copy 1 page (4KB) of data from source to destination
  58. * @a0 - destination
  59. * @a1 - source
  60. */
  61. .macro copy_page a0, a1
  62. lui a2, 0x1
  63. add a2, a2, a0
  64. 1 :
  65. REG_L t0, 0(a1)
  66. REG_L t1, SZREG(a1)
  67. REG_S t0, 0(a0)
  68. REG_S t1, SZREG(a0)
  69. addi a0, a0, 2 * SZREG
  70. addi a1, a1, 2 * SZREG
  71. bne a2, a0, 1b
  72. .endm
  73. #endif /* __ASM_ASSEMBLER_H */