root/arch/sparc/kernel/utrap.S
/* 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