summary refs log tree commit diff
path: root/sysdeps/unix
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-06-19 06:54:12 +0000
committerRoland McGrath <roland@gnu.org>1996-06-19 06:54:12 +0000
commita1470b6f839addde3f8ee2c29a237aca21e62565 (patch)
treee57a088836e66c6784c7e48cbe01d61621d37f34 /sysdeps/unix
parent6990326c21e6d767e3531a00782af1e091eab4fe (diff)
downloadglibc-a1470b6f839addde3f8ee2c29a237aca21e62565.tar.gz
glibc-a1470b6f839addde3f8ee2c29a237aca21e62565.tar.xz
glibc-a1470b6f839addde3f8ee2c29a237aca21e62565.zip
Thu Jun 13 17:25:11 1996 David Mosberger-Tang <davidm@azstarnet.com> cvs/libc-960619
	* sysdeps/generic/memcmp.c: Add prototype decls for internal fns.

	* locale/programs/locale.c: Include string.h.

	* sunrpc/xdr_stdio.c (xdrstdio_getlong), sunrpc/xdr_rec.c
 	(xdrrec_getlong), sunrpc/xdr_mem.c (xdrmem_getlong): Make sure
 	appropriate sign-extension is performed on machines with
 	sizeof(long) > 4.

	* sunrpc/xdr.c (xdr_int, xdr_u_int): If sizeof(long)==8 and
 	sizeof(int)<sizeof(long), we need to go through a temporary
 	variable.

	* locale/programs/ld-numeric.c: Include <alloca.h>

	* libio/stdio.h (__libc_fatal): Add prototype.

	* libio/cleanup.c: Use __P() to declare prototype when __STDC__ is
 	in efect.

	* libio/iopopen.c (read_or_write, parent_end, child_end): Declare
 	volatile to avoid "might get clobbered by longjmp" warning.

	* features.h (__KERNEL_STRICT_NAMES): Define __KERNEL_STRICT_NAMES
 	unless _LOOSE_KERNEL_NAMES is in effect (which, with high
 	probability is a sure loser).
	* sysdeps/unix/sysv/linux/gnu/types.h (__KERNEL_STRICT_NAMES): Remove.

	* sysdeps/unix/bsd/osf/alpha/start.S (errno): Removed.
	* sysdeps/unix/sysv/linux/alpha/start.S: Ditto.

	* misc/paths.h (_PATH_MAN): Change from /usr/share/man to /usr/man
	to be Linux FSSTND compliant.

Mon Jun 10 17:50:31 1996  David Mosberger-Tang  <davidm@azstarnet.com>

	* sysdeps/unix/sysv/linux/alpha/pipe.S: Use PSEUDO.

	* sysdeps/unix/sysv/linux/alpha/sysdep.S,
 	sysdeps/unix/sysv/linux/alpha/brk.S,
 	sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S,
 	sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S,
 	sysdeps/unix/sysv/linux/alpha/llseek.S,
 	sysdeps/unix/sysv/linux/alpha/sigsuspend.S,
 	sysdeps/unix/sysv/linux/alpha/syscall.S: Rename syscall_error to
 	__syscall_error to avoid intruding application name space.

	* sysdeps/unix/sysv/linux/alpha/sysdep.h: Rename __NR_get?id
	to SYS_get?id so that syscall stubs in sysdeps/unix define
	these syscalls in terms of getxpid/getxuid/getxgid.

	* sysdeps/unix/_exit.S, sysdeps/unix/getegid.S,
 	sysdeps/unix/geteuid.S, sysdeps/unix/getppid.S,
 	sysdeps/unix/execve.S, sysdeps/unix/fork.S,
 	sysdeps/unix/syscall.S: Terminate syscall with PSEUDO_END.

	* sysdeps/unix/make-syscalls.sh, sysdeps/unix/sysdep.h
 	(PSEUDO_END): Rename END() to PSEUDO_END().

	* sysdeps/unix/alpha/sysdep.h: Move error-handling code in PSEUDO
 	to PSEUDO_END to improve branch-prediction.  Include .frame
 	directive to make syscalls debugabble.
	(PSEUDO_END): New macro.

	* sysdeps/unix/alpha/sysdep.h, sysdeps/alpha/bb_init_func.S,
 	sysdeps/unix/sysv/linux/alpha/brk.S: Use ldiq instead of ldi since
 	latter is illegal under DEC Unix.

	* sysdeps/unix/alpha/sysdep.S: Renamed from
	sysdeps/unix/sysv/linux/alpha/sysdep.S.  This file works for OSF/1
 	as well.
	* sysdeps/unix/bsd/osf/alpha/sysdep.S: Remove (note that the
 	EWOULDBLOCK -> EAGAIN mapping was unnecessary since
 	EWOULDBLOCK==EAGAIN under DEC Unix and Linux/Alpha).

	* sysdeps/alpha/divrem.h: Use retaddr instead of ra as the return
 	address register in the .frame directive.

	* sysdeps/alpha/copysign.c: Remove.

	* sunrpc/rpc/types.h: Include <sys/param.h> and <netinet/in.h> to
 	avoid RPC definitions of INADDR_LOOPBACK and/or MAXHOSTNAMELEN.

	* errno.h: Move __END_DECLS to correct place to make file
 	compilable under c++.

	* dirent/dirent.h: Document _DIRENT_HAVE_D_OFF macro.  Define
	d_ino only if <direntry.h> hasn't defined d_fileno.

	* configure.in (HAVE_ASM_WEAKEXT_DIRECTIVE): Reverse order of
	arguments to weakext to make .weakext detection work on ECOFF systems.

	* FAQ: Add Linux/Alpha to list of supported platforms.  Mention
	that _validuser() has been replaced by __ivaliduser().

Thu Jun  6 21:39:38 1996  David Mosberger-Tang  <davidm@azstarnet.com>

	* sysdeps/unix/bsd/sun/sunos4/tcsetattr.c (tcsetattr): Declare cmd
 	as unsigned long, not as int (to avoid incorrect int->long
 	promotion).
Diffstat (limited to 'sysdeps/unix')
-rw-r--r--sysdeps/unix/_exit.S1
-rw-r--r--sysdeps/unix/alpha/sysdep.S (renamed from sysdeps/unix/sysv/linux/alpha/sysdep.S)9
-rw-r--r--sysdeps/unix/alpha/sysdep.h50
-rw-r--r--sysdeps/unix/bsd/osf/alpha/start.S2
-rw-r--r--sysdeps/unix/bsd/osf/alpha/sysdep.S40
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/tcsetattr.c2
-rw-r--r--sysdeps/unix/execve.S1
-rw-r--r--sysdeps/unix/fork.S1
-rw-r--r--sysdeps/unix/getegid.S1
-rw-r--r--sysdeps/unix/geteuid.S1
-rw-r--r--sysdeps/unix/getppid.S1
-rw-r--r--sysdeps/unix/make-syscalls.sh2
-rw-r--r--sysdeps/unix/syscall.S1
-rw-r--r--sysdeps/unix/sysdep.h6
-rw-r--r--sysdeps/unix/sysv/linux/alpha/brk.S4
-rw-r--r--sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S4
-rw-r--r--sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S4
-rw-r--r--sysdeps/unix/sysv/linux/alpha/llseek.S10
-rw-r--r--sysdeps/unix/sysv/linux/alpha/pipe.S16
-rw-r--r--sysdeps/unix/sysv/linux/alpha/sigsuspend.S4
-rw-r--r--sysdeps/unix/sysv/linux/alpha/start.S95
-rw-r--r--sysdeps/unix/sysv/linux/alpha/syscall.S18
-rw-r--r--sysdeps/unix/sysv/linux/alpha/sysdep.h12
-rw-r--r--sysdeps/unix/sysv/linux/gnu/types.h7
24 files changed, 129 insertions, 163 deletions
diff --git a/sysdeps/unix/_exit.S b/sysdeps/unix/_exit.S
index a171689473..50eb687d68 100644
--- a/sysdeps/unix/_exit.S
+++ b/sysdeps/unix/_exit.S
@@ -20,3 +20,4 @@ Cambridge, MA 02139, USA.  */
 
 PSEUDO (_exit, exit, 1)
 	/* Shouldn't get here.  */
+PSEUDO_END(_exit)
diff --git a/sysdeps/unix/sysv/linux/alpha/sysdep.S b/sysdeps/unix/alpha/sysdep.S
index 84582f404e..3e7666ff61 100644
--- a/sysdeps/unix/sysv/linux/alpha/sysdep.S
+++ b/sysdeps/unix/alpha/sysdep.S
@@ -20,7 +20,12 @@ Cambridge, MA 02139, USA.  */
 #define _ERRNO_H
 #include <errnos.h>
 
-LEAF(syscall_error, 0)
+       .comm errno, 4
+#ifdef __ELF__
+       .type errno, @object
+#endif
+
+LEAF(__syscall_error, 0)
 	.prologue 1
 
 	/* Store return value in errno... */
@@ -31,4 +36,4 @@ LEAF(syscall_error, 0)
 	ldi	v0, -1
 	ret
 
-	.end syscall_error
+	END(__syscall_error)
diff --git a/sysdeps/unix/alpha/sysdep.h b/sysdeps/unix/alpha/sysdep.h
index 6fed4a6adf..4b3f9aa5d8 100644
--- a/sysdeps/unix/alpha/sysdep.h
+++ b/sysdeps/unix/alpha/sysdep.h
@@ -58,25 +58,27 @@ Cambridge, MA 02139, USA.  */
   .frame sp, 0, ra
 #endif
 
-/* Note that while it's better structurally, going back to set errno
-   can make things confusing if you're debugging---it looks like it's jumping
-   backwards into the previous fn.  */
+/* Mark the end of function SYM.  */
+#undef END
+#define END(sym)	.end sym
+
+/* Note that PSEUDO/PSEUDO_END use label number 1996---do not use a
+   label of that number between those two macros!  */
+ 
 #ifdef __STDC__
 #define PSEUDO(name, syscall_name, args)	\
     .globl name;				\
     .align 3;					\
     .ent name,0;				\
 						\
-1:  br		gp, 2f;				\
-2:  ldgp	gp, 0(gp);			\
-    jmp		zero, syscall_error;		\
-						\
 name##:						\
-    ldi		v0, SYS_ify(syscall_name);	\
+    .frame sp, 0, ra				\
+    .prologue 1; /* yes, we do use gp */	\
+    ldiq	v0, SYS_ify(syscall_name);	\
     .set noat;					\
     call_pal	PAL_callsys;			\
     .set at;					\
-    bne		a3, 1b;				\
+    bne		a3, 1996f;			\
 3:
 #else
 #define PSEUDO(name, syscall_name, args)	\
@@ -84,21 +86,35 @@ name##:						\
     .align 3;					\
     .ent name,0;				\
 						\
-1:  br		gp, 2f;				\
-2:  ldgp	gp, 0(gp);			\
-    jmp		zero, syscall_error;		\
-						\
 name/**/:					\
-    ldi		v0, SYS_ify(syscall_name);	\
+    .frame sp, 0, ra				\
+    .prologue 1; /* yes, we do use gp */	\
+    ldiq	v0, SYS_ify(syscall_name);	\
     .set noat;					\
     call_pal	PAL_callsys;			\
     .set at;					\
-    bne		a3, 1b;				\
+    bne		a3, 1996f;			\
 3:
 #endif
 
-#undef END
-#define END(sym)	.end sym
+#undef PSEUDO_END
+
+#ifdef PIC
+/* When building a shared library, we can use a branch since the text
+   section of the library is much smaller than 4MB.  If we ever break
+   this assumption, the linker will tell us.  */
+# define PSEUDO_END(sym)			\
+1996:						\
+    br		zero, __syscall_error;		\
+    END(sym)
+#else
+# define PSEUDO_END(sym)			\
+1996:						\
+    br		gp, 2f;				\
+2:  ldgp	gp, 0(gp);			\
+    jmp		zero, __syscall_error;		\
+    END(sym)
+#endif
 
 #define r0	v0
 #define r1	a4
diff --git a/sysdeps/unix/bsd/osf/alpha/start.S b/sysdeps/unix/bsd/osf/alpha/start.S
index f3995a2fd6..d5ff14055b 100644
--- a/sysdeps/unix/bsd/osf/alpha/start.S
+++ b/sysdeps/unix/bsd/osf/alpha/start.S
@@ -18,8 +18,6 @@ Cambridge, MA 02139, USA.  */
 
 #include <sysdep.h>
 
-.comm errno,		4
-
 #if 0
 .sdata
 .globl STARTFRM
diff --git a/sysdeps/unix/bsd/osf/alpha/sysdep.S b/sysdeps/unix/bsd/osf/alpha/sysdep.S
deleted file mode 100644
index bc4865cef2..0000000000
--- a/sysdeps/unix/bsd/osf/alpha/sysdep.S
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Copyright (C) 1993 Free Software Foundation, Inc.
-   Contributed by Brendan Kehoe (brendan@zen.org).
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
-
-#include <sysdep.h>
-#define _ERRNO_H
-#include <errnos.h>
-
-ENTRY(syscall_error)
-#ifdef EWOULDBLOCK_sys
-	/* We translate the system's EWOULDBLOCK error into EAGAIN.
-	   The GNU C library always defines EWOULDBLOCK==EAGAIN.
-	   EWOULDBLOCK_sys is the original number.  */
-	subq v0, EWOULDBLOCK_sys, t0
-	cmoveq t0, EAGAIN, v0
-#endif
-
-	/* Store it in errno... */
-!	ldgp gp, 0(t12)
-	stl v0, errno
-
-	/* And just kick back a -1.  */
-	ldil v0, -1
-	ret
-
-	.end syscall_error
diff --git a/sysdeps/unix/bsd/sun/sunos4/tcsetattr.c b/sysdeps/unix/bsd/sun/sunos4/tcsetattr.c
index 4ae139a1f8..f88951ff9d 100644
--- a/sysdeps/unix/bsd/sun/sunos4/tcsetattr.c
+++ b/sysdeps/unix/bsd/sun/sunos4/tcsetattr.c
@@ -27,7 +27,7 @@ int
 DEFUN(tcsetattr, (fd, optional_actions, termios_p),
       int fd AND int optional_actions AND CONST struct termios *termios_p)
 {
-  int cmd;
+  unsigned long cmd;
 
   switch (optional_actions)
     {
diff --git a/sysdeps/unix/execve.S b/sysdeps/unix/execve.S
index 7a4fc139ec..5d48bc63d8 100644
--- a/sysdeps/unix/execve.S
+++ b/sysdeps/unix/execve.S
@@ -28,5 +28,6 @@ Cambridge, MA 02139, USA.  */
 
 SYSCALL__ (execve, 3)
 	ret
+PSEUDO_END(execve)
 
 weak_alias (__execve, execve)
diff --git a/sysdeps/unix/fork.S b/sysdeps/unix/fork.S
index 1c360c6ed2..b8b99720b1 100644
--- a/sysdeps/unix/fork.S
+++ b/sysdeps/unix/fork.S
@@ -28,5 +28,6 @@ SYSCALL__ (fork, 0)
 	subl #1, r1
 	andl r1, r0
 	ret
+PSEUDO_END(fork)
 
 weak_alias (__fork, fork)
diff --git a/sysdeps/unix/getegid.S b/sysdeps/unix/getegid.S
index 1bd447b623..aff66bb555 100644
--- a/sysdeps/unix/getegid.S
+++ b/sysdeps/unix/getegid.S
@@ -25,5 +25,6 @@ PSEUDO (__getegid, getgid, 0)
 	MOVE(r1, r0)
 #endif
 	ret
+PSEUDO_END(__getegid)
 
 weak_alias (__getegid, getegid)
diff --git a/sysdeps/unix/geteuid.S b/sysdeps/unix/geteuid.S
index 339eb536f5..db4087f831 100644
--- a/sysdeps/unix/geteuid.S
+++ b/sysdeps/unix/geteuid.S
@@ -25,5 +25,6 @@ PSEUDO (__geteuid, getuid, 0)
 	MOVE(r1, r0)
 #endif
 	ret
+PSEUDO_END(__geteuid)
 
 weak_alias (__geteuid, geteuid)
diff --git a/sysdeps/unix/getppid.S b/sysdeps/unix/getppid.S
index 132c3740a0..3f0c7456b5 100644
--- a/sysdeps/unix/getppid.S
+++ b/sysdeps/unix/getppid.S
@@ -25,5 +25,6 @@ PSEUDO (__getppid, getpid, 0)
 	MOVE(r1, r0)
 #endif
 	ret
+PSEUDO_END(__getppid)
 
 weak_alias (__getppid, getppid)
diff --git a/sysdeps/unix/make-syscalls.sh b/sysdeps/unix/make-syscalls.sh
index 5251e84cb9..260769ed7b 100644
--- a/sysdeps/unix/make-syscalls.sh
+++ b/sysdeps/unix/make-syscalls.sh
@@ -62,7 +62,7 @@ EOF
 	(echo '#include <sysdep.h>'; \\
 	 echo 'PSEUDO ($strong, $syscall, $nargs)'; \\
 	 echo '	ret'; \\
-	 echo 'END($strong)'; \\"
+	 echo 'PSEUDO_END($strong)'; \\"
 
   # Append any weak aliases defined for this syscall function.
   for name in $weak; do
diff --git a/sysdeps/unix/syscall.S b/sysdeps/unix/syscall.S
index e3ef1775dc..d3f13dcc4f 100644
--- a/sysdeps/unix/syscall.S
+++ b/sysdeps/unix/syscall.S
@@ -27,3 +27,4 @@ Cambridge, MA 02139, USA.  */
 
 SYSCALL (syscall, 1)
 	ret
+PSEUDO_END(syscall)
diff --git a/sysdeps/unix/sysdep.h b/sysdeps/unix/sysdep.h
index 0dde0b04a6..24be0063e0 100644
--- a/sysdeps/unix/sysdep.h
+++ b/sysdeps/unix/sysdep.h
@@ -55,6 +55,6 @@ Cambridge, MA 02139, USA.  */
 #define SYS_ify(syscall_name) SYS_/**/syscall_name
 #endif
 
-/* Terminate a function named SYM.  This is used on some platforms to
-   generate correct debugging information.  */
-#define END(sym)
+/* Terminate a system call named SYM.  This is used on some platforms
+   to generate correct debugging information.  */
+#define PSEUDO_END(sym)
diff --git a/sysdeps/unix/sysv/linux/alpha/brk.S b/sysdeps/unix/sysv/linux/alpha/brk.S
index 1c4a4f9217..26bf97f2bd 100644
--- a/sysdeps/unix/sysv/linux/alpha/brk.S
+++ b/sysdeps/unix/sysv/linux/alpha/brk.S
@@ -30,7 +30,7 @@ LEAF(__brk, 0)
 	ldgp	gp, 0(t12)
 	.prologue 1
 
-	ldi	v0, __NR_brk
+	ldiq	v0, __NR_brk
 	call_pal PAL_callsys
 
 	/* Correctly handle the brk(0) query case.  */
@@ -46,7 +46,7 @@ LEAF(__brk, 0)
 
 	/* What a horrible way to die.  */
 error:	ldi	v0, ENOMEM
-	jmp	zero, syscall_error
+	jmp	zero, __syscall_error
 
 	END(__brk)
 
diff --git a/sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S b/sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S
index 52c945aec2..e09fa738e2 100644
--- a/sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S
+++ b/sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S
@@ -24,7 +24,7 @@ Cambridge, MA 02139, USA.  */
 
 LEAF(__ieee_get_fp_control, 8)
 	lda	sp, -8(sp)
-	.prologue 0
+	.prologue 1
 
 	mov	sp, a1
 	ldi	a0, GSI_IEEE_FP_CONTROL
@@ -39,7 +39,7 @@ LEAF(__ieee_get_fp_control, 8)
 error:	lda	sp, 8(sp)
 	br	gp, 1f
 1:	ldgp	gp, 0(gp)
-	jmp	zero, syscall_error
+	jmp	zero, __syscall_error
 
 	END(__ieee_get_fp_control)
 
diff --git a/sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S b/sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S
index d72585daf1..d748c81142 100644
--- a/sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S
+++ b/sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S
@@ -22,7 +22,7 @@ Cambridge, MA 02139, USA.  */
 
 LEAF(__ieee_set_fp_control, 8)
 	lda	sp, -8(sp)
-	.prologue 0
+	.prologue 1
 
 	stq	a0, 0(sp)
 	mov	sp, a1
@@ -37,7 +37,7 @@ LEAF(__ieee_set_fp_control, 8)
 
 error:	br	gp, 1f
 1:	ldgp	gp, 0(gp)
-	jmp	zero, syscall_error
+	jmp	zero, __syscall_error
 
 	END(__ieee_set_fp_control)
 
diff --git a/sysdeps/unix/sysv/linux/alpha/llseek.S b/sysdeps/unix/sysv/linux/alpha/llseek.S
index bd8c6595c9..6020f263cd 100644
--- a/sysdeps/unix/sysv/linux/alpha/llseek.S
+++ b/sysdeps/unix/sysv/linux/alpha/llseek.S
@@ -18,19 +18,17 @@ Cambridge, MA 02139, USA.  */
 
 /* For compatibility only: a "long" is 64 bits on the Alpha, so
    llseek() isn't really needed.  But there are some programs out
-   there who may depend on it being around. 
-*/
+   there who may depend on it being around.  */
 
 #include <sysdep.h>
 
 	.text
 ENTRY(llseek)
-	.prologue 0
-
-	mov	a3, t0		/* save result address */
+	.prologue 1
 
 	sll	a1, 32, a1	/* build a 64 bit ofs out of 32 bit operands */
 	zap	a2, 0xf0, a2
+	mov	a3, t0		/* save result address */
 	bis	a2, a1, a1
 
 	mov	a4, a2		/* shift down whence */
@@ -44,6 +42,6 @@ ENTRY(llseek)
 
 error:	br	gp, 1f
 1:	ldgp	gp, 0(gp)
-	jmp	zero, syscall_error
+	jmp	zero, __syscall_error
 
 	END(llseek)
diff --git a/sysdeps/unix/sysv/linux/alpha/pipe.S b/sysdeps/unix/sysv/linux/alpha/pipe.S
index b23803cecd..60334adb45 100644
--- a/sysdeps/unix/sysv/linux/alpha/pipe.S
+++ b/sysdeps/unix/sysv/linux/alpha/pipe.S
@@ -20,23 +20,11 @@ Cambridge, MA 02139, USA.  */
 
 #include <sysdep.h>
 
-	.text
-LEAF(__pipe, 0)
-	.prologue 0
-
-	ldi	v0, __NR_pipe
-	call_pal PAL_callsys
-	bne	a3, error
-
+PSEUDO (__pipe, pipe, 0)
 	stl	r0, 0(a0)
 	stl	r1, 4(a0)
 	mov	zero, v0
 	ret
-
-error:	br	gp, 1f
-1:	ldgp	gp, 0(gp)
-	jmp	zero, syscall_error
-
-	END(__pipe)
+PSEUDO_END(__pipe)
 
 weak_alias (__pipe, pipe)
diff --git a/sysdeps/unix/sysv/linux/alpha/sigsuspend.S b/sysdeps/unix/sysv/linux/alpha/sigsuspend.S
index 26a1869783..aaae9a308a 100644
--- a/sysdeps/unix/sysv/linux/alpha/sigsuspend.S
+++ b/sysdeps/unix/sysv/linux/alpha/sigsuspend.S
@@ -24,7 +24,7 @@ Cambridge, MA 02139, USA.  */
 	.text
 
 LEAF(sigsuspend, 0)
-	.prologue 0
+	.prologue 1
 
 	ldq	a0, 0(a0)
 	ldi	v0, __NR_sigsuspend
@@ -34,6 +34,6 @@ LEAF(sigsuspend, 0)
 
 error:	br	gp, 1f
 1:	ldgp	gp, 0(gp)
-	jmp	zero, syscall_error
+	jmp	zero, __syscall_error
 
 	END(sigsuspend)
diff --git a/sysdeps/unix/sysv/linux/alpha/start.S b/sysdeps/unix/sysv/linux/alpha/start.S
index a7099f6840..bffa913538 100644
--- a/sysdeps/unix/sysv/linux/alpha/start.S
+++ b/sysdeps/unix/sysv/linux/alpha/start.S
@@ -1,5 +1,5 @@
 /* Copyright (C) 1993, 1995, 1996 Free Software Foundation, Inc.
-   Contributed by Brendan Kehoe (brendan@zen.org).
+   Contributed by Richard Henderson <rth@tamu.edu>
 
 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Library General Public License as
@@ -18,81 +18,76 @@ Cambridge, MA 02139, USA.  */
 
 #include <sysdep.h>
 
-	.comm errno, 4
-#ifdef __ELF__
-	.type errno, @object
-#endif
-
 	.text
-LEAF(__start, 16)
-	lda	sp, -16(sp)
-	.prologue 0
-
-	stq	zero, 8(sp)		/* terminate frame chain */
-
-	br	t0, 1f
-1:	ldgp	gp, 0(t0)
-
-	mov	zero, a0		/* establish __fpu_control w/kernel */
-	jsr	ra, __setfpucw
+	.globl __start
+	.align 3
+	.ent __start, 0
+__start:
+	.frame fp, 0, zero
+	mov	zero, fp
+	br	gp, 1f
+1:	ldgp	gp, 0(gp)
+	.prologue 1
+
+  /* Save v0.  When starting a binary via the dynamic linker, s0
+     contains the address of the shared library termination function,
+     which we will register below with atexit() to be called by exit().
+     If we are statically linked, this will be NULL.  */
+	mov	v0, s0
+
+  /* Do essential libc initialization (sp points to argc, argv, and envp)  */
+	jsr	ra, __libc_init_first
 	ldgp	gp, 0(ra)
 
-	/* clear out errno. */
-	stl	zero, (errno)
+  /* Now that we have the proper stack frame, register library termination
+     function, if there is any:  */
 
-	ldl	a0, 16(sp)	/* get argc */
-	lda	a1, 24(sp)	/* get argv */
+	beq	s0, 1f
+	mov	s0, a0
+	jsr	ra, atexit
+	ldgp	gp, 0(ra)
+1:
 
-	/* initialize environ: */
-	lda	t0, environ
-	s8addq	a0, a1, a2
-	addq	a2, 0x8, a2
-	stq	a2, 0(t0)
+  /* Extract the arguments and environment as encoded on the stack.  */
+	ldl	a0, 0(sp)	/* get argc */
+	lda	a1, 8(sp)	/* get argv */
+	s8addq	a0, a1, a2	/* get envp */
+	addq	a2, 8, a2
+	stq	a2, _environ
 
-	mov	a0, s0
+	mov	a0, s0		/* tuck them away */
 	mov	a1, s1
 	mov	a2, s2
 
 #ifdef HAVE_INITFINI
-	/* register the _fini sections to ensure destructors get run: */
-	lda	a0, _fini
-	jsr	ra, atexit
-	ldgp	gp, 0(ra)
-
-	/* Now run the _init section of the program itself.  The _init
-	   sections of shared libraries will be run by the dynamic linker.  */
+  /* Call _init, the entry point to our own .init section.  */
 	jsr	ra, _init
 	ldgp	gp, 0(ra)
 
-	/* initialize constructors: */
-	jsr	ra, __main
+  /* Register our .fini section with atexit.  */
+	lda	a0, _fini
+	jsr	ra, atexit
 	ldgp	gp, 0(ra)
 #else
-	jsr	ra, __libc_init
+  /* initialize constructors: */
+	jsr	ra, __main
 	ldgp	gp, 0(ra)
 #endif
-
 	mov	s0, a0
 	mov	s1, a1
 	mov	s2, a2
 
+  /* Call the user's main and exit with its return value.  */
 	jsr	ra, main
 	ldgp	gp, 0(ra)
 
 	mov	v0, a0
+	jsr	ra, exit
 
-	lda	pv, exit
-	jsr	ra, (pv), 1
-	ldgp	gp, 0(ra)
-
-	/* in case exit returns: */
-
-1:	ldi	v0, __NR_exit
-	call_pal PAL_callsys
-	br	1b
-
-	.end __start
-
+  /* Die very horribly if exit returns.  Call_pal hlt is callable from
+     kernel mode only; this will result in an illegal instruction trap.  */
+	call_pal 0
+END(__start)
 
 /* Define a symbol for the first piece of initialized data.  */
 	.data
diff --git a/sysdeps/unix/sysv/linux/alpha/syscall.S b/sysdeps/unix/sysv/linux/alpha/syscall.S
index c80a523239..f1b36e9312 100644
--- a/sysdeps/unix/sysv/linux/alpha/syscall.S
+++ b/sysdeps/unix/sysv/linux/alpha/syscall.S
@@ -42,19 +42,19 @@ Cambridge, MA 02139, USA.  */
 
 
 LEAF(__syscall, 0)
-	bis	a0, a0, v0	# Syscall number -> v0
-	bis	a1, a1, a0	# arg1-arg5 -> a0-a4
-	bis	a2, a2, a1
-	bis	a3, a3, a2
-	bis	a4, a4, a3
-	bis	a5, a5, a4
-
-	call_pal PAL_callsys	# Invoke system call
+	mov	a0, v0		/* Syscall number -> v0 */
+	mov	a1, a0		/* arg1-arg5 -> a0-a4 */
+	mov	a2, a1
+	mov	a3, a2
+	mov	a4, a3
+	mov	a5, a4
+
+	call_pal PAL_callsys	/* Invoke system call */
 	bne	a3, error
 	ret
 
 error:	br	gp, 2f
 2:	ldgp	gp, 0(gp)
-	jmp	zero, syscall_error
+	jmp	zero, __syscall_error
 
 weak_alias(__syscall, syscall)
diff --git a/sysdeps/unix/sysv/linux/alpha/sysdep.h b/sysdeps/unix/sysv/linux/alpha/sysdep.h
index 627b37e4fb..8f5f5dde61 100644
--- a/sysdeps/unix/sysv/linux/alpha/sysdep.h
+++ b/sysdeps/unix/sysv/linux/alpha/sysdep.h
@@ -38,15 +38,15 @@ Cambridge, MA 02139, USA.  */
 # define SYS_ify(syscall_name)	__NR_/**/syscall_name
 #endif
 
-/*
- * Define some aliases for syscalls that return two values (in r0 and r1):
- */
+/* Define some aliases to make automatic syscall generation work
+   properly.  The SYS_* variants are for the benefit of the files in
+   sysdeps/unix.  */
 #define __NR_getpid	__NR_getxpid
-#define __NR_getppid	__NR_getxpid
 #define __NR_getuid	__NR_getxuid
-#define __NR_geteuid	__NR_getxuid
 #define __NR_getgid	__NR_getxgid
-#define __NR_getegid	__NR_getxgid
+#define SYS_getpid	__NR_getxpid
+#define SYS_getuid	__NR_getxuid
+#define SYS_getgid	__NR_getxgid
 
 /*
  * Some syscalls no Linux program should know about:
diff --git a/sysdeps/unix/sysv/linux/gnu/types.h b/sysdeps/unix/sysv/linux/gnu/types.h
index 402df2aa4c..0bc072b092 100644
--- a/sysdeps/unix/sysv/linux/gnu/types.h
+++ b/sysdeps/unix/sysv/linux/gnu/types.h
@@ -19,10 +19,9 @@ Cambridge, MA 02139, USA.  */
 #ifndef	_GNU_TYPES_H
 #define	_GNU_TYPES_H	1
 
-/* Get actual type definitions for architecture from kernel headers.
-   This #define tells <linux/types.h> not to define `dev_t' et al itself.  */
-#define __KERNEL_STRICT_NAMES
-#define _LINUX_TYPES_DONT_EXPORT
+#include <features.h>
+
+/* Get actual type definitions for architecture from kernel headers.  */
 #include <linux/types.h>
 
 /* Convenience types.  */