| /* SPDX-License-Identifier: GPL-2.0 */ |
| .globl utrap_trap |
| .type utrap_trap,#function |
| utrap_trap: /* %g3=handler,%g4=level */ |
| TRAP_LOAD_THREAD_REG(%g6, %g1) |
| ldx [%g6 + TI_UTRAPS], %g1 |
| brnz,pt %g1, invoke_utrap |
| nop |
| |
| ba,pt %xcc, etrap |
| rd %pc, %g7 |
| mov %l4, %o1 |
| call bad_trap |
| add %sp, PTREGS_OFF, %o0 |
| ba,a,pt %xcc, rtrap |
| |
| invoke_utrap: |
| sllx %g3, 3, %g3 |
| ldx [%g1 + %g3], %g1 |
| save %sp, -128, %sp |
| rdpr %tstate, %l6 |
| rdpr %cwp, %l7 |
| andn %l6, TSTATE_CWP, %l6 |
| wrpr %l6, %l7, %tstate |
| rdpr %tpc, %l6 |
| rdpr %tnpc, %l7 |
| wrpr %g1, 0, %tnpc |
| done |
| .size utrap_trap,.-utrap_trap |