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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [uClibc/] [libc/] [sysdeps/] [linux/] [microblaze/] [syscall.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1325 phoenix
/*
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
}

powered by: WebSVN 2.1.0

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