/* 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 |