about summary refs log tree commit diff
path: root/sysdeps/unix
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix')
-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.S (renamed from sysdeps/unix/sysv/linux/alpha/profil-counter.h)43
-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
14 files changed, 372 insertions, 166 deletions
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/profil-counter.h b/sysdeps/unix/sysv/linux/alpha/llseek.S
index 6ab5a88c49..7f2a49172a 100644
--- a/sysdeps/unix/sysv/linux/alpha/profil-counter.h
+++ b/sysdeps/unix/sysv/linux/alpha/llseek.S
@@ -1,7 +1,5 @@
-/* Low-level statistical profiling support function.  Mostly POSIX.1 version.
-Copyright (C) 1996 Free Software Foundation, Inc.
-Contributed by David Mosberger <davidm@azstarnet.com>
-This file is part of the GNU C Library.
+/* 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
@@ -18,11 +16,34 @@ 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>
+/* 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. 
+*/
 
-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);
-}
+#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>