OSDN Git Service

- fixup asm. No object-code changes
[uclinux-h8/uClibc.git] / libc / sysdeps / linux / microblaze / syscall.c
1 /*
2  * libc/sysdeps/linux/microblaze/syscall.c -- generic syscall function for linux/microblaze
3  *
4  *  Copyright (C) 2003  John Williams <jwilliams@itee.uq.edu.au>
5  *  Copyright (C) 2002  NEC Corporation
6  *  Copyright (C) 2002  Miles Bader <miles@gnu.org>
7  *
8  * This file is subject to the terms and conditions of the GNU Lesser
9  * General Public License.  See the file COPYING.LIB in the main
10  * directory of this archive for more details.
11  * 
12  * Written by Miles Bader <miles@gnu.org>
13  */
14
15 #include <errno.h>
16 #include <sys/syscall.h>
17
18 typedef unsigned long arg_t;
19
20 /* Invoke `system call' NUM, passing it the remaining arguments.
21    This is completely system-dependent, and not often useful.  */
22 long
23 syscall (long num, arg_t a1, arg_t a2, arg_t a3, arg_t a4, arg_t a5, arg_t a6)
24 {
25   /* We don't know how many arguments are valid, so A5 and A6 are fetched
26      off the stack even for (the majority of) system calls with fewer
27      arguments; hopefully this won't cause any problems.  A1-A4 are in
28      registers, so they're OK.  */
29   register arg_t a __asm__ (SYSCALL_ARG0) = a1;
30   register arg_t b __asm__ (SYSCALL_ARG1) = a2;
31   register arg_t c __asm__ (SYSCALL_ARG2) = a3;
32   register arg_t d __asm__ (SYSCALL_ARG3) = a4;
33   register arg_t e __asm__ (SYSCALL_ARG4) = a5;
34   register arg_t f __asm__ (SYSCALL_ARG5) = a6;
35   register unsigned long syscall __asm__ (SYSCALL_NUM) = num;
36   register unsigned long ret __asm__ (SYSCALL_RET);
37         unsigned long ret_sav;
38
39   *((unsigned long *)0xFFFF4004) = (unsigned int)('+');
40   __asm__ ("brlid r17, 08x; nop;" 
41        : "=r" (ret)
42        : "r" (syscall), "r" (a), "r" (b), "r" (c), "r" (d), "r" (e), "r" (f)
43        : SYSCALL_CLOBBERS);
44         
45   ret_sav=ret;
46   *((unsigned long *)0xFFFF4004) = (unsigned int)('-');
47
48
49
50   __syscall_return (long, ret);
51 }