+Tue Oct 22 21:38:21 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * version.h: Bump version number to 1.97.
+
+ * features.h: Undo change of Sun Oct 20 22:19:58 1996.
+ Include libc-version.h.
+ * features.h.in: Removed.
+ * Makefile: Change rules to generate libc-version.h instead of
+ features.h.
+
+ * malloc/free.c: Add cast to prevent warning.
+ * malloc/malloc-walk.c: Likewise.
+ * malloc/ralloc.c: Likewise.
+ * malloc/realloc.c: Likewise.
+
+ * grp/fgetgrent_r.c: Accept empty numeric field if name start with +
+ or -.
+ * pwd/fgetpwent_r.c: Likewise.
+ * nss/nss_files/files-grp.c: Don't accept entries with names starting
+ with + or - in lookup functions.
+ * nss/nss_files/files-pwd.c: Likewise.
+
+ * Makerules: Call autolock.sh using $(SHELL).
+
+Mon Oct 21 22:52:16 1996 NIIBE Yutaka <gniibe@mri.co.jp>
+
+ * elf/dl-minimal.c: Don't define `dgettext' replacement but
+ `dcgettext'. When optimizing the macros in <libintl.h> define
+ `dgettext' as a macro and so this function will never be called.
+
+Mon Oct 21 15:41:59 1996 Ulrich Drepper <drepper@cygnus.com>
+
+ * sysdeps/i386/sysdep.h: Define END to use .size when available.
+ (PSEUDO_END): Use END.
+ * sysdeps/unix/sysv/linux/i386/sysdep.h: Define PSEUDO_END to
+ define SYSCALL_ERROR_HANDLER before using END.
+ (SYSCALL_ERROR_HANDLER): Don't use .size directive.
+ * sysdeps/unix/sysv/linux/clone.S: Don't use SYSCALL_ERROR_HANDLER
+ and .size directive but PSEUDO_END.
+ * sysdeps/unix/sysv/linux/mmap.S: Likewise.
+ * sysdeps/unix/sysv/linux/socket.S: Likewise.
+ * sysdeps/unix/sysv/linux/syscall.S: Likewise.
+ * sysdeps/unix/sysv/linux/sysdep.S (__errno_location): Use END.
+ * sysdeps/unix/i386/sysdep.S (__syscall_error): Likewise.
+ * sysdeps/i386/__longjmp.S: Use END instead of PSEUDO_END.
+ * sysdeps/i386/bsd-_setjmp.S: Likewise.
+ * sysdeps/i386/bsd-setjmp.S: Likewise.
+ * sysdeps/i386/memchr.S: Likewise.
+ * sysdeps/i386/memcmp.S: Likewise.
+ * sysdeps/i386/setjmp.S: Likewise.
+ * sysdeps/i386/stpcpy.S: Likewise.
+ * sysdeps/i386/stpncpy.S: Likewise.
+ * sysdeps/i386/strchr.S: Likewise.
+ * sysdeps/i386/strcspn.S: Likewise.
+ * sysdeps/i386/strpbrk.S: Likewise.
+ * sysdeps/i386/strrchr.S: Likewise.
+ * sysdeps/i386/strspn.S: Likewise.
+ * sysdeps/i386/strtok.S: Likewise.
+ * sysdeps/i386/i486/strcat.S: Likewise.
+ * sysdeps/i386/i486/strlen.S: Likewise.
+ * sysdeps/i386/i586/memset.S: Likewise.
+ * sysdeps/i386/i586/strchr.S: Likewise.
+ * sysdeps/i386/i586/strlen.S: Likewise.
+
+ * sysdeps/i386/strlen.c: De-ANSI-fy.
+
+ * sysdeps/generic/_strerror.c: Undo change of Mon Oct 21 01:32:36 1996.
+ Define dgettext if not defined to use dcgettext.
+ * sysdeps/mach/_strerror.c: Likewise.
+
+ * sysdeps/unix/sysv/i386/time.S: Add PSEUDO_END to get
+ __syscall_error defined..
+
+Sat Oct 19 12:27:50 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/unix/sysv/linux/m68k/mmap.S: Fix braino: CALL_MCOUNT is
+ already included in the ENTRY macro. Remove SYSCALL_ERROR_HANDLER
+ now provided by PSEUDO_END.
+ * sysdeps/unix/sysv/linux/m68k/sigreturn.S: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/socket.S: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/syscall.S: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/sysdep.S: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/clone.S: Likewise. Use JUMPTARGET.
+
+ * sysdeps/generic/sysdep.h (END): Provide default empty
+ definition.
+ * sysdeps/unix/sysv/linux/m68k/sysdep.h (END): Redefine to use
+ size directive.
+ (PSEUDO): Don't include SYSCALL_ERROR_HANDLER.
+ (PSEUDO_END): Include it here instead.
+ (SYSCALL_ERROR_HANDLER): Remove type directive.
+ * sysdeps/m68k/bsd-_setjmp.S: Use END, not PSEUDO_END.
+ * sysdeps/m68k/bsd-setjmp.S: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/sigreturn.S: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/sysdep.S: Likewise.
+ (__syscall_error): Can't use ENTRY macro.
+
+Sat Oct 19 12:13:24 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/unix/sysv/linux/syscalls.list (getresuid, setresuid):
+ Set caller to EXTRA.
+
Mon Oct 21 01:32:36 1996 Ulrich Drepper <drepper@cygnus.com>
* elf/rtld.c (dl_main): Move initialization of `_dl_starting_up'
* crypt/md5-crypt.c (md5_crypt_r): Add cast to prevent warning.
+Tue Oct 15 14:37:40 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
+
+ * sysdeps/mach/hurd/fcntlbits.h (O_HURD): Add O_EXLOCK and
+ O_SHLOCK.
+
Tue Oct 15 14:37:40 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
* sysdeps/mach/hurd/fcntlbits.h (O_HURD): Add O_EXLOCK and
$(addprefix install-, no-libc.a bin lib data headers others)
\f
headers := errno.h sys/errno.h errnos.h limits.h values.h \
- features.h gnu-versions.h libc-lock.h
+ features.h gnu-versions.h libc-lock.h libc-version.h
aux = sysdep $(libc-init) version
-before-compile = $(objpfx)version-info.h $(objpfx)features.h
+before-compile = $(objpfx)version-info.h $(objpfx)libc-version.h
echo-headers: subdir_echo-headers
echo "\"Available extensions:"; \
sed -e '/^#/d' -e 's/^[[:space:]]*/ /' $$files; \
echo "\""; \
- fi) > $@-tmp
- mv -f $@-tmp $@
+ fi) > $@T
+ mv -f $@T $@
+generated += version-info.h
version.c-objects := $(addprefix $(objpfx)version,$(object-suffixes))
$(version.c-objects): $(objpfx)version-info.h
\f
-$(objpfx)features.h: features.h.in Makefile $(common-objpfx)soversions.mk
+$(objpfx)libc-version.h: Makefile $(common-objpfx)soversions.mk \
+ $(common-objpfx)version.mk
nr="$(libc.so-version)"; \
+ lnr=`echo $(version) | sed 's/[.].*//'`; \
+ lmnr=`echo $(version) | sed 's/[^.]*[.]//'`; \
if test -n $$nr; then \
- nr=`echo $$nr | sed 's/^[.]//'`; \
- tmpfile=$${TMPDIR:-/tmp}/sedtmp.$$$$; \
- rm -f $$tmpfile; \
- (echo '/^INTERFACENUMBER/ { i\'; \
- echo '/* Interface number of the shared library. */\'; \
- echo "#define __GNU_LIBRARY_INTERFACE__ $$nr"; \
- echo ' s/^INTERFACENUMBER//'; \
- echo '}') > $$tmpfile; \
- sed -f $$tmpfile < $< > $@; \
- rm -f $$tmpfile; \
+ nr=`echo $$nr | sed 's/^[.]\([0-9]*\).*/\1/'`; \
else \
- sed -e '/^INTERFACENUMBER/d' < $< > $@; \
- fi
+ nr="$$lnr"; \
+ fi; \
+ rm -f $@T; \
+ (echo '#ifndef __LIBC_VERSION_H'; \
+ echo '#define __LIBC_VERSION_H 1'; \
+ echo; \
+ if test -n "$(libc.so-version)"; then \
+ echo '/* Show that this is the GNU C Library. The value is the'; \
+ echo ' interface number of the shared library. */'; \
+ else \
+ echo '/* Show that this is the GNU C Library. */'; \
+ fi; \
+ echo "#define __GNU_LIBRARY__ $$nr"; \
+ echo; \
+ echo '/* Version numbers for GNU libc release. */'; \
+ echo "#define __GLIBC__ $$lnr"; \
+ echo "#define __GLIBC_MINOR__ $$lmnr"; \
+ echo; \
+ echo '#endif /* libc-version.h */') > $@T
+ mv -f $@T $@
+generated += libc-version.h
\f
# Makerules creates a file `stub-$(subdir)' for each subdirectory, which
# contains `#define __stub_FUNCTION' for each function which is a stub.
define do-ar
topdir=`cd $(..).; pwd`; \
$(patsubst %/,cd %;,$(objpfx)) \
-$$topdir/autolock.sh ${O%-lib}.lck $(AR) cru$(verbose) ${O%-lib} \
- $(patsubst $(objpfx)%,%,$^)
+$(SHELL) $$topdir/autolock.sh ${O%-lib}.lck $(AR) cru$(verbose) ${O%-lib} \
+ $(patsubst $(objpfx)%,%,$^)
rm -f $@
touch $@
endef
$(common-objpfx)$(patsubst %,$(libtype$o),c)($(ar-symtab-name)): \
$(common-objpfx)$(patsubst %,$(libtype$o),c)(\
$(patsubst $(objpfx)%,%,$(o-objects))) $(subdirs-stamp-o); \
- $$(..)./autolock.sh \
+ $(SHELL) $$(..)./autolock.sh \
$$(common-objpfx)$$(patsubst %,$$(libtype$o),c).lck \
$$(RANLIB) $$(common-objpfx)$$(patsubst %,$$(libtype$o),c)
endef
English-only in the dynamic linker keeps it smaller. */
char * weak_function
-__dgettext (const char *domainname, const char *msgid)
+__dcgettext (const char *domainname, const char *msgid, int category)
{
assert (domainname == _libc_intl_domainname);
return (char *) msgid;
}
-weak_alias (__dgettext, dgettext)
+weak_alias (__dcgettext, dcgettext)
\f
#ifndef NDEBUG
#endif
-/* This macro indicates that the installed library is the GNU C Library.
- Its value must be incremented whenever any existing library interface
- changes such that callers must be recompiled with the new header files.
- This value should always coincide with the major version number used for
- the shared C library corresponding to this set of header files. */
-
-#undef __GNU_LIBRARY__
-#define __GNU_LIBRARY__ 6
+/* Include header with information of libc version numbers. */
+#include <libc-version.h>
#if !defined (__GNUC__) || __GNUC__ < 2
#include <stubs.h>
#endif
-#endif /* __features.h */
+#endif /* features.h */
(,
STRING_FIELD (result->gr_name, ISCOLON, 0);
STRING_FIELD (result->gr_passwd, ISCOLON, 0);
- INT_FIELD (result->gr_gid, ISCOLON, 0, 10,);
+ if (result->gr_name[0] == '+' || result->gr_name[0] == '-')
+ INT_FIELD_MAYBE_NULL (result->gr_gid, ISCOLON, 0, 10, , 0)
+ else
+ INT_FIELD (result->gr_gid, ISCOLON, 0, 10,)
)
DB_LOOKUP (grnam, 1 + strlen (name), (".%s", name),
{
- if (! strcmp (name, result->gr_name))
+ if (name[0] != '-' && name[0] != '+'
+ && ! strcmp (name, result->gr_name))
break;
}, const char *name)
DB_LOOKUP (grgid, 20, ("=%lu", (unsigned long int) gid),
{
- if (result->gr_gid == gid)
+ if (result->gr_gid == gid && result->gr_name[0] != '+'
+ && result->gr_name[0] != '-')
break;
}, gid_t gid)
DB_LOOKUP (pwnam, 1 + strlen (name), (".%s", name),
{
- if (! strcmp (name, result->pw_name))
+ if (name[0] != '+' && name[0] != '-'
+ && ! strcmp (name, result->pw_name))
break;
}, const char *name)
DB_LOOKUP (pwuid, 20, ("=%lu", (unsigned long int) uid),
{
- if (result->pw_uid == uid)
+ if (result->pw_uid == uid && result->pw_name[0] != '+'
+ && result->pw_name[0] != '-')
break;
}, uid_t uid)
(,
STRING_FIELD (result->pw_name, ISCOLON, 0);
STRING_FIELD (result->pw_passwd, ISCOLON, 0);
- INT_FIELD (result->pw_uid, ISCOLON, 0, 10,);
- INT_FIELD (result->pw_gid, ISCOLON, 0, 10,);
+ if (result->pw_name[0] == '+' || result->pw_name[0] == '-')
+ {
+ INT_FIELD_MAYBE_NULL (result->pw_uid, ISCOLON, 0, 10, , 0)
+ INT_FIELD_MAYBE_NULL (result->pw_gid, ISCOLON, 0, 10, , 0)
+ }
+ else
+ {
+ INT_FIELD (result->pw_uid, ISCOLON, 0, 10,)
+ INT_FIELD (result->pw_gid, ISCOLON, 0, 10,)
+ }
STRING_FIELD (result->pw_gecos, ISCOLON, 0);
STRING_FIELD (result->pw_dir, ISCOLON, 0);
result->pw_shell = line;
#define _sys_nerr sys_nerr
#endif
-/* Set if startup process finished. */
-extern int _dl_starting_up;
+/* It is critical here that we always use the `dcgettext' function for
+ the message translation. Since <libintl.h> only defines the macro
+ `dgettext' to use `dcgettext' for optimizing programs this is not
+ always guaranteed. */
+#ifndef dgettext
+# include <locale.h> /* We need LC_MESSAGES. */
+# define dgettext(domainname, msgid) dcgettext (domainname, msgid, LC_MESSAGES)
+#endif
/* Return a string describing the errno code in ERRNUM. */
char *
-_strerror_internal (int errnum,
- char *buf,
- size_t buflen)
+_strerror_internal (int errnum, char *buf, size_t buflen)
{
if (errnum < 0 || errnum >= _sys_nerr)
{
- static const char unk_orig[] = N_("Unknown error ");
- const char *unk = _dl_starting_up ? unk_orig : _(unk_orig);
+ const char *unk = _("Unknown error ");
const size_t unklen = strlen (unk);
char *p = buf + buflen;
*--p = '\0';
return memcpy (p - unklen, unk, unklen);
}
- return (char *) (_dl_starting_up ? _sys_errlist[errnum]
- : _(_sys_errlist[errnum]));
+ return (char *) _(_sys_errlist[errnum]);
}
#endif
#endif
+
+/* Mark the end of function named SYM. This is used on some platforms
+ to generate correct debugging information. */
+#define END(sym)
/* Jump to saved PC. */
movl (JB_PC*4)(%ecx), %ecx
jmp *%ecx
-PSEUDO_END (__longjmp)
+END (__longjmp)
pushl %ecx /* Push back first argument. */
pushl %eax /* Push back return PC. */
jmp JUMPTARGET (C_SYMBOL_NAME (__sigsetjmp))
-PSEUDO_END (_setjmp)
+END (_setjmp)
pushl %ecx /* Push back first argument. */
pushl %eax /* Push back return PC. */
jmp JUMPTARGET (C_SYMBOL_NAME (__sigsetjmp))
-PSEUDO_END (setjmp)
+END (setjmp)
popl %edi /* restore saved register */
ret
-PSEUDO_END (strcat)
+END (strcat)
L2: subl 4(%esp), %eax /* compute difference to string start */
ret
-PSEUDO_END (strlen)
+END (strlen)
popl %edi
ret
-PSEUDO_END (memset)
+END (memset)
popl %edi
ret
-PSEUDO_END (strchr)
+END (strchr)
#undef index
weak_alias (strchr, index)
character */
ret
-PSEUDO_END (strlen)
+END (strlen)
popl %esi
ret
-PSEUDO_END (memchr)
+END (memchr)
movl %edx, %edi
ret
-PSEUDO_END (memcmp)
+END (memcmp)
#undef bcmp
weak_alias (memcmp, bcmp)
#else
jmp __sigjmp_save
#endif
-PSEUDO_END (__sigsetjmp)
+END (__sigsetjmp)
L3: incl %eax
L2:
ret
-PSEUDO_END (__stpcpy)
+END (__stpcpy)
weak_alias (__stpcpy, stpcpy)
L9: popl %esi /* restore saved register content */
ret
-PSEUDO_END (__stpncpy)
+END (__stpncpy)
weak_alias (__stpncpy, stpncpy)
L6: popl %edi /* restore saved register content */
ret
-PSEUDO_END (strchr)
+END (strchr)
weak_alias (strchr, index)
addl $256, %esp /* remove stopset */
ret
-PSEUDO_END (strcspn)
+END (strcspn)
/* strlen -- determine the length of a string.
For Intel 80x86, x>=3.
- Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
+ Copyright (C) 1991, 1992, 1993, 1996 Free Software Foundation, Inc.
Contributed by Torbjorn Granlund (tege@sics.se).
The GNU C Library is free software; you can redistribute it and/or
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
-#include <ansidecl.h>
#include <string.h>
size_t
-DEFUN(strlen, (str), CONST char *str)
+strlen (const char *str)
{
int cnt;
xorl %eax, %eax /* return NULL */
L7: ret
-PSEUDO_END (strpbrk)
+END (strpbrk)
popl %edi
ret
-PSEUDO_END (strrchr)
+END (strrchr)
weak_alias (strrchr, rindex)
addl $256, %esp /* remove stopset */
ret
-PSEUDO_END (strspn)
+END (strspn)
# endif
#endif
ret
-PSEUDO_END (FUNCTION)
+END (FUNCTION)
C_LABEL(name) \
CALL_MCOUNT
+#undef END
+#define END(name) \
+ ASM_SIZE_DIRECTIVE(name)
+
/* If compiled for profiling, call `mcount' at the start of each function. */
#ifdef PROF
/* The mcount code relies on a normal frame pointer being on the stack
#undef PSEUDO_END
#define PSEUDO_END(name) \
- ASM_SIZE_DIRECTIVE(name)
+ END (name)
#ifdef PIC
#define JUMPTARGET(name) name##@PLT
#else
jmp C_SYMBOL_NAME (__sigsetjmp)
#endif
-PSEUDO_END (_setjmp)
+END (_setjmp)
#else
jmp C_SYMBOL_NAME (__sigsetjmp)
#endif
-PSEUDO_END (setjmp)
+END (setjmp)
-/* Copyright (C) 1993, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1996 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
#include <errorlib.h>
#include "../stdio-common/_itoa.h"
+/* It is critical here that we always use the `dcgettext' function for
+ the message translation. Since <libintl.h> only defines the macro
+ `dgettext' to use `dcgettext' for optimizing programs this is not
+ always guaranteed. */
+#ifndef dgettext
+# include <locale.h> /* We need LC_MESSAGES. */
+# define dgettext(domainname, msgid) dcgettext (domainname, msgid, LC_MESSAGES)
+#endif
+
/* Return a string describing the errno code in ERRNUM. */
char *
_strerror_internal (int errnum, char *buf, size_t buflen)
#include <netinet6/in6.h>
#endif /* INET6 */
#include <netdb.h>
-
+#include <arpa/inet.h>
+#include <string.h>
#define GAIH_OKIFUNSPEC 0x0100
#define GAIH_EAI ~(GAIH_OKIFUNSPEC)
struct gaih_typeproto {
int socktype;
int protocol;
- char *name;
+ const char *name;
};
static struct gaih_typeproto gaih_inet_typeproto[] = {
static int gaih_inet(const char *name, const struct gaih_service *service,
const struct addrinfo *req, struct addrinfo **pai)
{
- struct hostent *h = NULL;
struct gaih_typeproto *tp = gaih_inet_typeproto;
struct gaih_servtuple *st = &nullserv;
struct gaih_addrtuple *at = &nulladdr;
int getaddrinfo(const char *name, const char *service,
const struct addrinfo *req, struct addrinfo **pai)
{
- int i, j = 0;
+ int i = 0;
+ int j = 0;
struct addrinfo *p = NULL, **end = &p;
struct gaih *g = gaih, *pg = NULL;
struct gaih_service gaih_service, *pservice;
j++;
if (!((pg && (pg->gaih == g->gaih)))) {
pg = g;
- if (i = g->gaih(name, pservice, req, end)) {
+ if ((i = g->gaih(name, pservice, req, end))) {
if (!req->ai_family && (i & GAIH_OKIFUNSPEC))
continue;
goto gaih_err;
movl $-1, %eax
ret
-#ifdef __ELF__
#undef __syscall_error
-.Lfe2:
- .size __syscall_error, .Lfe2-__syscall_error
-#endif
+END (__syscall_error)
-/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1996 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
je null
movl %eax, (%edx) /* Yes; store the time there. */
null: ret
+PSEUDO_END (time)
jz thread_start
ret
-PSEUDO_END (__clone)
-
- SYSCALL_ERROR_HANDLER
thread_start:
subl %ebp,%ebp /* terminate the stack frame */
pushl %eax
call JUMPTARGET (_exit)
-weak_alias(__clone, clone)
+PSEUDO_END (__clone)
+
+weak_alias (__clone, clone)
#include <sysdep.h>
.text
- SYSCALL_ERROR_HANDLER
ENTRY (__mmap)
/* Successful; return the syscall's value. */
ret
- .size __mmap,.-__mmap
+
+PSEUDO_END (__mmap)
weak_alias (__mmap, mmap)
#define P2(a, b) a##b
.text
- SYSCALL_ERROR_HANDLER
-
/* The socket-oriented system calls are handled unusally in Linux.
They are all gated through the single `socketcall' system call number.
`socketcall' takes two arguments: the first is the subcode, specifying
movl %edx, %ebx
/* %eax is < 0 if there was an error. */
- testl %eax, %eax
- jl syscall_error
+ cmpl $-125, %eax
+ jae syscall_error
/* Successful; return the syscall's value. */
ret
- .size P(__,socket),.-P(__,socket)
+
+PSEUDO_END (P(__,socket))
weak_alias (P(__,socket), socket)
more information about the value -125 used below.*/
.text
- SYSCALL_ERROR_HANDLER /* Define error handler for PIC. */
ENTRY (syscall)
+
PUSHARGS_5 /* Save register contents. */
_DOARGS_5(36) /* Load arguments. */
movl 16(%esp), %eax /* Load syscall number into %eax. */
cmpl $-125, %eax /* Check %eax for error. */
jae syscall_error /* Jump to error handler if error. */
ret /* Return to caller. */
- .size syscall,.-syscall
+
+PSEUDO_END (syscall)
movl $errno, %eax
#endif
ret
- .size __errno_location, .-__errno_location
+END (__errno_location)
of the kernel. But these symbols do not follow the SYS_* syntax
so we have to redefine the `SYS_ify' macro here. */
#undef SYS_ify
-#ifdef __STDC__
-# define SYS_ify(syscall_name) __NR_##syscall_name
-#else
-# define SYS_ify(syscall_name) __NR_/**/syscall_name
-#endif
+#define SYS_ify(syscall_name) __NR_##syscall_name
#ifdef ASSEMBLER
#undef PSEUDO
#define PSEUDO(name, syscall_name, args) \
.text; \
- SYSCALL_ERROR_HANDLER \
ENTRY (name) \
DO_CALL (args, syscall_name); \
cmpl $-125, %eax; \
jae syscall_error;
+#undef PSEUDO_END
+#define PSEUDO_END(name) \
+ SYSCALL_ERROR_HANDLER \
+ END (name)
+
#ifndef PIC
#define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
#else
/* Store (- %eax) into errno through the GOT. */
#ifdef _LIBC_REENTRANT
#define SYSCALL_ERROR_HANDLER \
- .type syscall_error,@function; \
syscall_error: \
pushl %ebx; \
call 0f; \
popl %ebx; \
movl %ecx, (%eax); \
movl $-1, %eax; \
- ret; \
- .size syscall_error,.-syscall-error;
+ ret;
/* A quick note: it is assumed that the call to `__errno_location' does
not modify the stack! */
#else
#define SYSCALL_ERROR_HANDLER \
- .type syscall_error,@function; \
syscall_error: \
call 0f; \
0:popl %ecx; \
movl errno@GOT(%ecx), %ecx; \
movl %edx, (%ecx); \
movl $-1, %eax; \
- ret; \
- .size syscall_error,.-syscall-error;
+ ret;
#endif /* _LIBC_REENTRANT */
#endif /* PIC */
(Of course a function with say 3 arguments does not have entries for
arguments 4 and 5.)
- The following code tries hard to be optimal. A general assuption
+ The following code tries hard to be optimal. A general assumption
(which is true according to the data books I have) is that
2 * xchg is more expensive than pushl + movl + popl
(2 * movl is less expensive than pushl + popl).
Second unlike for the other registers we don't save the content of
- %ecx and %edx when we have than 1 and 2 registers resp.
+ %ecx and %edx when we have more than 1 and 2 registers resp.
The code below might look a bit long but we have to take care for
the pipelined processors (i586 and up). Here the `pushl' and `popl'
.text
ENTRY (__clone)
- CALL_MCOUNT
/* Sanity check arguments. */
movel #-EINVAL, %d0
rts
- SYSCALL_ERROR_HANDLER
-
thread_start:
subl %fp, %fp /* terminate the stack frame */
jsr (%a0)
movel %d0, -(%sp)
-#ifdef PIC
- bsrl _exit@PLTPC
-#else
- jbsr _exit
-#endif
+ jbsr JUMPTARGET (_exit)
+
PSEUDO_END (__clone)
weak_alias (__clone, clone)
#include <sysdep.h>
.text
- SYSCALL_ERROR_HANDLER
-
ENTRY (__mmap)
- CALL_MCOUNT
move.l #SYS_ify (mmap), %d0 /* System call number in %d0. */
.text
ENTRY (__sigreturn)
- CALL_MCOUNT
-
addq.l #4, %sp /* Pop the return PC. */
DO_CALL (#SYS_ify (sigreturn), 0)
/* Do the system call; it never returns. */
/* NOTREACHED */
-PSEUDO_END (__sigreturn)
+END (__sigreturn)
weak_alias (__sigreturn, sigreturn)
#define P2(a, b) a##b
.text
- SYSCALL_ERROR_HANDLER
-
/* The socket-oriented system calls are handled unusally in Linux.
They are all gated through the single `socketcall' system call number.
`socketcall' takes two arguments: the first is the subcode, specifying
.globl P(__,socket)
ENTRY (P(__,socket))
- CALL_MCOUNT
/* Save registers. */
move.l %d2, %a0
more information about the value -128 used below.*/
.text
- SYSCALL_ERROR_HANDLER
ENTRY (syscall)
- CALL_MCOUNT
-
move.l 4(%sp), %d0 /* Load syscall number. */
_DOARGS_5 (24) /* Frob arguments. */
trap &0 /* Do the system call. */
/* The syscall stubs jump here when they detect an error. */
-ENTRY (__syscall_error)
+ .globl __syscall_error
+ .type __syscall_error, @function
+ .align 4
+__syscall_error:
neg.l %d0
move.l %d0, errno
#ifdef _LIBC_REENTRANT
return a pointer. */
move.l %d0, %a0
rts
-PSEUDO_END (__syscall_error)
+END (__syscall_error)
#endif /* PIC */
ENTRY (__errno_location)
- CALL_MCOUNT
#ifdef PIC
move.l (%pc, errno@GOTPC), %a0
#else
lea errno, %a0
#endif
rts
-PSEUDO_END (__errno_location)
+END (__errno_location)
C_LABEL(name) \
CALL_MCOUNT
+#undef END
+#define END(name) .size name, . - name
+
/* If compiled for profiling, call `_mcount' at the start of each function. */
#ifdef PROF
/* The mcount code relies on a normal frame pointer being on the stack
error values. */
#define PSEUDO(name, syscall_name, args) \
.text; \
- SYSCALL_ERROR_HANDLER \
ENTRY (name) \
DO_CALL (&SYS_ify (syscall_name), args); \
moveq.l &-128, %d1; \
jcc syscall_error
#undef PSEUDO_END
-#define PSEUDO_END(name) .size name, . - name
+#define PSEUDO_END(name) \
+ SYSCALL_ERROR_HANDLER; \
+ END (name)
#ifdef PIC
/* Store (- %d0) into errno through the GOT. */
#ifdef _LIBC_REENTRANT
#define SYSCALL_ERROR_HANDLER \
- .type syscall_error, @function; \
syscall_error: \
move.l (errno@GOTPC, %pc), %a0; \
neg.l %d0; \
rts;
#else
#define SYSCALL_ERROR_HANDLER \
- .type syscall_error, @function; \
syscall_error: \
move.l (errno@GOTPC, %pc), %a0; \
neg.l %d0; \
getpgid - getpgid 1 __getpgid getpgid
getpgrp - getpgrp 0 getpgrp
getppid - getppid 0 __getppid getppid
-getresuid - getresuid 3 getresuid
+getresuid EXTRA getresuid 3 getresuid
getsid - getsid 1 getsid
init_module EXTRA init_module 5 init_module
ioperm - ioperm 3 ioperm
s_ptrace ptrace ptrace 4 __syscall_ptrace
s_reboot EXTRA reboot 3 __syscall_reboot
s_sigsuspend sigsuspend sigsuspend 3 __syscall_sigsuspend
-sched_setp - sched_setparam 2 __sched_setparam sched_setparam
+s_sysctl sysctl _sysctl 1 __syscall__sysctl
sched_getp - sched_getparam 2 __sched_getparam sched_getparam
-sched_sets - sched_setscheduler 3 __sched_setscheduler sched_setscheduler
sched_gets - sched_getscheduler 1 __sched_getscheduler sched_getscheduler
-sched_yield - sched_yield 0 __sched_yield sched_yield
sched_primax - sched_get_priority_max 1 __sched_get_priority_max sched_get_priority_max
sched_primin - sched_get_priority_min 1 __sched_get_priority_min sched_get_priority_min
sched_rr_gi - sched_rr_get_interval 2 __sched_rr_get_interval sched_rr_get_interval
+sched_setp - sched_setparam 2 __sched_setparam sched_setparam
+sched_sets - sched_setscheduler 3 __sched_setscheduler sched_setscheduler
+sched_yield - sched_yield 0 __sched_yield sched_yield
select - _newselect 5 __select select
setfsgid EXTRA setfsgid 1 setfsgid
setfsuid EXTRA setfsuid 1 setfsuid
setpgid - setpgid 2 __setpgid setpgid
-setresuid - setresuid 3 setresuid
+setresuid EXTRA setresuid 3 setresuid
sigpending - sigpending 1 sigpending
sigprocmask - sigprocmask 3 __sigprocmask sigprocmask
-s_sysctl sysctl _sysctl 1 __syscall__sysctl
sysinfo EXTRA sysinfo 1 sysinfo
swapon - swapon 2 swapon
umount EXTRA umount 1 __umount umount
/* This file just defines the current version number of libc. */
#define RELEASE "alpha"
-#define VERSION "1.96"
+#define VERSION "1.97"