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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [uClibc/] [libc/] [sysdeps/] [linux/] [i386/] [syscall.S] - Rev 1779

Go to most recent revision | Compare with Previous | Blame | View Log

/*
 * June 27, 2001             Manuel Novoa III
 *
 * This is a heavily modified version of gcc's output for the _syscall5 macro.
 * The idea (originally from dietlibc) is that all syscall functions simply set
 * the syscall number as the first argument, then set the syscall arguments as
 * the next up-to-five arguments, and then jump here.  All the common work is
 * done by syscall(), saving a fair amount of generated code when a number of
 * syscalls are used.  The (potential) cost is some unnecessary pushes, pops,
 * and movs but the execution time penalty should be relatively small compared
 * to the cost of the syscall itself.
 *
 * July 24, 2002 
 *
 * Modified by Erik Andersen to take all function parameters from off the stack
 * like a proper function and eliminates the old 255 syscall number limit.  So
 * now we can just call this as a function as syscall() per the function
 * prototype in unistd.h, so to call _exit(42) you can just call.
 *         syscall(__NR_exit, 42);
 * and things will just work.
 */
        
.text
        .align 4
.globl syscall
        .type    syscall,@function
syscall:
        pushl %edi
        pushl %esi
        pushl %ebx
        movl  36(%esp),%edi;    /* Load the 5 syscall argument registers */
        movl  32(%esp),%esi;
        movl  28(%esp),%edx;
        movl  24(%esp),%ecx;
        movl  20(%esp),%ebx;
        movl  16(%esp),%eax     /* Load syscall number into %eax.  */
#APP
        int $0x80
#NO_APP
        cmpl $-4095,%eax
        jbe .Ldone

#ifdef __PIC__
        call Lhere
Lhere:
        popl %ebx
        addl $_GLOBAL_OFFSET_TABLE_+[.-Lhere],%ebx
        negl %eax
        movl %eax,%ecx
#ifdef __UCLIBC_HAS_THREADS__
        call __errno_location@PLT
#else
        movl errno@GOT(%ebx),%eax
#endif /* __UCLIBC_HAS_THREADS__ */
        movl %ecx,(%eax)
#else
        negl %eax
#ifdef __UCLIBC_HAS_THREADS__
        movl %eax,%ecx
        call __errno_location
        movl %ecx,(%eax)
#else
        movl %eax,errno
#endif /* __UCLIBC_HAS_THREADS__ */

#endif /* __PIC__ */

        movl $-1,%eax
        .p2align 4,,7
.Ldone:
        popl %ebx
        popl %esi
        popl %edi
        ret
.Lsize:
        .size    syscall,.Lsize-syscall

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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