| 1 | /* SPDX-License-Identifier: GPL-2.0 */
|
| 2 | .globl utrap_trap
|
| 3 | .type utrap_trap, |
| 4 | utrap_trap: /* %g3=handler,%g4=level */
|
| 5 | TRAP_LOAD_THREAD_REG(%g6, %g1)
|
| 6 | ldx [%g6 + TI_UTRAPS], %g1
|
| 7 | brnz,pt %g1, invoke_utrap
|
| 8 | nop
|
| 9 |
|
| 10 | ba,pt %xcc, etrap
|
| 11 | rd %pc, %g7
|
| 12 | mov %l4, %o1
|
| 13 | call bad_trap
|
| 14 | add %sp, PTREGS_OFF, %o0
|
| 15 | ba,a,pt %xcc, rtrap
|
| 16 |
|
| 17 | invoke_utrap:
|
| 18 | sllx %g3, 3, %g3
|
| 19 | ldx [%g1 + %g3], %g1
|
| 20 | save %sp, -128, %sp
|
| 21 | rdpr %tstate, %l6
|
| 22 | rdpr %cwp, %l7
|
| 23 | andn %l6, TSTATE_CWP, %l6
|
| 24 | wrpr %l6, %l7, %tstate
|
| 25 | rdpr %tpc, %l6
|
| 26 | rdpr %tnpc, %l7
|
| 27 | wrpr %g1, 0, %tnpc
|
| 28 | done
|
| 29 | .size utrap_trap,.-utrap_trap
|