diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2009-09-16 20:25:05 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2009-09-17 14:07:49 -0400 |
commit | f1e39a4a616cd9981a9decfd5332fd07a01abb8b (patch) | |
tree | 555e0c78611bb30cef2caca1ae1b5043a9999290 /arch/mips/kernel/scall64-64.S | |
parent | f4c6b6bc5a4fc8d607f2d89369008c85a3a12a8b (diff) |
MIPS: Rewrite sysmips(MIPS_ATOMIC_SET, ...) in C with inline assembler
This way it doesn't have to use CONFIG_CPU_HAS_LLSC anymore.
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/kernel/scall64-64.S')
-rw-r--r-- | arch/mips/kernel/scall64-64.S | 72 |
1 files changed, 0 insertions, 72 deletions
diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index 3d866f24e064..b97b993846d6 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S | |||
@@ -124,78 +124,6 @@ illegal_syscall: | |||
124 | j n64_syscall_exit | 124 | j n64_syscall_exit |
125 | END(handle_sys64) | 125 | END(handle_sys64) |
126 | 126 | ||
127 | LEAF(mips_atomic_set) | ||
128 | andi v0, a1, 3 # must be word aligned | ||
129 | bnez v0, bad_alignment | ||
130 | |||
131 | LONG_L v1, TI_ADDR_LIMIT($28) # in legal address range? | ||
132 | LONG_ADDIU a0, a1, 4 | ||
133 | or a0, a0, a1 | ||
134 | and a0, a0, v1 | ||
135 | bltz a0, bad_address | ||
136 | |||
137 | #ifdef CONFIG_CPU_HAS_LLSC | ||
138 | /* Ok, this is the ll/sc case. World is sane :-) */ | ||
139 | 1: ll v0, (a1) | ||
140 | move a0, a2 | ||
141 | 2: sc a0, (a1) | ||
142 | #if R10000_LLSC_WAR | ||
143 | beqzl a0, 1b | ||
144 | #else | ||
145 | beqz a0, 1b | ||
146 | #endif | ||
147 | |||
148 | .section __ex_table,"a" | ||
149 | PTR 1b, bad_stack | ||
150 | PTR 2b, bad_stack | ||
151 | .previous | ||
152 | #else | ||
153 | sw a1, 16(sp) | ||
154 | sw a2, 20(sp) | ||
155 | |||
156 | move a0, sp | ||
157 | move a2, a1 | ||
158 | li a1, 1 | ||
159 | jal do_page_fault | ||
160 | |||
161 | lw a1, 16(sp) | ||
162 | lw a2, 20(sp) | ||
163 | |||
164 | /* | ||
165 | * At this point the page should be readable and writable unless | ||
166 | * there was no more memory available. | ||
167 | */ | ||
168 | 1: lw v0, (a1) | ||
169 | 2: sw a2, (a1) | ||
170 | |||
171 | .section __ex_table,"a" | ||
172 | PTR 1b, no_mem | ||
173 | PTR 2b, no_mem | ||
174 | .previous | ||
175 | #endif | ||
176 | |||
177 | sd zero, PT_R7(sp) # success | ||
178 | sd v0, PT_R2(sp) # result | ||
179 | |||
180 | j n64_syscall_exit # continue like a normal syscall | ||
181 | |||
182 | no_mem: li v0, -ENOMEM | ||
183 | jr ra | ||
184 | |||
185 | bad_address: | ||
186 | li v0, -EFAULT | ||
187 | jr ra | ||
188 | |||
189 | bad_alignment: | ||
190 | li v0, -EINVAL | ||
191 | jr ra | ||
192 | END(mips_atomic_set) | ||
193 | |||
194 | LEAF(sys_sysmips) | ||
195 | beq a0, MIPS_ATOMIC_SET, mips_atomic_set | ||
196 | j _sys_sysmips | ||
197 | END(sys_sysmips) | ||
198 | |||
199 | .align 3 | 127 | .align 3 |
200 | sys_call_table: | 128 | sys_call_table: |
201 | PTR sys_read /* 5000 */ | 129 | PTR sys_read /* 5000 */ |