^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) /* SunOS's execv() call only specifies the argv argument, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * environment settings are the same as the calling processes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) sys64_execve:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) set sys_execve, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) jmpl %g1, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) flushw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) sys64_execveat:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) set sys_execveat, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) jmpl %g1, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) flushw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #ifdef CONFIG_COMPAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) sunos_execv:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) mov %g0, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) sys32_execve:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) set compat_sys_execve, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) jmpl %g1, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) flushw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) sys32_execveat:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) set compat_sys_execveat, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) jmpl %g1, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) flushw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) .align 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #ifdef CONFIG_COMPAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) sys32_sigstack:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) ba,pt %xcc, do_sys32_sigstack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) mov %i6, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) .align 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #ifdef CONFIG_COMPAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) sys32_sigreturn:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) add %sp, PTREGS_OFF, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) call do_sigreturn32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) add %o7, 1f-.-4, %o7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) sys_rt_sigreturn:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) add %sp, PTREGS_OFF, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) call do_rt_sigreturn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) add %o7, 1f-.-4, %o7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #ifdef CONFIG_COMPAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) sys32_rt_sigreturn:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) add %sp, PTREGS_OFF, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) call do_rt_sigreturn32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) add %o7, 1f-.-4, %o7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) .align 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) 1: ldx [%g6 + TI_FLAGS], %l5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) andcc %l5, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) be,pt %icc, rtrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) call syscall_trace_leave
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) add %sp, PTREGS_OFF, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) ba,pt %xcc, rtrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) /* This is how fork() was meant to be done, 8 instruction entry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) * I questioned the following code briefly, let me clear things
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * up so you must not reason on it like I did.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) * Know the fork_kpsr etc. we use in the sparc32 port? We don't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) * need it here because the only piece of window state we copy to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) * the child is the CWP register. Even if the parent sleeps,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * we are safe because we stuck it into pt_regs of the parent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * so it will not change.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * XXX This raises the question, whether we can do the same on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * XXX sparc32 to get rid of fork_kpsr _and_ fork_kwim. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) * XXX answer is yes. We stick fork_kpsr in UREG_G0 and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) * XXX fork_kwim in UREG_G1 (global registers are considered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) * XXX volatile across a system call in the sparc ABI I think
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) * XXX if it isn't we can use regs->y instead, anyone who depends
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) * XXX upon the Y register being preserved across a fork deserves
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) * XXX to lose).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) * In fact we should take advantage of that fact for other things
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) * during system calls...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) .align 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) sys_vfork:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) flushw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) ba,pt %xcc, sparc_vfork
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) add %sp, PTREGS_OFF, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) .align 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) sys_fork:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) flushw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) ba,pt %xcc, sparc_fork
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) add %sp, PTREGS_OFF, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) .align 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) sys_clone:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) flushw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) ba,pt %xcc, sparc_clone
^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)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) .globl ret_from_fork
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) ret_from_fork:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) /* Clear current_thread_info()->new_child. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) stb %g0, [%g6 + TI_NEW_CHILD]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) call schedule_tail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) mov %g7, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) ldx [%sp + PTREGS_OFF + PT_V9_I0], %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) brnz,pt %o0, ret_sys_call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) ldx [%g6 + TI_FLAGS], %l0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) ldx [%sp + PTREGS_OFF + PT_V9_G1], %l1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) call %l1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) ldx [%sp + PTREGS_OFF + PT_V9_G2], %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) ba,pt %xcc, ret_sys_call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) mov 0, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) .globl sparc_exit_group
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) .type sparc_exit_group,#function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) sparc_exit_group:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) sethi %hi(sys_exit_group), %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) ba,pt %xcc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) or %g7, %lo(sys_exit_group), %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) .size sparc_exit_group,.-sparc_exit_group
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) .globl sparc_exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) .type sparc_exit,#function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) sparc_exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) sethi %hi(sys_exit), %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) or %g7, %lo(sys_exit), %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 1: rdpr %pstate, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) wrpr %g2, PSTATE_IE, %pstate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) rdpr %otherwin, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) rdpr %cansave, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) add %g3, %g1, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) wrpr %g3, 0x0, %cansave
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) wrpr %g0, 0x0, %otherwin
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) wrpr %g2, 0x0, %pstate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) jmpl %g7, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) stb %g0, [%g6 + TI_WSAVED]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) .size sparc_exit,.-sparc_exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) linux_sparc_ni_syscall:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) sethi %hi(sys_ni_syscall), %l7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) ba,pt %xcc, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) or %l7, %lo(sys_ni_syscall), %l7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) linux_syscall_trace32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) call syscall_trace_enter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) add %sp, PTREGS_OFF, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) brnz,pn %o0, 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) mov -ENOSYS, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) /* Syscall tracing can modify the registers. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) ldx [%sp + PTREGS_OFF + PT_V9_G1], %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) sethi %hi(sys_call_table32), %l7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) ldx [%sp + PTREGS_OFF + PT_V9_I0], %i0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) or %l7, %lo(sys_call_table32), %l7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) ldx [%sp + PTREGS_OFF + PT_V9_I1], %i1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) ldx [%sp + PTREGS_OFF + PT_V9_I2], %i2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) ldx [%sp + PTREGS_OFF + PT_V9_I3], %i3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) ldx [%sp + PTREGS_OFF + PT_V9_I4], %i4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) ldx [%sp + PTREGS_OFF + PT_V9_I5], %i5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) cmp %g1, NR_syscalls
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) bgeu,pn %xcc, 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) mov -ENOSYS, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) sll %g1, 2, %l4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) srl %i0, 0, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) lduw [%l7 + %l4], %l7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) srl %i4, 0, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) srl %i1, 0, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) srl %i2, 0, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) ba,pt %xcc, 5f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) srl %i3, 0, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) linux_syscall_trace:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) call syscall_trace_enter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) add %sp, PTREGS_OFF, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) brnz,pn %o0, 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) mov -ENOSYS, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) /* Syscall tracing can modify the registers. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) ldx [%sp + PTREGS_OFF + PT_V9_G1], %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) sethi %hi(sys_call_table64), %l7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) ldx [%sp + PTREGS_OFF + PT_V9_I0], %i0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) or %l7, %lo(sys_call_table64), %l7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) ldx [%sp + PTREGS_OFF + PT_V9_I1], %i1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) ldx [%sp + PTREGS_OFF + PT_V9_I2], %i2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) ldx [%sp + PTREGS_OFF + PT_V9_I3], %i3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) ldx [%sp + PTREGS_OFF + PT_V9_I4], %i4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) ldx [%sp + PTREGS_OFF + PT_V9_I5], %i5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) cmp %g1, NR_syscalls
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) bgeu,pn %xcc, 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) mov -ENOSYS, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) sll %g1, 2, %l4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) mov %i0, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) lduw [%l7 + %l4], %l7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) mov %i1, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) mov %i2, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) mov %i3, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) b,pt %xcc, 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) mov %i4, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) /* Linux 32-bit system calls enter here... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) .align 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) .globl linux_sparc_syscall32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) linux_sparc_syscall32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) /* Direct access to user regs, much faster. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) cmp %g1, NR_syscalls ! IEU1 Group
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) bgeu,pn %xcc, linux_sparc_ni_syscall ! CTI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) srl %i0, 0, %o0 ! IEU0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) sll %g1, 2, %l4 ! IEU0 Group
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) srl %i4, 0, %o4 ! IEU1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) lduw [%l7 + %l4], %l7 ! Load
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) srl %i1, 0, %o1 ! IEU0 Group
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) ldx [%g6 + TI_FLAGS], %l0 ! Load
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) srl %i3, 0, %o3 ! IEU0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) srl %i2, 0, %o2 ! IEU0 Group
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) bne,pn %icc, linux_syscall_trace32 ! CTI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) mov %i0, %l5 ! IEU1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 5: call %l7 ! CTI Group brk forced
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) srl %i5, 0, %o5 ! IEU1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) ba,pt %xcc, 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) sra %o0, 0, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) /* Linux native system calls enter here... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) .align 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) .globl linux_sparc_syscall
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) linux_sparc_syscall:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) /* Direct access to user regs, much faster. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) cmp %g1, NR_syscalls ! IEU1 Group
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) bgeu,pn %xcc, linux_sparc_ni_syscall ! CTI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) mov %i0, %o0 ! IEU0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) sll %g1, 2, %l4 ! IEU0 Group
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) mov %i1, %o1 ! IEU1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) lduw [%l7 + %l4], %l7 ! Load
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 4: mov %i2, %o2 ! IEU0 Group
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) ldx [%g6 + TI_FLAGS], %l0 ! Load
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) mov %i3, %o3 ! IEU1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) mov %i4, %o4 ! IEU0 Group
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) bne,pn %icc, linux_syscall_trace ! CTI Group
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) mov %i0, %l5 ! IEU0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 2: call %l7 ! CTI Group brk forced
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) mov %i5, %o5 ! IEU0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 3: stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) ret_sys_call:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) mov %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) sllx %g2, 32, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) cmp %o0, -ERESTART_RESTARTBLOCK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) bgeu,pn %xcc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) /* System call success, clear Carry condition code. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) andn %g3, %g2, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) stx %g3, [%sp + PTREGS_OFF + PT_V9_TSTATE]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) bne,pn %icc, linux_syscall_trace2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) add %l1, 0x4, %l2 ! npc = npc+4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) stx %l1, [%sp + PTREGS_OFF + PT_V9_TPC]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) ba,pt %xcc, rtrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) /* Check if force_successful_syscall_return()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) * was invoked.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) ldub [%g6 + TI_SYS_NOERROR], %l2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) brnz,pn %l2, 2b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) /* System call failure, set Carry condition code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) * Also, get abs(errno) to return to the process.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) sub %g0, %o0, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) ba,pt %xcc, 3b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) or %g3, %g2, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) linux_syscall_trace2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) call syscall_trace_leave
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) add %sp, PTREGS_OFF, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) stx %l1, [%sp + PTREGS_OFF + PT_V9_TPC]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) ba,pt %xcc, rtrap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC]