^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* winfixup.S: Handle cases where user stack pointer is found to be bogus.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 1997, 2006 David S. Miller (davem@davemloft.net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <asm/asi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <asm/head.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <asm/page.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <asm/ptrace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <asm/processor.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <asm/spitfire.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <asm/thread_info.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) /* It used to be the case that these register window fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * handlers could run via the save and restore instructions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * done by the trap entry and exit code. They now do the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * window spill/fill by hand, so that case no longer can occur.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) .align 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) fill_fixup:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) TRAP_LOAD_THREAD_REG(%g6, %g1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) rdpr %tstate, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) and %g1, TSTATE_CWP, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) or %g4, FAULT_CODE_WINFIXUP, %g4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) stb %g4, [%g6 + TI_FAULT_CODE]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) stx %g5, [%g6 + TI_FAULT_ADDR]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) wrpr %g1, %cwp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) ba,pt %xcc, etrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) rd %pc, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) call do_sparc64_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) add %sp, PTREGS_OFF, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) ba,a,pt %xcc, rtrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) /* Be very careful about usage of the trap globals here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * You cannot touch %g5 as that has the fault information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) spill_fixup:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) spill_fixup_mna:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) spill_fixup_dax:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) TRAP_LOAD_THREAD_REG(%g6, %g1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) ldx [%g6 + TI_FLAGS], %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) andcc %sp, 0x1, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) movne %icc, 0, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) andcc %g1, _TIF_32BIT, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) ldub [%g6 + TI_WSAVED], %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) sll %g1, 3, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) add %g6, %g3, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) stx %sp, [%g3 + TI_RWIN_SPTRS]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) sll %g1, 7, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) bne,pt %xcc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) add %g6, %g3, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) stx %l0, [%g3 + TI_REG_WINDOW + 0x00]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) stx %l1, [%g3 + TI_REG_WINDOW + 0x08]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) stx %l2, [%g3 + TI_REG_WINDOW + 0x10]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) stx %l3, [%g3 + TI_REG_WINDOW + 0x18]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) stx %l4, [%g3 + TI_REG_WINDOW + 0x20]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) stx %l5, [%g3 + TI_REG_WINDOW + 0x28]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) stx %l6, [%g3 + TI_REG_WINDOW + 0x30]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) stx %l7, [%g3 + TI_REG_WINDOW + 0x38]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) stx %i0, [%g3 + TI_REG_WINDOW + 0x40]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) stx %i1, [%g3 + TI_REG_WINDOW + 0x48]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) stx %i2, [%g3 + TI_REG_WINDOW + 0x50]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) stx %i3, [%g3 + TI_REG_WINDOW + 0x58]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) stx %i4, [%g3 + TI_REG_WINDOW + 0x60]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) stx %i5, [%g3 + TI_REG_WINDOW + 0x68]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) stx %i6, [%g3 + TI_REG_WINDOW + 0x70]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) ba,pt %xcc, 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) stx %i7, [%g3 + TI_REG_WINDOW + 0x78]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) 1: stw %l0, [%g3 + TI_REG_WINDOW + 0x00]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) stw %l1, [%g3 + TI_REG_WINDOW + 0x04]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) stw %l2, [%g3 + TI_REG_WINDOW + 0x08]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) stw %l3, [%g3 + TI_REG_WINDOW + 0x0c]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) stw %l4, [%g3 + TI_REG_WINDOW + 0x10]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) stw %l5, [%g3 + TI_REG_WINDOW + 0x14]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) stw %l6, [%g3 + TI_REG_WINDOW + 0x18]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) stw %l7, [%g3 + TI_REG_WINDOW + 0x1c]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) stw %i0, [%g3 + TI_REG_WINDOW + 0x20]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) stw %i1, [%g3 + TI_REG_WINDOW + 0x24]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) stw %i2, [%g3 + TI_REG_WINDOW + 0x28]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) stw %i3, [%g3 + TI_REG_WINDOW + 0x2c]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) stw %i4, [%g3 + TI_REG_WINDOW + 0x30]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) stw %i5, [%g3 + TI_REG_WINDOW + 0x34]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) stw %i6, [%g3 + TI_REG_WINDOW + 0x38]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) stw %i7, [%g3 + TI_REG_WINDOW + 0x3c]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) 2: add %g1, 1, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) stb %g1, [%g6 + TI_WSAVED]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) rdpr %tstate, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) andcc %g1, TSTATE_PRIV, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) saved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) be,pn %xcc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) and %g1, TSTATE_CWP, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) retry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) 1: mov FAULT_CODE_WRITE | FAULT_CODE_DTLB | FAULT_CODE_WINFIXUP, %g4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) stb %g4, [%g6 + TI_FAULT_CODE]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) stx %g5, [%g6 + TI_FAULT_ADDR]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) wrpr %g1, %cwp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) ba,pt %xcc, etrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) rd %pc, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) call do_sparc64_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) add %sp, PTREGS_OFF, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) ba,a,pt %xcc, rtrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) winfix_mna:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) andn %g3, 0x7f, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) add %g3, 0x78, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) wrpr %g3, %tnpc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) fill_fixup_mna:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) rdpr %tstate, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) and %g1, TSTATE_CWP, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) wrpr %g1, %cwp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) ba,pt %xcc, etrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) rd %pc, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) sethi %hi(tlb_type), %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) lduw [%g1 + %lo(tlb_type)], %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) cmp %g1, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) bne,pt %icc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) add %sp, PTREGS_OFF, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) mov %l4, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) call sun4v_do_mna
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) mov %l5, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) ba,a,pt %xcc, rtrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 1: mov %l4, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) mov %l5, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) call mem_address_unaligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) ba,a,pt %xcc, rtrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) winfix_dax:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) andn %g3, 0x7f, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) add %g3, 0x74, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) wrpr %g3, %tnpc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) fill_fixup_dax:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) rdpr %tstate, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) and %g1, TSTATE_CWP, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) wrpr %g1, %cwp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) ba,pt %xcc, etrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) rd %pc, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) sethi %hi(tlb_type), %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) mov %l4, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) lduw [%g1 + %lo(tlb_type)], %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) mov %l5, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) cmp %g1, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) bne,pt %icc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) add %sp, PTREGS_OFF, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) call sun4v_data_access_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) ba,a,pt %xcc, rtrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 1: call spitfire_data_access_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) ba,a,pt %xcc, rtrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) nop