diff options
Diffstat (limited to 'arch/sparc/kernel/syscalls.S')
| -rw-r--r-- | arch/sparc/kernel/syscalls.S | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/arch/sparc/kernel/syscalls.S b/arch/sparc/kernel/syscalls.S index 7f5f65d0b3fd..e0fed7711a94 100644 --- a/arch/sparc/kernel/syscalls.S +++ b/arch/sparc/kernel/syscalls.S | |||
| @@ -1,23 +1,19 @@ | |||
| 1 | /* SunOS's execv() call only specifies the argv argument, the | 1 | /* SunOS's execv() call only specifies the argv argument, the |
| 2 | * environment settings are the same as the calling processes. | 2 | * environment settings are the same as the calling processes. |
| 3 | */ | 3 | */ |
| 4 | sys_execve: | 4 | sys64_execve: |
| 5 | sethi %hi(sparc_execve), %g1 | 5 | set sys_execve, %g1 |
| 6 | ba,pt %xcc, execve_merge | 6 | jmpl %g1, %g0 |
| 7 | or %g1, %lo(sparc_execve), %g1 | 7 | flushw |
| 8 | 8 | ||
| 9 | #ifdef CONFIG_COMPAT | 9 | #ifdef CONFIG_COMPAT |
| 10 | sunos_execv: | 10 | sunos_execv: |
| 11 | stx %g0, [%sp + PTREGS_OFF + PT_V9_I2] | 11 | mov %g0, %o2 |
| 12 | sys32_execve: | 12 | sys32_execve: |
| 13 | sethi %hi(sparc32_execve), %g1 | 13 | set compat_sys_execve, %g1 |
| 14 | or %g1, %lo(sparc32_execve), %g1 | ||
| 15 | #endif | ||
| 16 | |||
| 17 | execve_merge: | ||
| 18 | flushw | ||
| 19 | jmpl %g1, %g0 | 14 | jmpl %g1, %g0 |
| 20 | add %sp, PTREGS_OFF, %o0 | 15 | flushw |
| 16 | #endif | ||
| 21 | 17 | ||
| 22 | .align 32 | 18 | .align 32 |
| 23 | sys_sparc_pipe: | 19 | sys_sparc_pipe: |
| @@ -112,16 +108,31 @@ sys_clone: | |||
| 112 | ret_from_syscall: | 108 | ret_from_syscall: |
| 113 | /* Clear current_thread_info()->new_child. */ | 109 | /* Clear current_thread_info()->new_child. */ |
| 114 | stb %g0, [%g6 + TI_NEW_CHILD] | 110 | stb %g0, [%g6 + TI_NEW_CHILD] |
| 115 | ldx [%g6 + TI_FLAGS], %l0 | ||
| 116 | call schedule_tail | 111 | call schedule_tail |
| 117 | mov %g7, %o0 | 112 | mov %g7, %o0 |
| 113 | ldx [%sp + PTREGS_OFF + PT_V9_I0], %o0 | ||
| 114 | brnz,pt %o0, ret_sys_call | ||
| 115 | ldx [%g6 + TI_FLAGS], %l0 | ||
| 116 | ldx [%sp + PTREGS_OFF + PT_V9_G1], %l1 | ||
| 117 | call %l1 | ||
| 118 | ldx [%sp + PTREGS_OFF + PT_V9_G2], %o0 | ||
| 118 | ba,pt %xcc, ret_sys_call | 119 | ba,pt %xcc, ret_sys_call |
| 119 | ldx [%sp + PTREGS_OFF + PT_V9_I0], %o0 | 120 | mov 0, %o0 |
| 121 | |||
| 122 | .globl sparc_exit_group | ||
| 123 | .type sparc_exit_group,#function | ||
| 124 | sparc_exit_group: | ||
| 125 | sethi %hi(sys_exit_group), %g7 | ||
| 126 | ba,pt %xcc, 1f | ||
| 127 | or %g7, %lo(sys_exit_group), %g7 | ||
| 128 | .size sparc_exit_group,.-sparc_exit_group | ||
| 120 | 129 | ||
| 121 | .globl sparc_exit | 130 | .globl sparc_exit |
| 122 | .type sparc_exit,#function | 131 | .type sparc_exit,#function |
| 123 | sparc_exit: | 132 | sparc_exit: |
| 124 | rdpr %pstate, %g2 | 133 | sethi %hi(sys_exit), %g7 |
| 134 | or %g7, %lo(sys_exit), %g7 | ||
| 135 | 1: rdpr %pstate, %g2 | ||
| 125 | wrpr %g2, PSTATE_IE, %pstate | 136 | wrpr %g2, PSTATE_IE, %pstate |
| 126 | rdpr %otherwin, %g1 | 137 | rdpr %otherwin, %g1 |
| 127 | rdpr %cansave, %g3 | 138 | rdpr %cansave, %g3 |
| @@ -129,7 +140,7 @@ sparc_exit: | |||
| 129 | wrpr %g3, 0x0, %cansave | 140 | wrpr %g3, 0x0, %cansave |
| 130 | wrpr %g0, 0x0, %otherwin | 141 | wrpr %g0, 0x0, %otherwin |
| 131 | wrpr %g2, 0x0, %pstate | 142 | wrpr %g2, 0x0, %pstate |
| 132 | ba,pt %xcc, sys_exit | 143 | jmpl %g7, %g0 |
| 133 | stb %g0, [%g6 + TI_WSAVED] | 144 | stb %g0, [%g6 + TI_WSAVED] |
| 134 | .size sparc_exit,.-sparc_exit | 145 | .size sparc_exit,.-sparc_exit |
| 135 | 146 | ||
| @@ -222,7 +233,6 @@ ret_sys_call: | |||
| 222 | ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc | 233 | ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc |
| 223 | 234 | ||
| 224 | 2: | 235 | 2: |
| 225 | stb %g0, [%g6 + TI_SYS_NOERROR] | ||
| 226 | /* System call success, clear Carry condition code. */ | 236 | /* System call success, clear Carry condition code. */ |
| 227 | andn %g3, %g2, %g3 | 237 | andn %g3, %g2, %g3 |
| 228 | 3: | 238 | 3: |
