/* SPDX-License-Identifier: GPL-2.0 */ #include <asm/thread_info.h> #include <asm/trap_block.h> #include <asm/spitfire.h> #include <asm/ptrace.h> #include <asm/head.h> .text .align 8 .globl user_rtt_fill_fixup_common user_rtt_fill_fixup_common: rdpr %cwp, %g1 add %g1, 1, %g1 wrpr %g1, 0x0, %cwp rdpr %wstate, %g2 sll %g2, 3, %g2 wrpr %g2, 0x0, %wstate /* We know %canrestore and %otherwin are both zero. */ sethi %hi(sparc64_kern_pri_context), %g2 ldx [%g2 + %lo(sparc64_kern_pri_context)], %g2 mov PRIMARY_CONTEXT, %g1 661: stxa %g2, [%g1] ASI_DMMU .section .sun4v_1insn_patch, "ax" .word 661b stxa %g2, [%g1] ASI_MMU .previous sethi %hi(KERNBASE), %g1 flush %g1 mov %g4, %l4 mov %g5, %l5 brnz,pn %g3, 1f mov %g3, %l3 or %g4, FAULT_CODE_WINFIXUP, %g4 stb %g4, [%g6 + TI_FAULT_CODE] stx %g5, [%g6 + TI_FAULT_ADDR] 1: mov %g6, %l1 wrpr %g0, 0x0, %tl 661: nop .section .sun4v_1insn_patch, "ax" .word 661b SET_GL(0) .previous 661: wrpr %g0, RTRAP_PSTATE, %pstate .section .sun_m7_1insn_patch, "ax" .word 661b /* Re-enable PSTATE.mcde to maintain ADI security */ wrpr %g0, RTRAP_PSTATE|PSTATE_MCDE, %pstate .previous mov %l1, %g6 ldx [%g6 + TI_TASK], %g4 LOAD_PER_CPU_BASE(%g5, %g6, %g1, %g2, %g3) brnz,pn %l3, 1f nop call do_sparc64_fault add %sp, PTREGS_OFF, %o0 ba,pt %xcc, rtrap nop 1: cmp %g3, 2 bne,pn %xcc, 2f nop sethi %hi(tlb_type), %g1 lduw [%g1 + %lo(tlb_type)], %g1 cmp %g1, 3 bne,pt %icc, 1f add %sp, PTREGS_OFF, %o0 mov %l4, %o2 call sun4v_do_mna mov %l5, %o1 ba,a,pt %xcc, rtrap 1: mov %l4, %o1 mov %l5, %o2 call mem_address_unaligned nop ba,a,pt %xcc, rtrap 2: sethi %hi(tlb_type), %g1 mov %l4, %o1 lduw [%g1 + %lo(tlb_type)], %g1 mov %l5, %o2 cmp %g1, 3 bne,pt %icc, 1f add %sp, PTREGS_OFF, %o0 call sun4v_data_access_exception nop ba,a,pt %xcc, rtrap nop 1: call spitfire_data_access_exception nop ba,a,pt %xcc, rtrap