OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [arch/] [mips/] [kernel/] [scall64-o32.S] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/*
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 - 2000, 2001 by Ralf Baechle
7
 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
8
 * Copyright (C) 2001 MIPS Technologies, Inc.
9
 * Copyright (C) 2004 Thiemo Seufer
10
 *
11
 * Hairy, the userspace application uses a different argument passing
12
 * convention than the kernel, so we have to translate things from o32
13
 * to ABI64 calling convention.  64-bit syscalls are also processed
14
 * here for now.
15
 */
16
#include 
17
#include 
18
#include 
19
#include 
20
#include 
21
#include 
22
#include 
23
#include 
24
#include 
25
#include 
26
 
27
        .align  5
28
NESTED(handle_sys, PT_SIZE, sp)
29
        .set    noat
30
        SAVE_SOME
31
        TRACE_IRQS_ON_RELOAD
32
        STI
33
        .set    at
34
        ld      t1, PT_EPC(sp)          # skip syscall on return
35
 
36
        dsubu   t0, v0, __NR_O32_Linux  # check syscall number
37
        sltiu   t0, t0, __NR_O32_Linux_syscalls + 1
38
        daddiu  t1, 4                   # skip to next instruction
39
        sd      t1, PT_EPC(sp)
40
        beqz    t0, not_o32_scall
41
#if 0
42
 SAVE_ALL
43
 move a1, v0
44
 PRINT("Scall %ld\n")
45
 RESTORE_ALL
46
#endif
47
 
48
        /* We don't want to stumble over broken sign extensions from
49
           userland. O32 does never use the upper half. */
50
        sll     a0, a0, 0
51
        sll     a1, a1, 0
52
        sll     a2, a2, 0
53
        sll     a3, a3, 0
54
 
55
        dsll    t0, v0, 3               # offset into table
56
        ld      t2, (sys_call_table - (__NR_O32_Linux * 8))(t0)
57
 
58
        sd      a3, PT_R26(sp)          # save a3 for syscall restarting
59
 
60
        /*
61
         * More than four arguments.  Try to deal with it by copying the
62
         * stack arguments from the user stack to the kernel stack.
63
         * This Sucks (TM).
64
         *
65
         * We intentionally keep the kernel stack a little below the top of
66
         * userspace so we don't have to do a slower byte accurate check here.
67
         */
68
        ld      t0, PT_R29(sp)          # get old user stack pointer
69
        daddu   t1, t0, 32
70
        bltz    t1, bad_stack
71
 
72
1:      lw      a4, 16(t0)              # argument #5 from usp
73
2:      lw      a5, 20(t0)              # argument #6 from usp
74
3:      lw      a6, 24(t0)              # argument #7 from usp
75
4:      lw      a7, 28(t0)              # argument #8 from usp (for indirect syscalls)
76
 
77
        .section __ex_table,"a"
78
        PTR     1b, bad_stack
79
        PTR     2b, bad_stack
80
        PTR     3b, bad_stack
81
        PTR     4b, bad_stack
82
        .previous
83
 
84
        li      t1, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
85
        LONG_L  t0, TI_FLAGS($28)       # syscall tracing enabled?
86
        and     t0, t1, t0
87
        bnez    t0, trace_a_syscall
88
 
89
        jalr    t2                      # Do The Real Thing (TM)
90
 
91
        li      t0, -EMAXERRNO - 1      # error?
92
        sltu    t0, t0, v0
93
        sd      t0, PT_R7(sp)           # set error flag
94
        beqz    t0, 1f
95
 
96
        dnegu   v0                      # error
97
        sd      v0, PT_R0(sp)           # flag for syscall restarting
98
1:      sd      v0, PT_R2(sp)           # result
99
 
100
o32_syscall_exit:
101
        local_irq_disable               # make need_resched and
102
                                        # signals dont change between
103
                                        # sampling and return
104
        LONG_L  a2, TI_FLAGS($28)
105
        li      t0, _TIF_ALLWORK_MASK
106
        and     t0, a2, t0
107
        bnez    t0, o32_syscall_exit_work
108
 
109
        j       restore_partial
110
 
111
o32_syscall_exit_work:
112
        j       syscall_exit_work_partial
113
 
114
/* ------------------------------------------------------------------------ */
115
 
116
trace_a_syscall:
117
        SAVE_STATIC
118
        sd      a4, PT_R8(sp)           # Save argument registers
119
        sd      a5, PT_R9(sp)
120
        sd      a6, PT_R10(sp)
121
        sd      a7, PT_R11(sp)          # For indirect syscalls
122
 
123
        move    s0, t2                  # Save syscall pointer
124
        move    a0, sp
125
        li      a1, 0
126
        jal     do_syscall_trace
127
 
128
        move    t0, s0
129
        RESTORE_STATIC
130
        ld      a0, PT_R4(sp)           # Restore argument registers
131
        ld      a1, PT_R5(sp)
132
        ld      a2, PT_R6(sp)
133
        ld      a3, PT_R7(sp)
134
        ld      a4, PT_R8(sp)
135
        ld      a5, PT_R9(sp)
136
        ld      a6, PT_R10(sp)
137
        ld      a7, PT_R11(sp)          # For indirect syscalls
138
        jalr    t0
139
 
140
        li      t0, -EMAXERRNO - 1      # error?
141
        sltu    t0, t0, v0
142
        sd      t0, PT_R7(sp)           # set error flag
143
        beqz    t0, 1f
144
 
145
        dnegu   v0                      # error
146
        sd      v0, PT_R0(sp)           # set flag for syscall restarting
147
1:      sd      v0, PT_R2(sp)           # result
148
 
149
        j       syscall_exit
150
 
151
/* ------------------------------------------------------------------------ */
152
 
153
        /*
154
         * The stackpointer for a call with more than 4 arguments is bad.
155
         */
156
bad_stack:
157
        dnegu   v0                      # error
158
        sd      v0, PT_R0(sp)
159
        sd      v0, PT_R2(sp)
160
        li      t0, 1                   # set error flag
161
        sd      t0, PT_R7(sp)
162
        j       o32_syscall_exit
163
 
164
not_o32_scall:
165
        /*
166
         * This is not an o32 compatibility syscall, pass it on
167
         * to the 64-bit syscall handlers.
168
         */
169
#ifdef CONFIG_MIPS32_N32
170
        j       handle_sysn32
171
#else
172
        j       handle_sys64
173
#endif
174
        END(handle_sys)
175
 
176
LEAF(sys32_syscall)
177
        sltu    v0, a0, __NR_O32_Linux + __NR_O32_Linux_syscalls + 1
178
        beqz    v0, einval
179
 
180
        dsll    v0, a0, 3
181
        ld      t2, (sys_call_table - (__NR_O32_Linux * 8))(v0)
182
 
183
        li      v1, 4000                # indirect syscall number
184
        beq     a0, v1, einval          # do not recurse
185
 
186
        move    a0, a1                  # shift argument registers
187
        move    a1, a2
188
        move    a2, a3
189
        move    a3, a4
190
        move    a4, a5
191
        move    a5, a6
192
        move    a6, a7
193
        sd      a0, PT_R4(sp)           # ... and push back a0 - a3, some
194
        sd      a1, PT_R5(sp)           # syscalls expect them there
195
        sd      a2, PT_R6(sp)
196
        sd      a3, PT_R7(sp)
197
        sd      a3, PT_R26(sp)          # update a3 for syscall restarting
198
        jr      t2
199
        /* Unreached */
200
 
201
einval: li      v0, -EINVAL
202
        jr      ra
203
        END(sys32_syscall)
204
 
205
        .align  3
206
        .type   sys_call_table,@object
207
sys_call_table:
208
        PTR     sys32_syscall                   /* 4000 */
209
        PTR     sys_exit
210
        PTR     sys_fork
211
        PTR     sys_read
212
        PTR     sys_write
213
        PTR     compat_sys_open                 /* 4005 */
214
        PTR     sys_close
215
        PTR     sys_waitpid
216
        PTR     sys_creat
217
        PTR     sys_link
218
        PTR     sys_unlink                      /* 4010 */
219
        PTR     sys32_execve
220
        PTR     sys_chdir
221
        PTR     compat_sys_time
222
        PTR     sys_mknod
223
        PTR     sys_chmod                       /* 4015 */
224
        PTR     sys_lchown
225
        PTR     sys_ni_syscall
226
        PTR     sys_ni_syscall                  /* was sys_stat */
227
        PTR     sys_lseek
228
        PTR     sys_getpid                      /* 4020 */
229
        PTR     compat_sys_mount
230
        PTR     sys_oldumount
231
        PTR     sys_setuid
232
        PTR     sys_getuid
233
        PTR     compat_sys_stime                /* 4025 */
234
        PTR     sys32_ptrace
235
        PTR     sys_alarm
236
        PTR     sys_ni_syscall                  /* was sys_fstat */
237
        PTR     sys_pause
238
        PTR     compat_sys_utime                /* 4030 */
239
        PTR     sys_ni_syscall
240
        PTR     sys_ni_syscall
241
        PTR     sys_access
242
        PTR     sys_nice
243
        PTR     sys_ni_syscall                  /* 4035 */
244
        PTR     sys_sync
245
        PTR     sys_kill
246
        PTR     sys_rename
247
        PTR     sys_mkdir
248
        PTR     sys_rmdir                       /* 4040 */
249
        PTR     sys_dup
250
        PTR     sys_pipe
251
        PTR     compat_sys_times
252
        PTR     sys_ni_syscall
253
        PTR     sys_brk                         /* 4045 */
254
        PTR     sys_setgid
255
        PTR     sys_getgid
256
        PTR     sys_ni_syscall                  /* was signal   2 */
257
        PTR     sys_geteuid
258
        PTR     sys_getegid                     /* 4050 */
259
        PTR     sys_acct
260
        PTR     sys_umount
261
        PTR     sys_ni_syscall
262
        PTR     compat_sys_ioctl
263
        PTR     compat_sys_fcntl                /* 4055 */
264
        PTR     sys_ni_syscall
265
        PTR     sys_setpgid
266
        PTR     sys_ni_syscall
267
        PTR     sys_olduname
268
        PTR     sys_umask                       /* 4060 */
269
        PTR     sys_chroot
270
        PTR     sys32_ustat
271
        PTR     sys_dup2
272
        PTR     sys_getppid
273
        PTR     sys_getpgrp                     /* 4065 */
274
        PTR     sys_setsid
275
        PTR     sys32_sigaction
276
        PTR     sys_sgetmask
277
        PTR     sys_ssetmask
278
        PTR     sys_setreuid                    /* 4070 */
279
        PTR     sys_setregid
280
        PTR     sys32_sigsuspend
281
        PTR     compat_sys_sigpending
282
        PTR     sys_sethostname
283
        PTR     compat_sys_setrlimit            /* 4075 */
284
        PTR     compat_sys_getrlimit
285
        PTR     compat_sys_getrusage
286
        PTR     sys32_gettimeofday
287
        PTR     sys32_settimeofday
288
        PTR     sys_getgroups                   /* 4080 */
289
        PTR     sys_setgroups
290
        PTR     sys_ni_syscall                  /* old_select */
291
        PTR     sys_symlink
292
        PTR     sys_ni_syscall                  /* was sys_lstat */
293
        PTR     sys_readlink                    /* 4085 */
294
        PTR     sys_uselib
295
        PTR     sys_swapon
296
        PTR     sys_reboot
297
        PTR     compat_sys_old_readdir
298
        PTR     old_mmap                        /* 4090 */
299
        PTR     sys_munmap
300
        PTR     sys_truncate
301
        PTR     sys_ftruncate
302
        PTR     sys_fchmod
303
        PTR     sys_fchown                      /* 4095 */
304
        PTR     sys_getpriority
305
        PTR     sys_setpriority
306
        PTR     sys_ni_syscall
307
        PTR     compat_sys_statfs
308
        PTR     compat_sys_fstatfs              /* 4100 */
309
        PTR     sys_ni_syscall                  /* sys_ioperm */
310
        PTR     compat_sys_socketcall
311
        PTR     sys_syslog
312
        PTR     compat_sys_setitimer
313
        PTR     compat_sys_getitimer            /* 4105 */
314
        PTR     compat_sys_newstat
315
        PTR     compat_sys_newlstat
316
        PTR     compat_sys_newfstat
317
        PTR     sys_uname
318
        PTR     sys_ni_syscall                  /* sys_ioperm  *//* 4110 */
319
        PTR     sys_vhangup
320
        PTR     sys_ni_syscall                  /* was sys_idle  */
321
        PTR     sys_ni_syscall                  /* sys_vm86 */
322
        PTR     compat_sys_wait4
323
        PTR     sys_swapoff                     /* 4115 */
324
        PTR     compat_sys_sysinfo
325
        PTR     sys32_ipc
326
        PTR     sys_fsync
327
        PTR     sys32_sigreturn
328
        PTR     sys32_clone                     /* 4120 */
329
        PTR     sys_setdomainname
330
        PTR     sys32_newuname
331
        PTR     sys_ni_syscall                  /* sys_modify_ldt */
332
        PTR     compat_sys_adjtimex
333
        PTR     sys_mprotect                    /* 4125 */
334
        PTR     compat_sys_sigprocmask
335
        PTR     sys_ni_syscall                  /* was creat_module */
336
        PTR     sys_init_module
337
        PTR     sys_delete_module
338
        PTR     sys_ni_syscall                  /* 4130, get_kernel_syms */
339
        PTR     sys_quotactl
340
        PTR     sys_getpgid
341
        PTR     sys_fchdir
342
        PTR     sys_bdflush
343
        PTR     sys_sysfs                       /* 4135 */
344
        PTR     sys32_personality
345
        PTR     sys_ni_syscall                  /* for afs_syscall */
346
        PTR     sys_setfsuid
347
        PTR     sys_setfsgid
348
        PTR     sys32_llseek                    /* 4140 */
349
        PTR     compat_sys_getdents
350
        PTR     compat_sys_select
351
        PTR     sys_flock
352
        PTR     sys_msync
353
        PTR     compat_sys_readv                /* 4145 */
354
        PTR     compat_sys_writev
355
        PTR     sys_cacheflush
356
        PTR     sys_cachectl
357
        PTR     sys_sysmips
358
        PTR     sys_ni_syscall                  /* 4150 */
359
        PTR     sys_getsid
360
        PTR     sys_fdatasync
361
        PTR     sys32_sysctl
362
        PTR     sys_mlock
363
        PTR     sys_munlock                     /* 4155 */
364
        PTR     sys_mlockall
365
        PTR     sys_munlockall
366
        PTR     sys_sched_setparam
367
        PTR     sys_sched_getparam
368
        PTR     sys_sched_setscheduler          /* 4160 */
369
        PTR     sys_sched_getscheduler
370
        PTR     sys_sched_yield
371
        PTR     sys_sched_get_priority_max
372
        PTR     sys_sched_get_priority_min
373
        PTR     sys32_sched_rr_get_interval     /* 4165 */
374
        PTR     compat_sys_nanosleep
375
        PTR     sys_mremap
376
        PTR     sys_accept
377
        PTR     sys_bind
378
        PTR     sys_connect                     /* 4170 */
379
        PTR     sys_getpeername
380
        PTR     sys_getsockname
381
        PTR     sys_getsockopt
382
        PTR     sys_listen
383
        PTR     sys_recv                        /* 4175 */
384
        PTR     sys_recvfrom
385
        PTR     compat_sys_recvmsg
386
        PTR     sys_send
387
        PTR     compat_sys_sendmsg
388
        PTR     sys_sendto                      /* 4180 */
389
        PTR     compat_sys_setsockopt
390
        PTR     sys_shutdown
391
        PTR     sys_socket
392
        PTR     sys_socketpair
393
        PTR     sys_setresuid                   /* 4185 */
394
        PTR     sys_getresuid
395
        PTR     sys_ni_syscall                  /* was query_module */
396
        PTR     sys_poll
397
        PTR     compat_sys_nfsservctl
398
        PTR     sys_setresgid                   /* 4190 */
399
        PTR     sys_getresgid
400
        PTR     sys_prctl
401
        PTR     sys32_rt_sigreturn
402
        PTR     sys32_rt_sigaction
403
        PTR     sys32_rt_sigprocmask            /* 4195 */
404
        PTR     sys32_rt_sigpending
405
        PTR     compat_sys_rt_sigtimedwait
406
        PTR     sys32_rt_sigqueueinfo
407
        PTR     sys32_rt_sigsuspend
408
        PTR     sys32_pread                     /* 4200 */
409
        PTR     sys32_pwrite
410
        PTR     sys_chown
411
        PTR     sys_getcwd
412
        PTR     sys_capget
413
        PTR     sys_capset                      /* 4205 */
414
        PTR     sys32_sigaltstack
415
        PTR     sys32_sendfile
416
        PTR     sys_ni_syscall
417
        PTR     sys_ni_syscall
418
        PTR     sys32_mmap2                     /* 4210 */
419
        PTR     sys32_truncate64
420
        PTR     sys32_ftruncate64
421
        PTR     sys_newstat
422
        PTR     sys_newlstat
423
        PTR     sys_newfstat                    /* 4215 */
424
        PTR     sys_pivot_root
425
        PTR     sys_mincore
426
        PTR     sys_madvise
427
        PTR     sys_getdents64
428
        PTR     compat_sys_fcntl64              /* 4220 */
429
        PTR     sys_ni_syscall
430
        PTR     sys_gettid
431
        PTR     sys32_readahead
432
        PTR     sys_setxattr
433
        PTR     sys_lsetxattr                   /* 4225 */
434
        PTR     sys_fsetxattr
435
        PTR     sys_getxattr
436
        PTR     sys_lgetxattr
437
        PTR     sys_fgetxattr
438
        PTR     sys_listxattr                   /* 4230 */
439
        PTR     sys_llistxattr
440
        PTR     sys_flistxattr
441
        PTR     sys_removexattr
442
        PTR     sys_lremovexattr
443
        PTR     sys_fremovexattr                /* 4235 */
444
        PTR     sys_tkill
445
        PTR     sys_sendfile64
446
        PTR     compat_sys_futex
447
        PTR     compat_sys_sched_setaffinity
448
        PTR     compat_sys_sched_getaffinity    /* 4240 */
449
        PTR     sys_io_setup
450
        PTR     sys_io_destroy
451
        PTR     sys_io_getevents
452
        PTR     sys_io_submit
453
        PTR     sys_io_cancel                   /* 4245 */
454
        PTR     sys_exit_group
455
        PTR     sys_lookup_dcookie
456
        PTR     sys_epoll_create
457
        PTR     sys_epoll_ctl
458
        PTR     sys_epoll_wait                  /* 4250 */
459
        PTR     sys_remap_file_pages
460
        PTR     sys_set_tid_address
461
        PTR     sys_restart_syscall
462
        PTR     sys32_fadvise64_64
463
        PTR     compat_sys_statfs64             /* 4255 */
464
        PTR     compat_sys_fstatfs64
465
        PTR     compat_sys_timer_create
466
        PTR     compat_sys_timer_settime
467
        PTR     compat_sys_timer_gettime
468
        PTR     sys_timer_getoverrun            /* 4260 */
469
        PTR     sys_timer_delete
470
        PTR     compat_sys_clock_settime
471
        PTR     compat_sys_clock_gettime
472
        PTR     compat_sys_clock_getres
473
        PTR     compat_sys_clock_nanosleep      /* 4265 */
474
        PTR     sys_tgkill
475
        PTR     compat_sys_utimes
476
        PTR     sys_ni_syscall                  /* sys_mbind */
477
        PTR     sys_ni_syscall                  /* sys_get_mempolicy */
478
        PTR     sys_ni_syscall                  /* 4270 sys_set_mempolicy */
479
        PTR     compat_sys_mq_open
480
        PTR     sys_mq_unlink
481
        PTR     compat_sys_mq_timedsend
482
        PTR     compat_sys_mq_timedreceive
483
        PTR     compat_sys_mq_notify            /* 4275 */
484
        PTR     compat_sys_mq_getsetattr
485
        PTR     sys_ni_syscall                  /* sys_vserver */
486
        PTR     sys32_waitid
487
        PTR     sys_ni_syscall                  /* available, was setaltroot */
488
        PTR     sys_add_key                     /* 4280 */
489
        PTR     sys_request_key
490
        PTR     sys_keyctl
491
        PTR     sys_set_thread_area
492
        PTR     sys_inotify_init
493
        PTR     sys_inotify_add_watch           /* 4285 */
494
        PTR     sys_inotify_rm_watch
495
        PTR     sys_migrate_pages
496
        PTR     compat_sys_openat
497
        PTR     sys_mkdirat
498
        PTR     sys_mknodat                     /* 4290 */
499
        PTR     sys_fchownat
500
        PTR     compat_sys_futimesat
501
        PTR     sys_newfstatat
502
        PTR     sys_unlinkat
503
        PTR     sys_renameat                    /* 4295 */
504
        PTR     sys_linkat
505
        PTR     sys_symlinkat
506
        PTR     sys_readlinkat
507
        PTR     sys_fchmodat
508
        PTR     sys_faccessat                   /* 4300 */
509
        PTR     compat_sys_pselect6
510
        PTR     sys_ppoll
511
        PTR     sys_unshare
512
        PTR     sys_splice
513
        PTR     sys32_sync_file_range           /* 4305 */
514
        PTR     sys_tee
515
        PTR     sys_vmsplice
516
        PTR     compat_sys_move_pages
517
        PTR     compat_sys_set_robust_list
518
        PTR     compat_sys_get_robust_list      /* 4310 */
519
        PTR     compat_sys_kexec_load
520
        PTR     sys_getcpu
521
        PTR     compat_sys_epoll_pwait
522
        PTR     sys_ioprio_set
523
        PTR     sys_ioprio_get                  /* 4315 */
524
        PTR     compat_sys_utimensat
525
        PTR     compat_sys_signalfd
526
        PTR     compat_sys_timerfd
527
        PTR     sys_eventfd
528
        PTR     sys32_fallocate                 /* 4320 */
529
        .size   sys_call_table,.-sys_call_table

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.