about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-05-23 05:33:49 +0000
committerRoland McGrath <roland@gnu.org>1996-05-23 05:33:49 +0000
commit510ca033d66c47e0dc54550928dece59799a0136 (patch)
treeeb14c6f963eddeee3a684002630311910960f51e
parentfa0bc87c32d02cd81ec4d0ae00e0d943c683e6e1 (diff)
downloadglibc-510ca033d66c47e0dc54550928dece59799a0136.tar.gz
glibc-510ca033d66c47e0dc54550928dece59799a0136.tar.xz
glibc-510ca033d66c47e0dc54550928dece59799a0136.zip
Wed May 22 00:40:50 1996 David Mosberger-Tang <davidm@azstarnet.com> cvs/libc-960524 cvs/libc-960523
	* sysdeps/unix/sysv/linux/alpha/speed.c (speeds): Add entry for
 	460800 baud.

	* sysdeps/unix/sysv/linux/alpha/statbuf.h: New file.

	* sysdeps/unix/sysv/linux/Makefile (headers): Add
 	alpha/ptrace.h.
	* sysdeps/unix/sysv/linux/alpha/alpha/ptrace.h: New file.

	* sysdeps/libm-ieee754/s_scalbnf.c: Call __scalbnf instead of
 	scalbnf.

	* sysdeps/generic/sigset.h (__sigismember, __sigaddset,
 	__sigdelset): Add declaration to keep ANSI compilers quiet.

	* sysdeps/alpha/__math.h (cabs): Remove underscores from struct
 	__cabs_complex member names in call to __hypot().

	* sysdeps/alpha/copysign.S, sysdeps/alpha/fabs.S: New files.

	* sysdeps/alpha/divrem.h: Renamed from sysdeps/alpha/divrem.S to avoid
 	name collision with math library.

	* sysdeps/alpha/divl.S, sysdeps/alpha/divlu.S, sysdeps/alpha/divq.S,
	sysdeps/alpha/divqu.S, sysdeps/alpha/reml.S, sysdeps/alpha/remlu.S,
	sysdeps/alpha/remq.S, sysdeps/alpha/remqu.S: Include divrem.h instead
	of divrem.S.

	* sysdeps/unix/alpha/sysdep.h: Include regdef.h.  Define LEAF macro
	to simplify declaration of leaf functions.

	* sysdeps/alpha/_mcount.S, sysdeps/alpha/bb_init_func.S,
 	sysdeps/alpha/bsd-setjmp.S, sysdeps/alpha/ffs.S,
 	sysdeps/alpha/htonl.S, sysdeps/alpha/htons.S, sysdeps/alpha/memchr.S,
 	sysdeps/alpha/setjmp.S, sysdeps/alpha/strlen.S,
 	sysdeps/alpha/udiv_qrnnd.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/pipe.S,
 	sysdeps/unix/sysv/linux/sigsuspend.S,
 	sysdeps/unix/sysv/linux/alpha/syscall.S,
 	sysdeps/unix/sysv/linux/alpha/sysdep.S: Remove include of regdef.h.
  	sysdep.h includes it now. Replace ENTRY by LEAF with appropriate
 	framesize declaration.  Replace "lda pv,sym/jsr pv" by "jsr sym".

	* sysdeps/unix/sysv/linux/alpha/sysdep.h (NO_UNDERSCORES): Don't
	define.

	* sysdeps/unix/sysv/linux/alpha/syscalls.list: Added getsockopt,
	ptrace, and sysctl.

	* sysdeps/unix/sysv/linux/alpha/profil-counter.h: File removed.

	* sysdeps/unix/sysv/linux/alpha/ioperm.c: Modify to support
 	dynamic recognition of platform type.
	(_bus_base): New function.

	* sysdeps/unix/sysv/linux/alpha/llseek.S: New file.

	* sunrpc/rpc/rpc.h, sunrpc/rpc/svc.h: Avoid nested comments since
 	they produce ugly warnings by gcc.

	* posix/sys/types.h [__USE_MISC]: Add typedef for ulong.

Wed Mar 27 10:26:21 1996  David Mosberger-Tang  <davidm@azstarnet.com>

	* sysdeps/alpha/setjmp.S: Must establish global pointer before
 	address of __sigsetjmp_aux can be loaded.
-rw-r--r--ChangeLog71
-rw-r--r--posix/sys/types.h1
-rw-r--r--sunrpc/rpc/rpc.h4
-rw-r--r--sunrpc/rpc/svc.h2
-rw-r--r--sysdeps/alpha/__math.h2
-rw-r--r--sysdeps/alpha/_mcount.S9
-rw-r--r--sysdeps/alpha/bb_init_func.S18
-rw-r--r--sysdeps/alpha/bsd-setjmp.S8
-rw-r--r--sysdeps/alpha/copysign.S (renamed from sysdeps/unix/sysv/linux/alpha/profil-counter.h)21
-rw-r--r--sysdeps/alpha/divl.S2
-rw-r--r--sysdeps/alpha/divlu.S2
-rw-r--r--sysdeps/alpha/divq.S2
-rw-r--r--sysdeps/alpha/divqu.S2
-rw-r--r--sysdeps/alpha/divrem.h (renamed from sysdeps/alpha/divrem.S)23
-rw-r--r--sysdeps/alpha/fabs.S27
-rw-r--r--sysdeps/alpha/ffs.S5
-rw-r--r--sysdeps/alpha/htonl.S24
-rw-r--r--sysdeps/alpha/htons.S12
-rw-r--r--sysdeps/alpha/memchr.S7
-rw-r--r--sysdeps/alpha/reml.S2
-rw-r--r--sysdeps/alpha/remlu.S2
-rw-r--r--sysdeps/alpha/remq.S2
-rw-r--r--sysdeps/alpha/remqu.S2
-rw-r--r--sysdeps/alpha/setjmp.S13
-rw-r--r--sysdeps/alpha/strlen.S5
-rw-r--r--sysdeps/alpha/udiv_qrnnd.S12
-rw-r--r--sysdeps/generic/sigset.h4
-rw-r--r--sysdeps/libm-ieee754/s_scalbnf.c4
-rw-r--r--sysdeps/unix/alpha/sysdep.h52
-rw-r--r--sysdeps/unix/sysv/linux/alpha/alpha/ptrace.h18
-rw-r--r--sysdeps/unix/sysv/linux/alpha/brk.S11
-rw-r--r--sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S10
-rw-r--r--sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S10
-rw-r--r--sysdeps/unix/sysv/linux/alpha/ioperm.c275
-rw-r--r--sysdeps/unix/sysv/linux/alpha/llseek.S49
-rw-r--r--sysdeps/unix/sysv/linux/alpha/pipe.S5
-rw-r--r--sysdeps/unix/sysv/linux/alpha/speed.c1
-rw-r--r--sysdeps/unix/sysv/linux/alpha/statbuf.h75
-rw-r--r--sysdeps/unix/sysv/linux/alpha/syscall.S25
-rw-r--r--sysdeps/unix/sysv/linux/alpha/syscalls.list3
-rw-r--r--sysdeps/unix/sysv/linux/alpha/sysdep.S7
-rw-r--r--sysdeps/unix/sysv/linux/alpha/sysdep.h3
42 files changed, 586 insertions, 246 deletions
diff --git a/ChangeLog b/ChangeLog
index 03542f6aca..ebd7bebe14 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,74 @@
+Wed May 22 00:40:50 1996  David Mosberger-Tang  <davidm@azstarnet.com>
+
+	* sysdeps/unix/sysv/linux/alpha/speed.c (speeds): Add entry for
+ 	460800 baud.
+
+	* sysdeps/unix/sysv/linux/alpha/statbuf.h: New file.
+
+	* sysdeps/unix/sysv/linux/Makefile (headers): Add
+ 	alpha/ptrace.h.
+	* sysdeps/unix/sysv/linux/alpha/alpha/ptrace.h: New file.
+
+	* sysdeps/libm-ieee754/s_scalbnf.c: Call __scalbnf instead of
+ 	scalbnf.
+
+	* sysdeps/generic/sigset.h (__sigismember, __sigaddset,
+ 	__sigdelset): Add declaration to keep ANSI compilers quiet.
+
+	* sysdeps/alpha/__math.h (cabs): Remove underscores from struct
+ 	__cabs_complex member names in call to __hypot().
+
+	* sysdeps/alpha/copysign.S, sysdeps/alpha/fabs.S: New files.
+
+	* sysdeps/alpha/divrem.h: Renamed from sysdeps/alpha/divrem.S to avoid
+ 	name collision with math library.
+
+	* sysdeps/alpha/divl.S, sysdeps/alpha/divlu.S, sysdeps/alpha/divq.S,
+	sysdeps/alpha/divqu.S, sysdeps/alpha/reml.S, sysdeps/alpha/remlu.S,
+	sysdeps/alpha/remq.S, sysdeps/alpha/remqu.S: Include divrem.h instead
+	of divrem.S.
+
+	* sysdeps/unix/alpha/sysdep.h: Include regdef.h.  Define LEAF macro
+	to simplify declaration of leaf functions.
+
+	* sysdeps/alpha/_mcount.S, sysdeps/alpha/bb_init_func.S,
+ 	sysdeps/alpha/bsd-setjmp.S, sysdeps/alpha/ffs.S,
+ 	sysdeps/alpha/htonl.S, sysdeps/alpha/htons.S, sysdeps/alpha/memchr.S,
+ 	sysdeps/alpha/setjmp.S, sysdeps/alpha/strlen.S,
+ 	sysdeps/alpha/udiv_qrnnd.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/pipe.S,
+ 	sysdeps/unix/sysv/linux/sigsuspend.S,
+ 	sysdeps/unix/sysv/linux/alpha/syscall.S,
+ 	sysdeps/unix/sysv/linux/alpha/sysdep.S: Remove include of regdef.h.
+  	sysdep.h includes it now. Replace ENTRY by LEAF with appropriate
+ 	framesize declaration.  Replace "lda pv,sym/jsr pv" by "jsr sym".
+
+	* sysdeps/unix/sysv/linux/alpha/sysdep.h (NO_UNDERSCORES): Don't
+	define.
+
+	* sysdeps/unix/sysv/linux/alpha/syscalls.list: Added getsockopt,
+	ptrace, and sysctl.
+
+	* sysdeps/unix/sysv/linux/alpha/profil-counter.h: File removed.
+
+	* sysdeps/unix/sysv/linux/alpha/ioperm.c: Modify to support
+ 	dynamic recognition of platform type.
+	(_bus_base): New function.
+
+	* sysdeps/unix/sysv/linux/alpha/llseek.S: New file.
+
+	* sunrpc/rpc/rpc.h, sunrpc/rpc/svc.h: Avoid nested comments since
+ 	they produce ugly warnings by gcc.
+
+	* posix/sys/types.h [__USE_MISC]: Add typedef for ulong.
+
+Wed Mar 27 10:26:21 1996  David Mosberger-Tang  <davidm@azstarnet.com>
+
+	* sysdeps/alpha/setjmp.S: Must establish global pointer before
+ 	address of __sigsetjmp_aux can be loaded.
+
 Wed May 22 22:10:01 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
 
 	* stdlib/canonicalize.c: New file.
diff --git a/posix/sys/types.h b/posix/sys/types.h
index 8c65ae053b..8265fa0cb6 100644
--- a/posix/sys/types.h
+++ b/posix/sys/types.h
@@ -64,6 +64,7 @@ __BEGIN_DECLS
 
 #ifdef __USE_MISC
 /* Old compatibility names for C types.  */
+typedef unsigned long int ulong;
 typedef unsigned short int ushort;
 typedef unsigned int uint;
 #endif
diff --git a/sunrpc/rpc/rpc.h b/sunrpc/rpc/rpc.h
index 83a124a3ed..d11e83e0a9 100644
--- a/sunrpc/rpc/rpc.h
+++ b/sunrpc/rpc/rpc.h
@@ -56,7 +56,9 @@
  *  Uncomment-out the next line if you are building the rpc library with    
  *  DES Authentication (see the README file in the secure_rpc/ directory).
  */
-/*#include <rpc/auth_des.h>	/* protocol for des style cred */
+#if 0
+#include <rpc/auth_des.h>	/* protocol for des style cred */
+#endif
 
 /* Server side only remote procedure callee */
 #include <rpc/svc.h>		/* service manager and multiplexer */
diff --git a/sunrpc/rpc/svc.h b/sunrpc/rpc/svc.h
index 3cb07ef3f3..4f4f546f11 100644
--- a/sunrpc/rpc/svc.h
+++ b/sunrpc/rpc/svc.h
@@ -151,7 +151,7 @@ struct svc_req {
  *	u_long prog;
  *	u_long vers;
  *	void (*dispatch)();
- *	int protocol;  /* like TCP or UDP, zero means do not register 
+ *	int protocol;  like TCP or UDP, zero means do not register 
  */
 extern bool_t	svc_register();
 
diff --git a/sysdeps/alpha/__math.h b/sysdeps/alpha/__math.h
index 9aea9d7097..50d8ac3b0a 100644
--- a/sysdeps/alpha/__math.h
+++ b/sysdeps/alpha/__math.h
@@ -46,7 +46,7 @@ extern __inline double
 cabs (struct __cabs_complex __z)
 {
   extern double __hypot (double, double);
-  return __hypot(__z.__x, __z.__y);
+  return __hypot(__z.x, __z.y);
 }
 #endif
 
diff --git a/sysdeps/alpha/_mcount.S b/sysdeps/alpha/_mcount.S
index 2d6e2ed532..7944544e18 100644
--- a/sysdeps/alpha/_mcount.S
+++ b/sysdeps/alpha/_mcount.S
@@ -34,18 +34,15 @@ holds the return address of the function's caller (selfpc and frompc,
 respectively in gmon.c language...). */
 
 #include <sysdep.h>
-#ifdef __linux__
-# include <alpha/regdef.h>
-#else
-# include <regdef.h>
-#endif
 
 #undef ret	/* discard `ret' as defined in sysdep.h */
 
 	.set	noat
 	.set	noreorder
 
-ENTRY(_mcount)
+LEAF(_mcount, 0xb0)
+	.prologue 0
+
 	subq	 sp, 0xb0, sp
 	stq	 a0, 0x00(sp)
 	mov	 ra, a0		# a0 = caller-pc
diff --git a/sysdeps/alpha/bb_init_func.S b/sysdeps/alpha/bb_init_func.S
index 9bf985ccc0..cd860b8303 100644
--- a/sysdeps/alpha/bb_init_func.S
+++ b/sysdeps/alpha/bb_init_func.S
@@ -24,11 +24,6 @@ caller-saved (call-used) registers (except for argument registers
 a1-a5). */
 
 #include <sysdep.h>
-#ifdef __linux__
-# include <alpha/regdef.h>
-#else
-# include <regdef.h>
-#endif
 
 /*
  * These offsets should match with "struct bb" declared in gcc/libgcc2.c.
@@ -40,12 +35,19 @@ a1-a5). */
 	.set	noreorder
 
 ENTRY(__bb_init_func)
+	.prologue 0
+
 	ldq	t0, ZERO_WORD(a0)	/* t0 <- blocks->zero_word */
 	beq	t0, init		/* not initialized yet -> */
 	ret
+	
+	.end __bb_init_func
+
 
+LEAF(init, 0x38)
+	subq	sp, 0x38, sp
+	.prologue 0
 
-init:	subq	sp, 0x38, sp
 	stq	pv, 0x30(sp)
 	br	pv, 1f
 1:	ldgp	gp, 0(pv)
@@ -81,5 +83,5 @@ init:	subq	sp, 0x38, sp
 leave:	ldq	pv, 0x30(sp)
 	addq	sp, 0x38, sp
 	ret
-	
-	.end __bb_init_func
+
+	.end init
diff --git a/sysdeps/alpha/bsd-setjmp.S b/sysdeps/alpha/bsd-setjmp.S
index 470f7bc47d..113bc47c88 100644
--- a/sysdeps/alpha/bsd-setjmp.S
+++ b/sysdeps/alpha/bsd-setjmp.S
@@ -23,8 +23,8 @@ Cambridge, MA 02139, USA.  */
 
 #include <sysdep.h>
 
-ENTRY (setjmp)
-	lda $27, __sigsetjmp	/* Load address to jump to.  */
-	bis $31, 1, $17		/* Pass a second argument of one.  */
-	jmp $31, ($27), __sigsetjmp /* Call __sigsetjmp.  */
+ENTRY(setjmp)
+	lda	$27, __sigsetjmp	/* Load address to jump to.  */
+	bis	$31, 1, $17		/* Pass a second argument of one.  */
+	jmp	$31, ($27), __sigsetjmp /* Call __sigsetjmp.  */
 	.end setjmp
diff --git a/sysdeps/unix/sysv/linux/alpha/profil-counter.h b/sysdeps/alpha/copysign.S
index 6ab5a88c49..9e9dff3ed0 100644
--- a/sysdeps/unix/sysv/linux/alpha/profil-counter.h
+++ b/sysdeps/alpha/copysign.S
@@ -1,7 +1,6 @@
-/* Low-level statistical profiling support function.  Mostly POSIX.1 version.
-Copyright (C) 1996 Free Software Foundation, Inc.
-Contributed by David Mosberger <davidm@azstarnet.com>
+/* Copyright (C) 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
+Contributed by David Mosberger <davidm@azstarnet.com>
 
 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,11 +17,13 @@ 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 <asm/sigcontext.h>
+#include <sysdep.h>
+
+ENTRY(__copysign)
+	.prologue 0
+	cpys	$f17,$f16,$f0
+	ret
+
+	.end __copysign
 
-void
-profil_counter (int signal, long a1, long a2, long a3, long a4, long a5,
-		struct sigcontext_struct sc)
-{
-  profil_count((void *) sc.sc_pc);
-}
+weak_alias(__copysign, copysign)
diff --git a/sysdeps/alpha/divl.S b/sysdeps/alpha/divl.S
index 7dbb5048c7..6990665937 100644
--- a/sysdeps/alpha/divl.S
+++ b/sysdeps/alpha/divl.S
@@ -3,4 +3,4 @@
 #define SIGNED		1
 #define FUNC_NAME	__divl
 
-#include "divrem.S"
+#include "divrem.h"
diff --git a/sysdeps/alpha/divlu.S b/sysdeps/alpha/divlu.S
index 9cc71da308..ee96c95008 100644
--- a/sysdeps/alpha/divlu.S
+++ b/sysdeps/alpha/divlu.S
@@ -3,4 +3,4 @@
 #define SIGNED		0
 #define FUNC_NAME	__divlu
 
-#include "divrem.S"
+#include "divrem.h"
diff --git a/sysdeps/alpha/divq.S b/sysdeps/alpha/divq.S
index f7af8d62a3..bde3425f37 100644
--- a/sysdeps/alpha/divq.S
+++ b/sysdeps/alpha/divq.S
@@ -3,4 +3,4 @@
 #define SIGNED		1
 #define FUNC_NAME	__divq
 
-#include "divrem.S"
+#include "divrem.h"
diff --git a/sysdeps/alpha/divqu.S b/sysdeps/alpha/divqu.S
index faf2932cb5..72dcf971dd 100644
--- a/sysdeps/alpha/divqu.S
+++ b/sysdeps/alpha/divqu.S
@@ -3,4 +3,4 @@
 #define SIGNED		0
 #define FUNC_NAME	__divqu
 
-#include "divrem.S"
+#include "divrem.h"
diff --git a/sysdeps/alpha/divrem.S b/sysdeps/alpha/divrem.h
index e6293bf355..ee7f64ef1e 100644
--- a/sysdeps/alpha/divrem.S
+++ b/sysdeps/alpha/divrem.h
@@ -103,10 +103,29 @@ clobbered (assembly temporary), anything else must be saved.  */
 	.ent FUNC_NAME
 	.globl FUNC_NAME
 
+#define FRAME_SIZE	0x30
+
 	.align 5
 FUNC_NAME:
-#	define FRAME_SIZE	0x30
-	.frame	sp,FRAME_SIZE,ra,0
+#ifdef PROF
+	lda	sp, -0x18(sp)
+	stq	ra, 0x00(sp)
+	stq	pv, 0x08(sp)
+	stq	gp, 0x10(sp)
+
+	br	AT, 1f
+1:	ldgp	gp, 0(AT)
+	lda	AT, _mcount
+
+	mov	retaddr, ra
+	jsr	AT, (AT), _mcount
+
+	ldq	ra, 0x00(sp)
+	ldq	pv, 0x08(sp)
+	ldq	gp, 0x10(sp)
+	lda	sp, 0x18(sp)
+#endif
+	.frame	sp, FRAME_SIZE, ra, 0
 	lda	sp,-FRAME_SIZE(sp)
 	.prologue 1
 	stq	arg1,0x00(sp)
diff --git a/sysdeps/alpha/fabs.S b/sysdeps/alpha/fabs.S
new file mode 100644
index 0000000000..88e64b4718
--- /dev/null
+++ b/sysdeps/alpha/fabs.S
@@ -0,0 +1,27 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by David Mosberger <davidm@azstarnet.com>
+
+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>
+
+ENTRY(fabs)
+	.prologue 0
+	cpys	$f31,$f16,$f0
+	ret
+
+	.end fabs
diff --git a/sysdeps/alpha/ffs.S b/sysdeps/alpha/ffs.S
index 7676b85aaa..7cf6281682 100644
--- a/sysdeps/alpha/ffs.S
+++ b/sysdeps/alpha/ffs.S
@@ -22,11 +22,6 @@ Cambridge, MA 02139, USA.  */
 architecture.  */
 
 #include <sysdep.h>
-#ifdef __linux__
-# include <alpha/regdef.h>
-#else
-#include <regdef.h>
-#endif
 
         .set noreorder
         .set noat
diff --git a/sysdeps/alpha/htonl.S b/sysdeps/alpha/htonl.S
index d0bf7e1718..8c1c700212 100644
--- a/sysdeps/alpha/htonl.S
+++ b/sysdeps/alpha/htonl.S
@@ -17,22 +17,18 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 Cambridge, MA 02139, USA.  */
 
 #include <sysdep.h>
-#ifdef __linux__
-# include <alpha/regdef.h>
-#else
-#include <regdef.h>
-#endif
 
 ENTRY(__htonl)
-	extlh	a0,5,t1		# t1 = dd000000
-	zap	a0,0xfd,t2	# t2 = 0000cc00
-	sll	t2,5,t2		# t2 = 00198000
-	s8addl	t2,t1,t1	# t1 = ddcc0000
-	zap	a0,0xfb,t2	# t2 = 00bb0000
-	srl	t2,8,t2		# t2 = 0000bb00
-	extbl	a0,3,v0		# v0 = 000000aa
-	or	t1,v0,v0	# v0 = ddcc00aa
-	or	t2,v0,v0	# v0 = ddccbbaa
+	.prologue 0
+	extlh	a0, 5, t1	# t1 = dd000000
+	zap	a0, 0xfd, t2	# t2 = 0000cc00
+	sll	t2, 5, t2	# t2 = 00198000
+	s8addl	t2, t1, t1	# t1 = ddcc0000
+	zap	a0, 0xfb, t2	# t2 = 00bb0000
+	srl	t2, 8, t2	# t2 = 0000bb00
+	extbl	a0, 3, v0	# v0 = 000000aa
+	or	t1, v0, v0	# v0 = ddcc00aa
+	or	t2, v0, v0	# v0 = ddccbbaa
 	ret
 
 	.end	__htonl
diff --git a/sysdeps/alpha/htons.S b/sysdeps/alpha/htons.S
index 6e18c7c441..cb22b21661 100644
--- a/sysdeps/alpha/htons.S
+++ b/sysdeps/alpha/htons.S
@@ -17,16 +17,12 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 Cambridge, MA 02139, USA.  */
 
 #include <sysdep.h>
-#ifdef __linux__
-# include <alpha/regdef.h>
-#else
-#include <regdef.h>
-#endif
 
 ENTRY(__htons)
-	extwh	a0,7,t1		# t1 = bb00
-	extbl	a0,1,v0		# v0 = 00aa
-	bis	v0,t1,v0	# v0 = bbaa
+	.prologue 0
+	extwh	a0, 7, t1	# t1 = bb00
+	extbl	a0, 1, v0	# v0 = 00aa
+	bis	v0, t1, v0	# v0 = bbaa
 	ret
 
 	.end	__htons
diff --git a/sysdeps/alpha/memchr.S b/sysdeps/alpha/memchr.S
index 118a1f13d1..2f78697418 100644
--- a/sysdeps/alpha/memchr.S
+++ b/sysdeps/alpha/memchr.S
@@ -35,16 +35,13 @@ For correctness consider that:
 */
 
 #include <sysdep.h>
-#ifdef __linux__
-# include <alpha/regdef.h>
-#else
-#include <regdef.h>
-#endif
 
         .set noreorder
         .set noat
 
 ENTRY(memchr)
+	.prologue 0
+
 	beq	a2, not_found
         ldq_u   t0, 0(a0)       # load first quadword (a0 may be misaligned)
 	addq	a0, a2, t4
diff --git a/sysdeps/alpha/reml.S b/sysdeps/alpha/reml.S
index cede136acd..b631a02c31 100644
--- a/sysdeps/alpha/reml.S
+++ b/sysdeps/alpha/reml.S
@@ -3,4 +3,4 @@
 #define SIGNED		1
 #define FUNC_NAME	__reml
 
-#include "divrem.S"
+#include "divrem.h"
diff --git a/sysdeps/alpha/remlu.S b/sysdeps/alpha/remlu.S
index 3658d92bc1..8d527e4678 100644
--- a/sysdeps/alpha/remlu.S
+++ b/sysdeps/alpha/remlu.S
@@ -3,4 +3,4 @@
 #define SIGNED		0
 #define FUNC_NAME	__remlu
 
-#include "divrem.S"
+#include "divrem.h"
diff --git a/sysdeps/alpha/remq.S b/sysdeps/alpha/remq.S
index 61f2067383..8bd9f334f4 100644
--- a/sysdeps/alpha/remq.S
+++ b/sysdeps/alpha/remq.S
@@ -3,4 +3,4 @@
 #define SIGNED		1
 #define FUNC_NAME	__remq
 
-#include "divrem.S"
+#include "divrem.h"
diff --git a/sysdeps/alpha/remqu.S b/sysdeps/alpha/remqu.S
index e22d5ac1c8..14a7486148 100644
--- a/sysdeps/alpha/remqu.S
+++ b/sysdeps/alpha/remqu.S
@@ -3,4 +3,4 @@
 #define SIGNED		0
 #define FUNC_NAME	__remqu
 
-#include "divrem.S"
+#include "divrem.h"
diff --git a/sysdeps/alpha/setjmp.S b/sysdeps/alpha/setjmp.S
index 04b8068eb9..b165d2c2c8 100644
--- a/sysdeps/alpha/setjmp.S
+++ b/sysdeps/alpha/setjmp.S
@@ -22,9 +22,12 @@ Cambridge, MA 02139, USA.  */
    reliably access the stack or frame pointers, so we pass them in as
    extra arguments.  */
 ENTRY (__sigsetjmp)
-	ldgp $29, 0($27)
-	lda $27, __sigsetjmp_aux/* Load address to jump to.  */
-	bis $30, $30, $18	/* Pass SP as 3rd arg.  */
-	bis $15, $15, $19	/* Pass FP as 4th arg.  */
-	jmp $31, ($27), __sigsetjmp_aux /* Call __sigsetjmp_aux.  */
+	ldgp	$29, 0($27)
+	.prologue 1
+
+	lda	$27, __sigsetjmp_aux	/* Load address to jump to.  */
+	bis	$30, $30, $18		/* Pass SP as 3rd arg.  */
+	bis	$15, $15, $19		/* Pass FP as 4th arg.  */
+	jmp	$31, ($27), __sigsetjmp_aux /* Call __sigsetjmp_aux.  */
+
 	.end __sigsetjmp
diff --git a/sysdeps/alpha/strlen.S b/sysdeps/alpha/strlen.S
index 7e6a61be8c..c64126164a 100644
--- a/sysdeps/alpha/strlen.S
+++ b/sysdeps/alpha/strlen.S
@@ -29,11 +29,6 @@ architecture:
         binary search needs).  */
 
 #include <sysdep.h>
-#ifdef __linux__
-# include <alpha/regdef.h>
-#else
-#include <regdef.h>
-#endif
 
         .set noreorder
         .set noat
diff --git a/sysdeps/alpha/udiv_qrnnd.S b/sysdeps/alpha/udiv_qrnnd.S
index d3d2cee93d..eb134f25c7 100644
--- a/sysdeps/alpha/udiv_qrnnd.S
+++ b/sysdeps/alpha/udiv_qrnnd.S
@@ -19,15 +19,15 @@
  # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  # MA 02111-1307, USA.
 
+#include <sysdep.h>
 
         .set noreorder
         .set noat
-.text
-        .align	3
-        .globl	__udiv_qrnnd
-        .ent	__udiv_qrnnd
-__udiv_qrnnd:
-        .frame $30,0,$26,0
+
+	.text
+
+LEAF(__udiv_qrnnd, 0)
+
         .prologue 0
 #define cnt	$2
 #define tmp	$3
diff --git a/sysdeps/generic/sigset.h b/sysdeps/generic/sigset.h
index e9dc7c728b..b00265b6e9 100644
--- a/sysdeps/generic/sigset.h
+++ b/sysdeps/generic/sigset.h
@@ -50,6 +50,10 @@ typedef unsigned long int __sigset_t;
    call we know fails with EINVAL (kludge city!), so as to avoid referring
    to `errno' in this file (sigh).  */
 
+extern __sigismember (__const __sigset_t *, int);
+extern __sigaddset (__sigset_t *, int);
+extern __sigdelset (__sigset_t *, int);
+
 #ifndef _EXTERN_INLINE
 #define _EXTERN_INLINE extern __inline
 #endif
diff --git a/sysdeps/libm-ieee754/s_scalbnf.c b/sysdeps/libm-ieee754/s_scalbnf.c
index 60aedf1b88..3a83e54c56 100644
--- a/sysdeps/libm-ieee754/s_scalbnf.c
+++ b/sysdeps/libm-ieee754/s_scalbnf.c
@@ -31,9 +31,9 @@ huge   = 1.0e+30,
 tiny   = 1.0e-30;
 
 #ifdef __STDC__
-	float scalbnf (float x, int n)
+	float __scalbnf (float x, int n)
 #else
-	float scalbn (x,n)
+	float __scalbnf (x,n)
 	float x; int n;
 #endif
 {
diff --git a/sysdeps/unix/alpha/sysdep.h b/sysdeps/unix/alpha/sysdep.h
index 9eb9032270..8a52f201e1 100644
--- a/sysdeps/unix/alpha/sysdep.h
+++ b/sysdeps/unix/alpha/sysdep.h
@@ -20,20 +20,42 @@ Cambridge, MA 02139, USA.  */
 
 #ifdef ASSEMBLER
 
+#ifdef __linux__
+# include <alpha/regdef.h>
+#else
+# include <regdef.h>
+#endif
+
+#ifdef __STDC__
+#define LEAF(name, framesize)			\
+  .globl name;					\
+  .align 3;					\
+  .ent name, 0;					\
+  name##:					\
+  .frame sp, framesize, ra
+#else
+#define LEAF(name, framesize)			\
+  .globl name;					\
+  .align 3;					\
+  .ent name, 0;					\
+  name/**/:					\
+  .frame sp, framesize, ra
+#endif
+
 #ifdef __STDC__
 #define ENTRY(name)				\
   .globl name;					\
   .align 3;					\
-  .ent name,0;					\
+  .ent name, 0;					\
   name##:					\
-  .frame sp,0,ra
+  .frame sp, 0, ra
 #else
 #define ENTRY(name)				\
   .globl name;					\
   .align 3;					\
-  .ent name,0;					\
+  .ent name, 0;					\
   name/**/:					\
-  .frame sp,0,ra
+  .frame sp, 0, ra
 #endif
 
 /* Note that while it's better structurally, going back to set errno
@@ -45,17 +67,16 @@ Cambridge, MA 02139, USA.  */
     .align 3;					\
     .ent name,0;				\
 						\
-1:  br		gp,2f;				\
-2:  ldgp	gp,0(gp);			\
-    lda		pv,syscall_error;		\
-    jmp		zero,(pv);			\
+1:  br		gp, 2f;				\
+2:  ldgp	gp, 0(gp);			\
+    jmp		zero, syscall_error;		\
 						\
 name##:						\
-    ldi		v0,SYS_ify(syscall_name);	\
+    ldi		v0, SYS_ify(syscall_name);	\
     .set noat;					\
     call_pal	PAL_callsys;			\
     .set at;					\
-    bne		a3,1b;				\
+    bne		a3, 1b;				\
 3:
 #else
 #define PSEUDO(name, syscall_name, args)	\
@@ -63,17 +84,16 @@ name##:						\
     .align 3;					\
     .ent name,0;				\
 						\
-1:  br		gp,2f;				\
-2:  ldgp	gp,0(gp);			\
-    lda		pv,syscall_error;		\
-    jmp		zero,(pv);			\
+1:  br		gp, 2f;				\
+2:  ldgp	gp, 0(gp);			\
+    jmp		zero, syscall_error;		\
 						\
 name/**/:					\
-    ldi		v0,SYS_ify(syscall_name);	\
+    ldi		v0, SYS_ify(syscall_name);	\
     .set noat;					\
     call_pal	PAL_callsys;			\
     .set at;					\
-    bne		a3,1b;				\
+    bne		a3, 1b;				\
 3:
 #endif
 
diff --git a/sysdeps/unix/sysv/linux/alpha/alpha/ptrace.h b/sysdeps/unix/sysv/linux/alpha/alpha/ptrace.h
new file mode 100644
index 0000000000..57b96d64db
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/alpha/ptrace.h
@@ -0,0 +1,18 @@
+#ifndef __alpha_ptrace_h__
+#define __alpha_ptrace_h__
+
+/*
+ * Mostly for OSF/1 compatibility.
+ */
+
+#define REG_BASE        0
+#define NGP_REGS        32
+#define NFP_REGS        32
+
+#define GPR_BASE        REG_BASE
+#define FPR_BASE        (GPR_BASE+NGP_REGS)
+#define PC              (FPR_BASE+NFP_REGS)
+#define SPR_PS          (PC+1)
+#define NPTRC_REGS      (SPR_PS+1)
+
+#endif /* __alpha_ptrace_h__ */
diff --git a/sysdeps/unix/sysv/linux/alpha/brk.S b/sysdeps/unix/sysv/linux/alpha/brk.S
index afd2e3203c..4582539bc1 100644
--- a/sysdeps/unix/sysv/linux/alpha/brk.S
+++ b/sysdeps/unix/sysv/linux/alpha/brk.S
@@ -36,24 +36,23 @@ __curbrk:
 	.quad _end
 
 	.text
-ENTRY(__brk)
+LEAF(__brk, 0)
 	ldgp	gp, 0(t12)
 	.prologue 1
 
 	ldi	v0, __NR_brk
 	call_pal PAL_callsys
 	subq	a0, v0, t0
-	bne t0, error
+	bne	t0, error
 
 	/* Update __curbrk and return cleanly.  */
-	stl a0, __curbrk
-	mov zero, v0
+	stl	a0, __curbrk
+	mov	zero, v0
 	ret
 
 	/* What a horrible way to die.  */
 error:	ldi	v0, ENOMEM
-	lda	pv, syscall_error
-	jmp	zero,(pv)
+	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 4c86e398d8..c3486acc1a 100644
--- a/sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S
+++ b/sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S
@@ -21,9 +21,10 @@ Cambridge, MA 02139, USA.  */
 #define GSI_IEEE_FP_CONTROL	45
 
 	.text
-ENTRY(__ieee_get_fp_control)
+
+LEAF(__ieee_get_fp_control, 8)
 	lda	sp, -8(sp)
-	.prologue 1
+	.prologue 0
 
 	mov	sp, a1
 	ldi	a0, GSI_IEEE_FP_CONTROL
@@ -36,8 +37,9 @@ ENTRY(__ieee_get_fp_control)
 	ret
 
 error:	lda	sp, 8(sp)
-	lda	pv, syscall_error
-	jmp	zero,(pv)
+	br	gp, 1f
+1:	ldgp	gp, 0(gp)
+	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 d10e9bc24c..507b5d5cab 100644
--- a/sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S
+++ b/sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S
@@ -20,10 +20,9 @@ Cambridge, MA 02139, USA.  */
 
 #define SSI_IEEE_FP_CONTROL	14
 
-	.text
-ENTRY(__ieee_set_fp_control)
+LEAF(__ieee_set_fp_control, 8)
 	lda	sp, -8(sp)
-	.prologue 1
+	.prologue 0
 
 	stq	a0, 0(sp)
 	mov	sp, a1
@@ -36,8 +35,9 @@ ENTRY(__ieee_set_fp_control)
 	bne	a3, error
 	ret
 
-error:	lda	pv, syscall_error
-	jmp	zero,(pv)
+error:	br	gp, 1f
+1:	ldgp	gp, 0(gp)
+	jmp	zero, syscall_error
 
 	.end __ieee_set_fp_control
 
diff --git a/sysdeps/unix/sysv/linux/alpha/ioperm.c b/sysdeps/unix/sysv/linux/alpha/ioperm.c
index 306c86b96a..b9630a8273 100644
--- a/sysdeps/unix/sysv/linux/alpha/ioperm.c
+++ b/sysdeps/unix/sysv/linux/alpha/ioperm.c
@@ -35,31 +35,35 @@ I/O address space that's 512MB large!).  */
 #include <errno.h>
 #include <fcntl.h>
 #include <stdio.h>
-#include <unistd.h>
+#include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 
 #include <sys/types.h>
 #include <sys/mman.h>
 
-#include <asm/io.h>
 #include <asm/page.h>
 #include <asm/system.h>
 
-#undef inb
-#undef inw
-#undef inl
-#undef outb
-#undef outw
-#undef outl
-
-#define PATH_CPUINFO	"/proc/cpuinfo"
+#define PATH_ALPHA_SYSTYPE	"/etc/alpha_systype"
+#define PATH_CPUINFO		"/proc/cpuinfo"
 
 #define MAX_PORT	0x10000
 #define vuip		volatile unsigned int *
 
-#define JENSEN_IO_BASE		(IDENT_ADDR + 0x0300000000UL)
-#define APECS_IO_BASE		(IDENT_ADDR + 0x01c0000000UL)
-#define ALCOR_IO_BASE		(IDENT_ADDR + 0x8580000000UL)
+#define JENSEN_IO_BASE		(0xfffffc0300000000UL)
+#define JENSEN_MEM		(0xfffffc0200000000UL)	/* sparse!! */
+
+/*
+ * With respect to the I/O architecture, APECS and LCA are identical,
+ * so the following defines apply to LCA as well.
+ */
+#define APECS_IO_BASE		(0xfffffc01c0000000UL)
+#define APECS_DENSE_MEM		(0xfffffc0300000000UL)
+
+#define ALCOR_IO_BASE		(0xfffffc8580000000UL)
+#define ALCOR_DENSE_MEM		(0xfffffc8600000000UL)
+
 
 enum {
   IOSYS_JENSEN = 0, IOSYS_APECS = 1, IOSYS_ALCOR = 2
@@ -78,58 +82,75 @@ struct ioswtch {
 static struct platform {
   const char	*name;
   int		io_sys;
+  unsigned long	bus_memory_base;
 } platform[] = {
-  {"Alcor",		IOSYS_ALCOR},
-  {"Avanti",		IOSYS_APECS},
-  {"Cabriolet",		IOSYS_APECS},
-  {"EB64+",		IOSYS_APECS},
-  {"EB66",		IOSYS_APECS},
-  {"EB66P",		IOSYS_APECS},
-  {"Jensen",		IOSYS_JENSEN},
-  {"Mustang",		IOSYS_APECS},
-  {"Noname",		IOSYS_APECS},
+  {"Alcor",	IOSYS_ALCOR,	ALCOR_DENSE_MEM},
+  {"Avanti",	IOSYS_APECS,	APECS_DENSE_MEM},
+  {"Cabriolet",	IOSYS_APECS,	APECS_DENSE_MEM},
+  {"EB164",	IOSYS_ALCOR,	ALCOR_DENSE_MEM},
+  {"EB64+",	IOSYS_APECS,	APECS_DENSE_MEM},
+  {"EB66",	IOSYS_APECS,	APECS_DENSE_MEM},	/* LCA same as APECS */
+  {"EB66P",	IOSYS_APECS,	APECS_DENSE_MEM},	/* LCA same as APECS */
+  {"Jensen",	IOSYS_JENSEN,	JENSEN_MEM},
+  {"Mustang",	IOSYS_APECS,	APECS_DENSE_MEM},
+  {"Noname",	IOSYS_APECS,	APECS_DENSE_MEM},	/* LCA same as APECS */
 };
 
 
 static struct {
-  struct hae		hae;
+  struct hae {
+    unsigned long	cache;
+    unsigned long *	reg;
+  } hae;
   unsigned long		base;
   struct ioswtch *	swp;
   int			sys;
 } io;
 
+static unsigned long bus_memory_base = -1;
+
+extern void __sethae (unsigned long);	/* we can't use asm/io.h */
+
 
 static inline unsigned long
 port_to_cpu_addr (unsigned long port, int iosys, int size)
 {
-  if (iosys == IOSYS_JENSEN) {
-    return (port << 7) + ((size - 1) << 4) + io.base;
-  } else {
-    return (port << 5) + ((size - 1) << 3) + io.base;
-  }
+  if (iosys == IOSYS_JENSEN)
+    {
+      return (port << 7) + ((size - 1) << 4) + io.base;
+    }
+  else
+    {
+      return (port << 5) + ((size - 1) << 3) + io.base;
+    }
 }
 
 
 static inline void
 inline_sethae (unsigned long addr, int iosys)
 {
-  if (iosys == IOSYS_JENSEN) {
-    /* hae on the Jensen is bits 31:25 shifted right */
-    addr >>= 25;
-    if (addr != io.hae.cache) {
-	__sethae (addr);
-	io.hae.cache = addr;
+  if (iosys == IOSYS_JENSEN)
+    {
+      /* hae on the Jensen is bits 31:25 shifted right */
+      addr >>= 25;
+      if (addr != io.hae.cache)
+	{
+	  __sethae (addr);
+	  io.hae.cache = addr;
+	}
     }
-  } else {
-    unsigned long msb;
-
-    /* no need to set hae if msb is 0: */
-    msb = addr & 0xf8000000;
-    if (msb && msb != io.hae.cache) {
-	__sethae (msb);
-	io.hae.cache = msb;
+  else
+    {
+      unsigned long msb;
+
+      /* no need to set hae if msb is 0: */
+      msb = addr & 0xf8000000;
+      if (msb && msb != io.hae.cache)
+	{
+	  __sethae (msb);
+	  io.hae.cache = msb;
+	}
     }
-  }
 }
 
 
@@ -263,22 +284,56 @@ struct ioswtch ioswtch[] = {
 };
 
 
+/*
+ * Initialize I/O system.  To determine what I/O system we're dealing
+ * with, we first try to read the value of symlink PATH_ALPHA_SYSTYPE,
+ * if that fails, we lookup the "system type" field in /proc/cpuinfo.
+ * If that fails as well, we give up.
+ */
 static int
 init_iosys (void)
 {
-  char name[256], value[256];
-  FILE * fp;
-  int i;
+  char systype[256];
+  int i, n;
 
-  fp = fopen (PATH_CPUINFO, "r");
-  if (!fp)
-    return -1;
+  n = readlink(PATH_ALPHA_SYSTYPE, systype, sizeof(systype) - 1);
+  if (n > 0)
+    {
+      systype[n] = '\0';
+    }
+  else
+    {
+      char name[256];
+      FILE * fp;
+
+      fp = fopen (PATH_CPUINFO, "r");
+      if (!fp)
+	return -1;
+      while ((n = fscanf (fp, "%256[^:]: %256[^\n]\n", name, systype)) != EOF)
+	{
+	  if (n == 2 && strncmp (name, "system type", 11) == 0) {
+	    break;
+	  }
+	}
+      fclose(fp);
+
+      if (n == EOF)
+	{
+	  /* this can happen if the format of /proc/cpuinfo changes...  */
+	  fprintf(stderr,
+		  "ioperm.init_iosys(): Unable to determine system type.\n"
+		  "\t(May need " PATH_ALPHA_SYSTYPE " symlink?)\n");
+	  errno = ENODEV;
+	  return -1;
+	}
+    }
 
-  while (fscanf (fp, "%256[^:]: %256[^\n]\n", name, value) == 2) {
-    if (strncmp (name, "system type", 11) == 0) {
-      for (i = 0; i < sizeof (platform) / sizeof (platform[0]); ++i) {
-	if (strcmp (platform[i].name, value) == 0) {
-	  fclose (fp);
+  /* translate systype name into i/o system: */
+  for (i = 0; i < sizeof (platform) / sizeof (platform[0]); ++i)
+    {
+      if (strcmp (platform[i].name, systype) == 0)
+	{
+	  bus_memory_base = platform[i].bus_memory_base;
 	  io.sys = platform[i].io_sys;
 	  if (io.sys == IOSYS_JENSEN)
 	    io.swp = &ioswtch[0];
@@ -286,11 +341,10 @@ init_iosys (void)
 	    io.swp = &ioswtch[1];
 	  return 0;
 	}
-      }
     }
-  }
-  fclose (fp);
-  errno = ENODEV;
+
+  /* systype is not a know platform name... */
+  errno = EINVAL;
   return -1;
 }
 
@@ -305,49 +359,55 @@ _ioperm (unsigned long from, unsigned long num, int turn_on)
     return -1;
 
   /* this test isn't as silly as it may look like; consider overflows! */
-  if (from >= MAX_PORT || from + num > MAX_PORT) {
-    errno = EINVAL;
-    return -1;
-  }
+  if (from >= MAX_PORT || from + num > MAX_PORT)
+    {
+      errno = EINVAL;
+      return -1;
+    }
 
-  if (turn_on) {
-    if (!io.base) {
-      unsigned long base;
-      int fd;
-
-      io.hae.reg   = 0;		/* not used in user-level */
-      io.hae.cache = 0;
-      __sethae (io.hae.cache);	/* synchronize with hw */
-
-      fd = open ("/dev/mem", O_RDWR);
-      if (fd < 0)
-	return fd;
-
-      switch (io.sys) {
-      case IOSYS_JENSEN:	base = JENSEN_IO_BASE; break;
-      case IOSYS_APECS:		base = APECS_IO_BASE; break;
-      case IOSYS_ALCOR:		base = ALCOR_IO_BASE; break;
-      default:
-	errno = ENODEV;
-	return -1;
-      }
-      addr  = port_to_cpu_addr (from, io.sys, 1);
-      addr &= PAGE_MASK;
-      len = port_to_cpu_addr (MAX_PORT, io.sys, 1) - addr;
-      io.base =
-	  (unsigned long) __mmap (0, len, PROT_NONE, MAP_SHARED, fd, base);
-      close (fd);
-      if ((long) io.base == -1)
-	return -1;
+  if (turn_on)
+    {
+      if (!io.base)
+	{
+	  unsigned long base;
+	  int fd;
+
+	  io.hae.reg   = 0;		/* not used in user-level */
+	  io.hae.cache = 0;
+	  __sethae (io.hae.cache);	/* synchronize with hw */
+
+	  fd = open ("/dev/mem", O_RDWR);
+	  if (fd < 0)
+	    return fd;
+
+	  switch (io.sys)
+	    {
+	    case IOSYS_JENSEN:	base = JENSEN_IO_BASE; break;
+	    case IOSYS_APECS:	base = APECS_IO_BASE; break;
+	    case IOSYS_ALCOR:	base = ALCOR_IO_BASE; break;
+	    default:
+	      errno = ENODEV;
+	      return -1;
+	    }
+	  addr  = port_to_cpu_addr (from, io.sys, 1);
+	  addr &= PAGE_MASK;
+	  len = port_to_cpu_addr (MAX_PORT, io.sys, 1) - addr;
+	  io.base =
+	    (unsigned long) __mmap (0, len, PROT_NONE, MAP_SHARED, fd, base);
+	  close (fd);
+	  if ((long) io.base == -1)
+	    return -1;
+	}
+      prot = PROT_READ | PROT_WRITE;
     }
-    prot = PROT_READ | PROT_WRITE;
-  } else {
-    if (!io.base)
-      return 0;	/* never was turned on... */
+  else
+    {
+      if (!io.base)
+	return 0;	/* never was turned on... */
 
-    /* turnoff access to relevant pages: */
-    prot = PROT_NONE;
-  }
+      /* turnoff access to relevant pages: */
+      prot = PROT_NONE;
+    }
   addr  = port_to_cpu_addr (from, io.sys, 1);
   addr &= PAGE_MASK;
   len = port_to_cpu_addr (from + num, io.sys, 1) - addr;
@@ -358,13 +418,15 @@ _ioperm (unsigned long from, unsigned long num, int turn_on)
 int
 _iopl (unsigned int level)
 {
-    if (level > 3) {
+    if (level > 3)
+      {
 	errno = EINVAL;
 	return -1;
-    }
-    if (level) {
+      }
+    if (level)
+      {
 	return _ioperm (0, MAX_PORT, 1);
-    }
+      }
     return 0;
 }
 
@@ -430,6 +492,14 @@ _inl (unsigned long port)
 }
 
 
+unsigned long
+_bus_base(void)
+{
+  if (!io.swp && init_iosys () < 0)
+    return -1;
+  return bus_memory_base;
+}
+
 weak_alias (_sethae, sethae);
 weak_alias (_ioperm, ioperm);
 weak_alias (_iopl, iopl);
@@ -439,3 +509,4 @@ weak_alias (_inl, inl);
 weak_alias (_outb, outb);
 weak_alias (_outw, outw);
 weak_alias (_outl, outl);
+weak_alias (_bus_base, bus_base);
diff --git a/sysdeps/unix/sysv/linux/alpha/llseek.S b/sysdeps/unix/sysv/linux/alpha/llseek.S
new file mode 100644
index 0000000000..7f2a49172a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/llseek.S
@@ -0,0 +1,49 @@
+/* Copyright (C) 1993, 1995 Free Software Foundation, Inc.
+   Contributed by David Mosberger (davidm@cs.arizona.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
+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.  */
+
+/* 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. 
+*/
+
+#include <sysdep.h>
+
+	.text
+ENTRY(llseek)
+	.prologue 0
+
+	mov	a3, t0		/* save result address */
+
+	sll	a1, 32, a1	/* build a 64 bit ofs out of 32 bit operands */
+	zap	a2, 0xf0, a2
+	bis	a2, a1, a1
+
+	mov	a4, a2		/* shift down whence */
+
+	ldi	v0, __NR_lseek
+	call_pal PAL_callsys
+	bne	a3, error
+
+	stq	v0, 0(t0)
+	ret
+
+error:	br	gp, 1f
+1:	ldgp	gp, 0(gp)
+	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 f613b08fe0..40958466a4 100644
--- a/sysdeps/unix/sysv/linux/alpha/pipe.S
+++ b/sysdeps/unix/sysv/linux/alpha/pipe.S
@@ -21,7 +21,7 @@ Cambridge, MA 02139, USA.  */
 #include <sysdep.h>
 
 	.text
-ENTRY(__pipe)
+LEAF(__pipe, 0)
 	.prologue 0
 
 	ldi	v0, __NR_pipe
@@ -35,8 +35,7 @@ ENTRY(__pipe)
 
 error:	br	gp, 1f
 1:	ldgp	gp, 0(gp)
-	lda	pv, syscall_error
-	jmp	zero, (pv)
+	jmp	zero, syscall_error
 
 	.end __pipe
 
diff --git a/sysdeps/unix/sysv/linux/alpha/speed.c b/sysdeps/unix/sysv/linux/alpha/speed.c
index b61cfbbfe3..40bf6c50bb 100644
--- a/sysdeps/unix/sysv/linux/alpha/speed.c
+++ b/sysdeps/unix/sysv/linux/alpha/speed.c
@@ -42,6 +42,7 @@ static const speed_t speeds[] =
     57600,
     115200,
     230400,
+    460800,
   };
 
 
diff --git a/sysdeps/unix/sysv/linux/alpha/statbuf.h b/sysdeps/unix/sysv/linux/alpha/statbuf.h
new file mode 100644
index 0000000000..e0e7a8ae37
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/statbuf.h
@@ -0,0 +1,75 @@
+/* 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.  */
+
+#ifndef	_STATBUF_H
+#define	_STATBUF_H
+
+#include <gnu/types.h>
+
+/* Structure describing file characteristics.  */
+struct stat
+  {
+    int st_dev;			/* Device.  */
+    unsigned int st_ino;	/* File serial number.		*/
+    unsigned int st_mode;	/* File mode.  */
+    unsigned int st_nlink;	/* Link count.  */
+    unsigned int st_uid;	/* User ID of the file's owner.	*/
+    unsigned int st_gid;	/* Group ID of the file's group.*/
+    int st_rdev;		/* Device number, if device.  */
+
+    long st_size;		/* Size of file, in bytes.  */
+
+    int st_atime;		/* Time of last access.  */
+    int st_atime_usec;
+    int st_mtime;		/* Time of last modification.  */
+    int st_mtime_usec;
+    int st_ctime;		/* Time of last status change.  */
+    int st_ctime_usec;
+
+    unsigned int st_blksize;	/* Optimal block size for I/O.  */
+#define	_STATBUF_ST_BLKSIZE	/* Tell code we have this member.  */
+
+    int st_blocks;		/* Number of 512-byte blocks allocated.  */
+    unsigned int st_flags;
+    unsigned int st_gen;
+  };
+
+/* Encoding of the file mode.  */
+
+#define	__S_IFMT	0170000	/* These bits determine file type.  */
+
+/* File types.  */
+#define	__S_IFDIR	0040000	/* Directory.  */
+#define	__S_IFCHR	0020000	/* Character device.  */
+#define	__S_IFBLK	0060000	/* Block device.  */
+#define	__S_IFREG	0100000	/* Regular file.  */
+#define	__S_IFIFO	0010000	/* FIFO.  */
+
+#define	__S_IFLNK	0120000	/* Symbolic link.  */
+#define	__S_IFSOCK	0140000	/* Socket.  */
+
+/* Protection bits.  */
+
+#define	__S_ISUID	04000	/* Set user ID on execution.  */
+#define	__S_ISGID	02000	/* Set group ID on execution.  */
+#define	__S_ISVTX	01000	/* Save swapped text after use (sticky).  */
+#define	__S_IREAD	0400	/* Read by owner.  */
+#define	__S_IWRITE	0200	/* Write by owner.  */
+#define	__S_IEXEC	0100	/* Execute by owner.  */
+
+#endif	/* statbuf.h */
diff --git a/sysdeps/unix/sysv/linux/alpha/syscall.S b/sysdeps/unix/sysv/linux/alpha/syscall.S
index 54a8484c58..c80a523239 100644
--- a/sysdeps/unix/sysv/linux/alpha/syscall.S
+++ b/sysdeps/unix/sysv/linux/alpha/syscall.S
@@ -41,21 +41,20 @@ Cambridge, MA 02139, USA.  */
  */
 
 
-1:	br	gp,2f
-2:	ldgp	gp,0(gp)
-	jmp	zero,syscall_error
-
-
-ENTRY (__syscall)
-	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
+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
-	bne	a3,1b
+	bne	a3, error
 	ret
 
+error:	br	gp, 2f
+2:	ldgp	gp, 0(gp)
+	jmp	zero, syscall_error
+
 weak_alias(__syscall, syscall)
diff --git a/sysdeps/unix/sysv/linux/alpha/syscalls.list b/sysdeps/unix/sysv/linux/alpha/syscalls.list
index a842908901..4a52bf2818 100644
--- a/sysdeps/unix/sysv/linux/alpha/syscalls.list
+++ b/sysdeps/unix/sysv/linux/alpha/syscalls.list
@@ -33,13 +33,16 @@ bind		-	bind		3	__bind		bind
 connect		-	connect		3	__connect	connect
 getpeername	-	getpeername	3	__getpeername	getpeername
 getsockname	-	getsockname	3	__getsockname	getsockname
+getsockopt	-	getsockopt	5	__getsockopt	getsockopt
 listen		-	listen		2	__listen	listen
 recv		-	recv		4	__recv		recv
 recvfrom	-	recvfrom	6	__recvfrom	recvfrom
 recvmsg		-	recvmsg		3	__recvmsg	recvmsg
+ptrace		-	ptrace		4	__ptrace	ptrace
 send		-	send		4	__send		send
 sendmsg		-	sendmsg		3	__sendmsg	sendmsg
 sendto		-	sendto		6	__sendto	sendto
 setsockopt	-	setsockopt	5	__setsockopt	setsockopt
 shutdown	-	shutdown	2	__shutdown	shutdown
 socketpair	-	socketpair	4	__socketpair	socketpair
+sysctl		-	_sysctl		6	sysctl
diff --git a/sysdeps/unix/sysv/linux/alpha/sysdep.S b/sysdeps/unix/sysv/linux/alpha/sysdep.S
index 74b153e7b9..84582f404e 100644
--- a/sysdeps/unix/sysv/linux/alpha/sysdep.S
+++ b/sysdeps/unix/sysv/linux/alpha/sysdep.S
@@ -20,11 +20,12 @@ Cambridge, MA 02139, USA.  */
 #define _ERRNO_H
 #include <errnos.h>
 
-ENTRY(syscall_error)
+LEAF(syscall_error, 0)
+	.prologue 1
+
 	/* Store return value in errno... */
 	ldgp	gp, 0(t12)
-	lda	t0, errno
-	stl	v0, 0(t0)
+	stl	v0, errno
 
 	/* And just kick back a -1.  */
 	ldi	v0, -1
diff --git a/sysdeps/unix/sysv/linux/alpha/sysdep.h b/sysdeps/unix/sysv/linux/alpha/sysdep.h
index febfa3a4fb..627b37e4fb 100644
--- a/sysdeps/unix/sysv/linux/alpha/sysdep.h
+++ b/sysdeps/unix/sysv/linux/alpha/sysdep.h
@@ -17,9 +17,6 @@ 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.  */
 
-/* In the Linux ELF and ECOFF worlds, C symbols are asm symbols.  */
-#define NO_UNDERSCORES
-
 #ifdef ASSEMBLER
 
 #include <asm/pal.h>