about summary refs log tree commit diff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/alpha/bb_init_func.S4
-rw-r--r--sysdeps/alpha/copysign.c31
-rw-r--r--sysdeps/alpha/divrem.h2
-rw-r--r--sysdeps/generic/memcmp.c7
-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
28 files changed, 139 insertions, 197 deletions
diff --git a/sysdeps/alpha/bb_init_func.S b/sysdeps/alpha/bb_init_func.S
index dfa8c1d07b..49be0b2bfe 100644
--- a/sysdeps/alpha/bb_init_func.S
+++ b/sysdeps/alpha/bb_init_func.S
@@ -53,11 +53,11 @@ init:
 	br	pv, 1f
 1:	ldgp	gp, 0(pv)
 
-	lda	t1, __bb_head
+	ldiq	t1, __bb_head
 	lda	t3, _gmonparam
 	ldq	t2, 0(t1)
 	ldl	t3, 0(t3)		/* t3 = _gmonparam.state */
-	ldi	t0, 1
+	lda	t0, 1
 	stq	t0, ZERO_WORD(a0)	/* blocks->zero_word = 1 */
 	stq	t2, NEXT(a0)		/* blocks->next = __bb_head */
 	stq	a0, 0(t1)
diff --git a/sysdeps/alpha/copysign.c b/sysdeps/alpha/copysign.c
deleted file mode 100644
index 69544b01fb..0000000000
--- a/sysdeps/alpha/copysign.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Copyright (C) 1992, 1993, 1995 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 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.  */
-
-#define __NO_MATH_INLINES
-
-#include <math.h>
-
-/* Return X with its sign changed to Y's.  */
-__inline double
-__copysign (double __x, double __y)
-{
-  __asm ("cpys %1, %2, %0" : "=f" (__x) : "f" (__y), "f" (__x));
-  return __x;
-}
-
-weak_alias (__copysign, copysign)
diff --git a/sysdeps/alpha/divrem.h b/sysdeps/alpha/divrem.h
index f296179e99..2951335c49 100644
--- a/sysdeps/alpha/divrem.h
+++ b/sysdeps/alpha/divrem.h
@@ -125,7 +125,7 @@ FUNC_NAME:
 	ldq	gp, 0x10(sp)
 	lda	sp, 0x18(sp)
 #endif
-	.frame	sp, FRAME_SIZE, ra, 0
+	.frame	sp, FRAME_SIZE, retaddr, 0
 	lda	sp,-FRAME_SIZE(sp)
 	.prologue 1
 	stq	arg1,0x00(sp)
diff --git a/sysdeps/generic/memcmp.c b/sysdeps/generic/memcmp.c
index 8f5eca0b6b..d9f93bab61 100644
--- a/sysdeps/generic/memcmp.c
+++ b/sysdeps/generic/memcmp.c
@@ -84,6 +84,9 @@ typedef unsigned char byte;
 /* memcmp_bytes -- Compare A and B bytewise in the byte order of the machine.
    A and B are known to be different.
    This is needed only on little-endian machines.  */
+
+static int memcmp_bytes __P((op_t, op_t));
+
 #ifdef  __GNUC__
 __inline
 #endif
@@ -107,6 +110,8 @@ memcmp_bytes (a, b)
 }
 #endif
 
+static int memcmp_common_alignment __P((long, long, size_t));
+
 /* memcmp_common_alignment -- Compare blocks at SRCP1 and SRCP2 with LEN `op_t'
    objects (not LEN bytes!).  Both SRCP1 and SRCP2 should be aligned for
    memory operations on `op_t's.  */
@@ -194,6 +199,8 @@ memcmp_common_alignment (srcp1, srcp2, len)
   return 0;
 }
 
+static int memcmp_not_common_alignment __P((long, long, size_t));
+
 /* memcmp_not_common_alignment -- Compare blocks at SRCP1 and SRCP2 with LEN
    `op_t' objects (not LEN bytes!).  SRCP2 should be aligned for memory
    operations on `op_t', but SRCP1 *should be unaligned*.  */
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.  */