1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | .globl utrap_trap |
3 | .type utrap_trap,#function |
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 |
30 | |