[MIPS] Au1xx0: fix prom_getenv() to handle YAMON style environment
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / arch / mips / kernel / scall64-64.S
CommitLineData
1da177e4
LT
1/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * Copyright (C) 1995, 96, 97, 98, 99, 2000, 01, 02 by Ralf Baechle
7 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
8 * Copyright (C) 2001 MIPS Technologies, Inc.
9 */
10#include <linux/config.h>
11#include <linux/errno.h>
12#include <asm/asm.h>
13#include <asm/asmmacro.h>
14#include <asm/mipsregs.h>
15#include <asm/regdef.h>
16#include <asm/stackframe.h>
048eb582 17#include <asm/asm-offsets.h>
1da177e4
LT
18#include <asm/sysmips.h>
19#include <asm/thread_info.h>
20#include <asm/unistd.h>
21#include <asm/war.h>
22
23#ifndef CONFIG_BINFMT_ELF32
24/* Neither O32 nor N32, so define handle_sys here */
25#define handle_sys64 handle_sys
26#endif
27
28 .align 5
29NESTED(handle_sys64, PT_SIZE, sp)
30#if !defined(CONFIG_MIPS32_O32) && !defined(CONFIG_MIPS32_N32)
31 /*
32 * When 32-bit compatibility is configured scall_o32.S
33 * already did this.
34 */
35 .set noat
36 SAVE_SOME
37 STI
38 .set at
39#endif
40
41 dsubu t0, v0, __NR_64_Linux # check syscall number
42 sltiu t0, t0, __NR_64_Linux_syscalls + 1
43#if !defined(CONFIG_MIPS32_O32) && !defined(CONFIG_MIPS32_N32)
44 ld t1, PT_EPC(sp) # skip syscall on return
45 daddiu t1, 4 # skip to next instruction
46 sd t1, PT_EPC(sp)
47#endif
48 beqz t0, illegal_syscall
49
50 dsll t0, v0, 3 # offset into table
51 ld t2, (sys_call_table - (__NR_64_Linux * 8))(t0)
52 # syscall routine
53
54 sd a3, PT_R26(sp) # save a3 for syscall restarting
55
56 li t1, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
57 LONG_L t0, TI_FLAGS($28) # syscall tracing enabled?
58 and t0, t1, t0
59 bnez t0, syscall_trace_entry
60
61 jalr t2 # Do The Real Thing (TM)
62
63 li t0, -EMAXERRNO - 1 # error?
64 sltu t0, t0, v0
65 sd t0, PT_R7(sp) # set error flag
66 beqz t0, 1f
67
68 dnegu v0 # error
69 sd v0, PT_R0(sp) # set flag for syscall
70 # restarting
711: sd v0, PT_R2(sp) # result
72
73n64_syscall_exit:
74 local_irq_disable # make sure need_resched and
75 # signals dont change between
76 # sampling and return
77 LONG_L a2, TI_FLAGS($28) # current->work
78 li t0, _TIF_ALLWORK_MASK
79 and t0, a2, t0
80 bnez t0, n64_syscall_exit_work
81
82 j restore_partial
83
84n64_syscall_exit_work:
85 j syscall_exit_work_partial
86
87/* ------------------------------------------------------------------------ */
88
89syscall_trace_entry:
90 SAVE_STATIC
91 move s0, t2
92 move a0, sp
93 li a1, 0
94 jal do_syscall_trace
95
04a7052c
RB
96 move t0, s0
97 RESTORE_STATIC
1da177e4
LT
98 ld a0, PT_R4(sp) # Restore argument registers
99 ld a1, PT_R5(sp)
100 ld a2, PT_R6(sp)
101 ld a3, PT_R7(sp)
102 ld a4, PT_R8(sp)
103 ld a5, PT_R9(sp)
04a7052c 104 jalr t0
1da177e4
LT
105
106 li t0, -EMAXERRNO - 1 # error?
107 sltu t0, t0, v0
108 sd t0, PT_R7(sp) # set error flag
109 beqz t0, 1f
110
111 dnegu v0 # error
112 sd v0, PT_R0(sp) # set flag for syscall restarting
1131: sd v0, PT_R2(sp) # result
114
115 j syscall_exit
116
117illegal_syscall:
118 /* This also isn't a 64-bit syscall, throw an error. */
119 li v0, -ENOSYS # error
120 sd v0, PT_R2(sp)
121 li t0, 1 # set error flag
122 sd t0, PT_R7(sp)
123 j n64_syscall_exit
124 END(handle_sys64)
125
126 LEAF(mips_atomic_set)
127 andi v0, a1, 3 # must be word aligned
128 bnez v0, bad_alignment
129
130 LONG_L v1, TI_ADDR_LIMIT($28) # in legal address range?
131 LONG_ADDIU a0, a1, 4
132 or a0, a0, a1
133 and a0, a0, v1
134 bltz a0, bad_address
135
136#ifdef CONFIG_CPU_HAS_LLSC
137 /* Ok, this is the ll/sc case. World is sane :-) */
1381: ll v0, (a1)
139 move a0, a2
1402: sc a0, (a1)
141#if R10000_LLSC_WAR
142 beqzl a0, 1b
143#else
144 beqz a0, 1b
145#endif
146
147 .section __ex_table,"a"
148 PTR 1b, bad_stack
149 PTR 2b, bad_stack
150 .previous
151#else
152 sw a1, 16(sp)
153 sw a2, 20(sp)
154
155 move a0, sp
156 move a2, a1
157 li a1, 1
158 jal do_page_fault
159
160 lw a1, 16(sp)
161 lw a2, 20(sp)
162
163 /*
164 * At this point the page should be readable and writable unless
165 * there was no more memory available.
166 */
1671: lw v0, (a1)
1682: sw a2, (a1)
169
170 .section __ex_table,"a"
171 PTR 1b, no_mem
172 PTR 2b, no_mem
173 .previous
174#endif
175
176 sd zero, PT_R7(sp) # success
177 sd v0, PT_R2(sp) # result
178
edcb98d1 179 j n64_syscall_exit # continue like a normal syscall
1da177e4
LT
180
181no_mem: li v0, -ENOMEM
182 jr ra
183
184bad_address:
185 li v0, -EFAULT
186 jr ra
187
188bad_alignment:
189 li v0, -EINVAL
190 jr ra
191 END(mips_atomic_set)
192
193 LEAF(sys_sysmips)
194 beq a0, MIPS_ATOMIC_SET, mips_atomic_set
195 j _sys_sysmips
196 END(sys_sysmips)
197
198 .align 3
199sys_call_table:
200 PTR sys_read /* 5000 */
201 PTR sys_write
202 PTR sys_open
203 PTR sys_close
204 PTR sys_newstat
205 PTR sys_newfstat /* 5005 */
206 PTR sys_newlstat
207 PTR sys_poll
208 PTR sys_lseek
209 PTR old_mmap
210 PTR sys_mprotect /* 5010 */
211 PTR sys_munmap
212 PTR sys_brk
213 PTR sys_rt_sigaction
214 PTR sys_rt_sigprocmask
215 PTR sys_ioctl /* 5015 */
216 PTR sys_pread64
217 PTR sys_pwrite64
218 PTR sys_readv
219 PTR sys_writev
220 PTR sys_access /* 5020 */
221 PTR sys_pipe
222 PTR sys_select
223 PTR sys_sched_yield
224 PTR sys_mremap
225 PTR sys_msync /* 5025 */
226 PTR sys_mincore
227 PTR sys_madvise
228 PTR sys_shmget
229 PTR sys_shmat
230 PTR sys_shmctl /* 5030 */
231 PTR sys_dup
232 PTR sys_dup2
233 PTR sys_pause
234 PTR sys_nanosleep
235 PTR sys_getitimer /* 5035 */
236 PTR sys_setitimer
237 PTR sys_alarm
238 PTR sys_getpid
239 PTR sys_sendfile64
240 PTR sys_socket /* 5040 */
241 PTR sys_connect
242 PTR sys_accept
243 PTR sys_sendto
244 PTR sys_recvfrom
245 PTR sys_sendmsg /* 5045 */
246 PTR sys_recvmsg
247 PTR sys_shutdown
248 PTR sys_bind
249 PTR sys_listen
250 PTR sys_getsockname /* 5050 */
251 PTR sys_getpeername
252 PTR sys_socketpair
253 PTR sys_setsockopt
254 PTR sys_getsockopt
255 PTR sys_clone /* 5055 */
256 PTR sys_fork
257 PTR sys_execve
258 PTR sys_exit
259 PTR sys_wait4
260 PTR sys_kill /* 5060 */
261 PTR sys_newuname
262 PTR sys_semget
263 PTR sys_semop
264 PTR sys_semctl
265 PTR sys_shmdt /* 5065 */
266 PTR sys_msgget
267 PTR sys_msgsnd
268 PTR sys_msgrcv
269 PTR sys_msgctl
270 PTR sys_fcntl /* 5070 */
271 PTR sys_flock
272 PTR sys_fsync
273 PTR sys_fdatasync
274 PTR sys_truncate
275 PTR sys_ftruncate /* 5075 */
276 PTR sys_getdents
277 PTR sys_getcwd
278 PTR sys_chdir
279 PTR sys_fchdir
280 PTR sys_rename /* 5080 */
281 PTR sys_mkdir
282 PTR sys_rmdir
283 PTR sys_creat
284 PTR sys_link
285 PTR sys_unlink /* 5085 */
286 PTR sys_symlink
287 PTR sys_readlink
288 PTR sys_chmod
289 PTR sys_fchmod
290 PTR sys_chown /* 5090 */
291 PTR sys_fchown
292 PTR sys_lchown
293 PTR sys_umask
294 PTR sys_gettimeofday
295 PTR sys_getrlimit /* 5095 */
296 PTR sys_getrusage
297 PTR sys_sysinfo
298 PTR sys_times
299 PTR sys_ptrace
300 PTR sys_getuid /* 5100 */
301 PTR sys_syslog
302 PTR sys_getgid
303 PTR sys_setuid
304 PTR sys_setgid
305 PTR sys_geteuid /* 5105 */
306 PTR sys_getegid
307 PTR sys_setpgid
308 PTR sys_getppid
309 PTR sys_getpgrp
310 PTR sys_setsid /* 5110 */
311 PTR sys_setreuid
312 PTR sys_setregid
313 PTR sys_getgroups
314 PTR sys_setgroups
315 PTR sys_setresuid /* 5115 */
316 PTR sys_getresuid
317 PTR sys_setresgid
318 PTR sys_getresgid
319 PTR sys_getpgid
320 PTR sys_setfsuid /* 5120 */
321 PTR sys_setfsgid
322 PTR sys_getsid
323 PTR sys_capget
324 PTR sys_capset
325 PTR sys_rt_sigpending /* 5125 */
326 PTR sys_rt_sigtimedwait
327 PTR sys_rt_sigqueueinfo
328 PTR sys_rt_sigsuspend
329 PTR sys_sigaltstack
330 PTR sys_utime /* 5130 */
331 PTR sys_mknod
332 PTR sys_personality
333 PTR sys_ustat
334 PTR sys_statfs
335 PTR sys_fstatfs /* 5135 */
336 PTR sys_sysfs
337 PTR sys_getpriority
338 PTR sys_setpriority
339 PTR sys_sched_setparam
340 PTR sys_sched_getparam /* 5140 */
341 PTR sys_sched_setscheduler
342 PTR sys_sched_getscheduler
343 PTR sys_sched_get_priority_max
344 PTR sys_sched_get_priority_min
345 PTR sys_sched_rr_get_interval /* 5145 */
346 PTR sys_mlock
347 PTR sys_munlock
348 PTR sys_mlockall
349 PTR sys_munlockall
350 PTR sys_vhangup /* 5150 */
351 PTR sys_pivot_root
352 PTR sys_sysctl
353 PTR sys_prctl
354 PTR sys_adjtimex
355 PTR sys_setrlimit /* 5155 */
356 PTR sys_chroot
357 PTR sys_sync
358 PTR sys_acct
359 PTR sys_settimeofday
360 PTR sys_mount /* 5160 */
361 PTR sys_umount
362 PTR sys_swapon
363 PTR sys_swapoff
364 PTR sys_reboot
365 PTR sys_sethostname /* 5165 */
366 PTR sys_setdomainname
367 PTR sys_ni_syscall /* was create_module */
368 PTR sys_init_module
369 PTR sys_delete_module
370 PTR sys_ni_syscall /* 5170, was get_kernel_syms */
371 PTR sys_ni_syscall /* was query_module */
372 PTR sys_quotactl
373 PTR sys_nfsservctl
374 PTR sys_ni_syscall /* res. for getpmsg */
375 PTR sys_ni_syscall /* 5175 for putpmsg */
376 PTR sys_ni_syscall /* res. for afs_syscall */
377 PTR sys_ni_syscall /* res. for security */
378 PTR sys_gettid
379 PTR sys_readahead
380 PTR sys_setxattr /* 5180 */
381 PTR sys_lsetxattr
382 PTR sys_fsetxattr
383 PTR sys_getxattr
384 PTR sys_lgetxattr
385 PTR sys_fgetxattr /* 5185 */
386 PTR sys_listxattr
387 PTR sys_llistxattr
388 PTR sys_flistxattr
389 PTR sys_removexattr
390 PTR sys_lremovexattr /* 5190 */
391 PTR sys_fremovexattr
392 PTR sys_tkill
393 PTR sys_ni_syscall
394 PTR sys_futex
395 PTR sys_sched_setaffinity /* 5195 */
396 PTR sys_sched_getaffinity
397 PTR sys_cacheflush
398 PTR sys_cachectl
399 PTR sys_sysmips
400 PTR sys_io_setup /* 5200 */
401 PTR sys_io_destroy
402 PTR sys_io_getevents
403 PTR sys_io_submit
404 PTR sys_io_cancel
405 PTR sys_exit_group /* 5205 */
406 PTR sys_lookup_dcookie
407 PTR sys_epoll_create
408 PTR sys_epoll_ctl
409 PTR sys_epoll_wait
410 PTR sys_remap_file_pages /* 5210 */
411 PTR sys_rt_sigreturn
412 PTR sys_set_tid_address
413 PTR sys_restart_syscall
414 PTR sys_semtimedop
415 PTR sys_fadvise64_64 /* 5215 */
416 PTR sys_timer_create
417 PTR sys_timer_settime
418 PTR sys_timer_gettime
419 PTR sys_timer_getoverrun
420 PTR sys_timer_delete /* 5220 */
421 PTR sys_clock_settime
422 PTR sys_clock_gettime
423 PTR sys_clock_getres
424 PTR sys_clock_nanosleep
425 PTR sys_tgkill /* 5225 */
426 PTR sys_utimes
427 PTR sys_mbind
428 PTR sys_ni_syscall /* sys_get_mempolicy */
429 PTR sys_ni_syscall /* sys_set_mempolicy */
430 PTR sys_mq_open /* 5230 */
431 PTR sys_mq_unlink
432 PTR sys_mq_timedsend
433 PTR sys_mq_timedreceive
434 PTR sys_mq_notify
435 PTR sys_mq_getsetattr /* 5235 */
436 PTR sys_ni_syscall /* sys_vserver */
437 PTR sys_waitid
438 PTR sys_ni_syscall /* available, was setaltroot */
439 PTR sys_add_key
440 PTR sys_request_key /* 5240 */
441 PTR sys_keyctl
3c37026d 442 PTR sys_set_thread_area
7db36c85
RB
443 PTR sys_inotify_init
444 PTR sys_inotify_add_watch
445 PTR sys_inotify_rm_watch /* 5245 */
72bf8914
RB
446 PTR sys_migrate_pages
447 PTR sys_openat
448 PTR sys_mkdirat
449 PTR sys_mknodat
450 PTR sys_fchownat /* 5250 */
451 PTR sys_futimesat
452 PTR sys_newfstatat
453 PTR sys_unlinkat
454 PTR sys_renameat
455 PTR sys_linkat /* 5255 */
456 PTR sys_symlinkat
457 PTR sys_readlinkat
458 PTR sys_fchmodat
459 PTR sys_faccessat
460 PTR sys_pselect6 /* 5260 */
461 PTR sys_ppoll
462 PTR sys_unshare
f115da9c 463 PTR sys_splice
a8d587a7 464 PTR sys_sync_file_range