diff options
author | Roland McGrath <roland@redhat.com> | 2009-08-23 17:43:21 -0700 |
---|---|---|
committer | Roland McGrath <roland@redhat.com> | 2009-08-24 11:40:15 -0700 |
commit | 036e46b655557f9a17784e502f694a80abfd68dc (patch) | |
tree | 13d443cd242f9e7a26465894b8d0d24442cfd0e1 /sysdeps/unix/syscall-template.S | |
parent | 7b943af6cf2bfd4b94be271877a10128c32d03da (diff) | |
download | glibc-036e46b655557f9a17784e502f694a80abfd68dc.tar.gz glibc-036e46b655557f9a17784e502f694a80abfd68dc.tar.xz glibc-036e46b655557f9a17784e502f694a80abfd68dc.zip |
Add sysdeps/unix/syscall-template.S; build syscall stubs with deps and -g pointing to it.
Diffstat (limited to 'sysdeps/unix/syscall-template.S')
-rw-r--r-- | sysdeps/unix/syscall-template.S | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/sysdeps/unix/syscall-template.S b/sysdeps/unix/syscall-template.S new file mode 100644 index 0000000000..66319f158b --- /dev/null +++ b/sysdeps/unix/syscall-template.S @@ -0,0 +1,88 @@ +/* Assembly code template for system call stubs. + Copyright (C) 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* The real guts of this work are in the macros defined in the + machine- and kernel-specific sysdep.h header file. When we + are defining a cancellable system call, the sysdep-cancel.h + versions of those macros are what we really use. + + Each system call's object is built by a rule in sysd-syscalls + generated by make-syscalls.sh that #include's this file after + defining a few macros: + SYSCALL_NAME syscall name + SYSCALL_NARGS number of arguments this call takes + SYSCALL_SYMBOL primary symbol name + SYSCALL_CANCELLABLE 1 if the call is a cancelation point + SYSCALL_NOERRNO 1 to define a no-errno version (see below) + SYSCALL_ERRVAL 1 to define an error-value version (see below) + + We used to simply pipe the correct three lines below through cpp into + the assembler. The main reason to have this file instead is so that + stub objects can be assembled with -g and get source line information + that leads a user back to a source file and these fine comments. The + average user otherwise has a hard time knowing which "syscall-like" + functions in libc are plain stubs and which have nontrivial C wrappers. + Some versions of the "plain" stub generation macros are more than a few + instructions long and the untrained eye might not distinguish them from + some compiled code that inexplicably lacks source line information. */ + +#if SYSCALL_CANCELLABLE +# include <sysdep-cancel.h> +#else +# include <sysdep.h> +#endif + +#define T_PSEUDO(SYMBOL, NAME, N) PSEUDO (SYMBOL, NAME, N) +#define T_PSEUDO_NOERRNO(SYMBOL, NAME, N) PSEUDO_NOERRNO (SYMBOL, NAME, N) +#define T_PSEUDO_ERRVAL(SYMBOL, NAME, N) PSEUDO_ERRVAL (SYMBOL, NAME, N) +#define T_PSEUDO_END(SYMBOL) PSEUDO_END (SYMBOL) +#define T_PSEUDO_END_NOERRNO(SYMBOL) PSEUDO_END_NOERRNO (SYMBOL) +#define T_PSEUDO_END_ERRVAL(SYMBOL) PSEUDO_END_ERRVAL (SYMBOL) + +#if SYSCALL_NOERRNO + +/* This kind of system call stub never returns an error. + We return the return value register to the caller unexamined. */ + +T_PSEUDO_NOERRNO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS) + ret_NOERRNO +T_PSEUDO_END_NOERRNO (SYSCALL_SYMBOL) + +#elif SYSCALL_ERRVAL + +/* This kind of system call stub returns the errno code as its return + value, or zero for success. We may massage the kernel's return value + to meet that ABI, but we never set errno here. */ + +T_PSEUDO_ERRVAL (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS) + ret_ERRVAL +T_PSEUDO_END_ERRVAL (SYSCALL_SYMBOL) + +#else + +/* This is a "normal" system call stub: if there is an error, + it returns -1 and sets errno. */ + +T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS) + ret +T_PSEUDO_END (SYSCALL_SYMBOL) + +#endif + +libc_hidden_def (SYSCALL_SYMBOL) |