sbi_expected_trap.S 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * SPDX-License-Identifier: BSD-2-Clause
  3. *
  4. * Copyright (c) 2020 Western Digital Corporation or its affiliates.
  5. *
  6. * Authors:
  7. * Anup Patel <anup.patel@wdc.com>
  8. */
  9. #include <sbi/riscv_asm.h>
  10. #include <sbi/sbi_trap.h>
  11. /*
  12. * We assume that faulting instruction is 4-byte long and blindly
  13. * increment SEPC by 4.
  14. *
  15. * The trap info will be saved as follows:
  16. * A3 <- pointer struct sbi_trap_info
  17. * A4 <- temporary
  18. */
  19. .align 3
  20. .global __sbi_expected_trap
  21. __sbi_expected_trap:
  22. /* Without H-extension so, MTVAL2 and MTINST CSRs and GVA not available */
  23. csrr a4, CSR_MEPC
  24. REG_S a4, SBI_TRAP_INFO_OFFSET(epc)(a3)
  25. csrr a4, CSR_MCAUSE
  26. REG_S a4, SBI_TRAP_INFO_OFFSET(cause)(a3)
  27. csrr a4, CSR_MTVAL
  28. REG_S a4, SBI_TRAP_INFO_OFFSET(tval)(a3)
  29. REG_S zero, SBI_TRAP_INFO_OFFSET(tval2)(a3)
  30. REG_S zero, SBI_TRAP_INFO_OFFSET(tinst)(a3)
  31. REG_S zero, SBI_TRAP_INFO_OFFSET(gva)(a3)
  32. csrr a4, CSR_MEPC
  33. addi a4, a4, 4
  34. csrw CSR_MEPC, a4
  35. mret
  36. .align 3
  37. .global __sbi_expected_trap_hext
  38. __sbi_expected_trap_hext:
  39. /* With H-extension so, MTVAL2 and MTINST CSRs and GVA available */
  40. csrr a4, CSR_MEPC
  41. REG_S a4, SBI_TRAP_INFO_OFFSET(epc)(a3)
  42. csrr a4, CSR_MCAUSE
  43. REG_S a4, SBI_TRAP_INFO_OFFSET(cause)(a3)
  44. csrr a4, CSR_MTVAL
  45. REG_S a4, SBI_TRAP_INFO_OFFSET(tval)(a3)
  46. csrr a4, CSR_MTVAL2
  47. REG_S a4, SBI_TRAP_INFO_OFFSET(tval2)(a3)
  48. csrr a4, CSR_MTINST
  49. REG_S a4, SBI_TRAP_INFO_OFFSET(tinst)(a3)
  50. /* Extract GVA bit from MSTATUS or MSTATUSH */
  51. #if __riscv_xlen == 32
  52. csrr a4, CSR_MSTATUSH
  53. srli a4, a4, MSTATUSH_GVA_SHIFT
  54. #else
  55. csrr a4, CSR_MSTATUS
  56. srli a4, a4, MSTATUS_GVA_SHIFT
  57. #endif
  58. andi a4, a4, 1
  59. REG_S a4, SBI_TRAP_INFO_OFFSET(gva)(a3)
  60. csrr a4, CSR_MEPC
  61. addi a4, a4, 4
  62. csrw CSR_MEPC, a4
  63. mret