ivec.S 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /* The registers for cross calls will be:
  3. *
  4. * DATA 0: [low 32-bits] Address of function to call, jmp to this
  5. * [high 32-bits] MMU Context Argument 0, place in %g5
  6. * DATA 1: Address Argument 1, place in %g1
  7. * DATA 2: Address Argument 2, place in %g7
  8. *
  9. * With this method we can do most of the cross-call tlb/cache
  10. * flushing very quickly.
  11. */
  12. .align 32
  13. .globl do_ivec
  14. .type do_ivec,#function
  15. do_ivec:
  16. mov 0x40, %g3
  17. ldxa [%g3 + %g0] ASI_INTR_R, %g3
  18. sethi %hi(KERNBASE), %g4
  19. cmp %g3, %g4
  20. bgeu,pn %xcc, do_ivec_xcall
  21. srlx %g3, 32, %g5
  22. stxa %g0, [%g0] ASI_INTR_RECEIVE
  23. membar #Sync
  24. sethi %hi(ivector_table_pa), %g2
  25. ldx [%g2 + %lo(ivector_table_pa)], %g2
  26. sllx %g3, 4, %g3
  27. add %g2, %g3, %g3
  28. TRAP_LOAD_IRQ_WORK_PA(%g6, %g1)
  29. ldx [%g6], %g5
  30. stxa %g5, [%g3] ASI_PHYS_USE_EC
  31. stx %g3, [%g6]
  32. wr %g0, 1 << PIL_DEVICE_IRQ, %set_softint
  33. retry
  34. do_ivec_xcall:
  35. mov 0x50, %g1
  36. ldxa [%g1 + %g0] ASI_INTR_R, %g1
  37. srl %g3, 0, %g3
  38. mov 0x60, %g7
  39. ldxa [%g7 + %g0] ASI_INTR_R, %g7
  40. stxa %g0, [%g0] ASI_INTR_RECEIVE
  41. membar #Sync
  42. ba,pt %xcc, 1f
  43. nop
  44. .align 32
  45. 1: jmpl %g3, %g0
  46. nop
  47. .size do_ivec,.-do_ivec