about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r--sysdeps/unix/sysv/linux/if_index.c2
-rw-r--r--sysdeps/unix/sysv/linux/net/if.h5
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/_exit.S26
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/bits/mman.h26
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/brk.S (renamed from sysdeps/unix/sysv/linux/powerpc/brk.c)52
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/clone.S29
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/profil-counter.h14
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/sigreturn.S9
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/socket.S14
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/syscall.S8
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/sysdep.h111
-rw-r--r--sysdeps/unix/sysv/linux/sparc/bits/ioctls.h8
-rw-r--r--sysdeps/unix/sysv/linux/sparc/bits/termios.h10
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S2
14 files changed, 178 insertions, 138 deletions
diff --git a/sysdeps/unix/sysv/linux/if_index.c b/sysdeps/unix/sysv/linux/if_index.c
index c0ffbcedf6..36863db486 100644
--- a/sysdeps/unix/sysv/linux/if_index.c
+++ b/sysdeps/unix/sysv/linux/if_index.c
@@ -26,6 +26,7 @@
 #include <bits/libc-lock.h>
 
 /* Try to get a socket to talk to the kernel.  */
+#if defined SIOGIFINDEX || defined SIOGIFNAME
 static int
 opensock (void)
 {
@@ -63,6 +64,7 @@ opensock (void)
   __libc_lock_unlock (lock);
   return fd;
 }
+#endif
 
 unsigned int
 if_nametoindex (const char *ifname)
diff --git a/sysdeps/unix/sysv/linux/net/if.h b/sysdeps/unix/sysv/linux/net/if.h
index 01e9f00943..f4c1a48579 100644
--- a/sysdeps/unix/sysv/linux/net/if.h
+++ b/sysdeps/unix/sysv/linux/net/if.h
@@ -42,7 +42,10 @@ enum
     IFF_MASTER = 0x400,		/* Master of a load balancer.  */
     IFF_SLAVE = 0x800,		/* Slave of a load balancer.  */
 
-    IFF_MULTICAST = 0x1000	/* Supports multicast.  */
+    IFF_MULTICAST = 0x1000,	/* Supports multicast.  */
+
+    IFF_PORTSEL = 0x2000,	/* Can set media type.  */
+    IFF_AUTOMEDIA = 0x4000	/* Auto media select active.  */
   };
 
 /* The ifaddr structure contains information about one address of an
diff --git a/sysdeps/unix/sysv/linux/powerpc/_exit.S b/sysdeps/unix/sysv/linux/powerpc/_exit.S
deleted file mode 100644
index a1ca375d54..0000000000
--- a/sysdeps/unix/sysv/linux/powerpc/_exit.S
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Copyright (C) 1995, 1996, 1997 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., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
-
-#include <sysdep.h>
-
-/* The 'exit' syscall does not return.  */
-
-	.text
-ENTRY(_exit)
-	DO_CALL (SYS_ify (exit))
-PSEUDO_END (_exit)
diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/mman.h b/sysdeps/unix/sysv/linux/powerpc/bits/mman.h
index da5ad0eb45..6d240c4b7a 100644
--- a/sysdeps/unix/sysv/linux/powerpc/bits/mman.h
+++ b/sysdeps/unix/sysv/linux/powerpc/bits/mman.h
@@ -1,4 +1,4 @@
-/* Definitions for POSIX memory map inerface.  Linux/MIPS version.
+/* Definitions for POSIX memory map inerface.  Linux/PowerPC version.
    Copyright (C) 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -46,26 +46,15 @@
 #define MAP_FIXED	0x010		/* Interpret addr exactly.  */
 #ifdef __USE_MISC
 # define MAP_FILE	0x000
-# define MAP_ANONYMOUS	0x800		/* Don't use a file.  */
+# define MAP_ANONYMOUS	0x020		/* Don't use a file.  */
 # define MAP_ANON	MAP_ANONYMOUS
 #endif
 
-/* Not used by Linux, but here to make sure we don't clash with ABI
-   defines.  */
-#ifdef __USE_MISC
-# define MAP_RENAME	0x020		/* Assign page to file.  */
-# define MAP_AUTOGROW	0x040		/* File may grow by writing.  */
-# define MAP_LOCAL	0x080		/* Copy on fork/sproc.  */
-# define MAP_AUTORSRV	0x100		/* Logical swap reserved on demand.  */
-#endif
-
 /* These are Linux-specific.  */
 #ifdef __USE_MISC
-# define MAP_GROWSDOWN	0x1000		/* Stack-like segment.  */
-# define MAP_DENYWRITE	0x2000		/* ETXTBSY */
-# define MAP_EXECUTABLE	0x4000		/* Mark it as an executable.  */
-# define MAP_LOCKED	0x8000		/* Lock the mapping.  */
-# define MAP_NORESERVE	0x0400		/* Don't check for reservations.  */
+# define MAP_GROWSDOWN	0x0100		/* Stack-like segment.  */
+# define MAP_DENYWRITE	0x0800		/* ETXTBSY */
+# define MAP_EXECUTABLE	0x1000		/* Mark it as an executable.  */
 #endif
 
 /* Flags to `msync'.  */
@@ -74,10 +63,11 @@
 #define MS_INVALIDATE	2		/* Invalidate the caches.  */
 
 /* Flags for `mlockall'.  */
-#define MCL_CURRENT	1		/* Lock all currently mapped pages.  */
-#define MCL_FUTURE	2		/* Lock all additions to address
+#define MCL_CURRENT	0x2000		/* Lock all currently mapped pages.  */
+#define MCL_FUTURE	0x4000		/* Lock all additions to address
 					   space.  */
 
+
 /* Flags for `mremap'.  */
 #ifdef __USE_GNU
 # define MREMAP_MAYMOVE	1
diff --git a/sysdeps/unix/sysv/linux/powerpc/brk.c b/sysdeps/unix/sysv/linux/powerpc/brk.S
index e9826bd098..f4a3f3bcec 100644
--- a/sysdeps/unix/sysv/linux/powerpc/brk.c
+++ b/sysdeps/unix/sysv/linux/powerpc/brk.S
@@ -18,30 +18,32 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <sysdep.h>
-#include <errno.h>
+#define _ERRNO_H	1
+#include <bits/errno.h>
+
+	.comm	__curbrk,4,4
+	.section ".text"
+ENTRY(__brk)
+	stwu    %r1,-16(%r1)
+	stw	%r3,8(%r1)
+	DO_CALL(SYS_ify(brk))
+	lwz     %r6,8(%r1)
+#ifdef PIC
+	mflr    %r4
+	bl      _GLOBAL_OFFSET_TABLE_@local-4
+	mflr    %r5
+	lwz     %r5,__curbrk@got(%r5)
+	mtlr    %r4
+	stw     %r3,0(%r5)
+#else
+	stw     %r3,__curbrk@sdarel(%r13)
+#endif
+	cmplw   %r6,%r3
+	addi    %r1,%r1,16
+	li	%r3,0
+	blelr+
+	li      %r3,ENOMEM
+	b	JUMPTARGET(__syscall_error)
+END (__brk)
 
-void *__curbrk;
-
-int
-__brk (void *addr)
-{
-  register void *syscall_arg asm ("r3") = addr;
-  register int syscall_number asm ("r0") = SYS_ify (brk);
-  register void *newbrk asm ("r3");
-  asm ("sc"
-       : "=r" (newbrk)
-       : "r" (syscall_arg), "r" (syscall_number)
-       : "r4","r5","r6","r7","r8","r9","r10","r11","r12",
-         "ctr", "mq", "cr0", "cr1", "cr6", "cr7");
-
-  __curbrk = newbrk;
-
-  if (newbrk < addr)
-    {
-      __set_errno (ENOMEM);
-      return -1;
-    }
-
-  return 0;
-}
 weak_alias (__brk, brk)
diff --git a/sysdeps/unix/sysv/linux/powerpc/clone.S b/sysdeps/unix/sysv/linux/powerpc/clone.S
index cca63fe0bc..6209922b6b 100644
--- a/sysdeps/unix/sysv/linux/powerpc/clone.S
+++ b/sysdeps/unix/sysv/linux/powerpc/clone.S
@@ -30,13 +30,12 @@
 ENTRY(__clone)
 	/* Set up stack frame, save registers.  */
 	stwu  %r1,-32(%r1)
-	stw   %r31,16(%r1)
-	stw   %r30,20(%r1)
-
 	/* Check for child_stack == NULL || fn == NULL.  */
 	cmpwi %cr0,%r4,0
-	beq-  %cr0,badargs
+	stw   %r31,16(%r1)
 	cmpwi %cr1,%r3,0
+	stw   %r30,20(%r1)
+	beq-  %cr0,badargs
 	beq-  %cr1,badargs
 
 	/* Set up stack frame for child.  */
@@ -45,7 +44,7 @@ ENTRY(__clone)
 	li    %r0,0
 	stw   %r0,0(%r4)
 
-	/* Save new stack, fn, args across syscall.  */
+	/* Save fn, args across syscall.  */
 	mr    %r30,%r3		/* Function in r30.  */
 	mr    %r31,%r6		/* Arguments in r31.  */
 
@@ -70,21 +69,15 @@ child:
 	mr    %r3,%r31
 	blrl
 	/* Call _exit with result from procedure.  */
-#ifdef PIC
-	b _exit@plt
-#else
-	b _exit
-#endif
+	b JUMPTARGET(_exit)
 
 badargs:
-	li 3,-EINVAL
+	li    %r3,EINVAL
 error:
-#ifdef PIC
-	b __syscall_error@plt
-#else
-	b __syscall_error
-#endif
-
-PSEUDO_END (__clone)
+	lwz   %r31,16(%r1)
+	lwz   %r30,20(%r1)
+	addi  %r1,%r1,32
+	b JUMPTARGET(__syscall_error)
+END (__clone)
 
 weak_alias (__clone, clone)
diff --git a/sysdeps/unix/sysv/linux/powerpc/profil-counter.h b/sysdeps/unix/sysv/linux/powerpc/profil-counter.h
index fed0913574..4be6f11270 100644
--- a/sysdeps/unix/sysv/linux/powerpc/profil-counter.h
+++ b/sysdeps/unix/sysv/linux/powerpc/profil-counter.h
@@ -17,10 +17,18 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <signal.h>
+#include <sys/ptrace.h>
+
+/* You can also do this by using
+   void
+   profil_counter (int signo, struct pt_regs *pt)
+   {
+     profil_count ((void *) pt->nip);
+   }
+   */
 
 void
-profil_counter (int signo, struct sigcontext sc)
+profil_counter (int signo, void **regs)
 {
-  profil_count ((void *) sc.regs->nip);
+  profil_count (regs[PT_NIP]);
 }
diff --git a/sysdeps/unix/sysv/linux/powerpc/sigreturn.S b/sysdeps/unix/sysv/linux/powerpc/sigreturn.S
index 748c26761f..9b9413e2f3 100644
--- a/sysdeps/unix/sysv/linux/powerpc/sigreturn.S
+++ b/sysdeps/unix/sysv/linux/powerpc/sigreturn.S
@@ -18,9 +18,6 @@
 
 #include <sysdep.h>
 
-/* The 'sigreturn' syscall does not return.  */
-
-	.text
-ENTRY(__sigreturn)
-	DO_CALL(SYS_ify(sigreturn))
-PSEUDO_END (__sigreturn)
+PSEUDO (__sigreturn, sigreturn, 1)
+	/* Shouldn't get here.  */
+PSEUDO_END(__sigreturn)
diff --git a/sysdeps/unix/sysv/linux/powerpc/socket.S b/sysdeps/unix/sysv/linux/powerpc/socket.S
index 904bca4dc3..681f7e6445 100644
--- a/sysdeps/unix/sysv/linux/powerpc/socket.S
+++ b/sysdeps/unix/sysv/linux/powerpc/socket.S
@@ -71,17 +71,11 @@ ENTRY(P(__,socket))
 #if NARGS >= 9
 #error too many arguments!
 #endif
-	li   %r3,P(SOCKOP_,socket)
-	addi %r4,%r1,stackblock
+	li	%r3,P(SOCKOP_,socket)
+	addi	%r4,%r1,stackblock
 	DO_CALL(SYS_ify(socketcall))
-	addi %r1,%r1,48
-	bnslr
-#ifdef PIC
-	b __syscall_error@plt
-#else
-	b __syscall_error
-#endif
-
+	addi	%r1,%r1,48
+	PSEUDO_RET
 PSEUDO_END (P(__,socket))
 
 weak_alias (P(__,socket), socket)
diff --git a/sysdeps/unix/sysv/linux/powerpc/syscall.S b/sysdeps/unix/sysv/linux/powerpc/syscall.S
index 2cb548245b..4d55076907 100644
--- a/sysdeps/unix/sysv/linux/powerpc/syscall.S
+++ b/sysdeps/unix/sysv/linux/powerpc/syscall.S
@@ -18,7 +18,6 @@
 
 #include <sysdep.h>
 
-	.text
 ENTRY (syscall)
 	mr   %r0,%r3
 	mr   %r3,%r4
@@ -27,10 +26,5 @@ ENTRY (syscall)
 	mr   %r6,%r7
 	mr   %r7,%r8
 	sc
-	bnslr
-#ifdef PIC
-	b __syscall_error@plt
-#else
-	b __syscall_error
-#endif
+	PSEUDO_RET
 PSEUDO_END (syscall)
diff --git a/sysdeps/unix/sysv/linux/powerpc/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/sysdep.h
index 577809acb8..944793d56f 100644
--- a/sysdeps/unix/sysv/linux/powerpc/sysdep.h
+++ b/sysdeps/unix/sysv/linux/powerpc/sysdep.h
@@ -31,32 +31,113 @@
 
 #ifdef ASSEMBLER
 
-#define ENTRY(name)                                                           \
-  .globl name;							              \
-  .type name,@function;						              \
-  .align 2;								      \
+/* This seems to always be the case on PPC.  */
+#define ALIGNARG(log2) log2
+/* For ELF we need the `.type' directive to make shared libs work right.  */
+#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg;
+#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
+
+/* If compiled for profiling, call `_mcount' at the start of each function.  */
+#ifdef	PROF
+/* The mcount code relies on a the return address being on the stack
+   to locate our caller and so it can restore it; so store one just
+   for its benefit.  */
+#ifdef PIC
+#define CALL_MCOUNT							      \
+  .pushsection;								      \
+  .section ".data";    							      \
+  .align ALIGNARG(2);							      \
+0:.long 0;								      \
+  .previous;								      \
+  mflr  %r0;								      \
+  stw   %r0,4(%r1);	       						      \
+  bl    _GLOBAL_OFFSET_TABLE_@local-4;					      \
+  mflr  %r11;								      \
+  lwz   %r0,0b@got(%r11);						      \
+  bl    JUMPTARGET(_mcount);
+#else  /* PIC */
+#define CALL_MCOUNT							      \
+  .section ".data";							      \
+  .align ALIGNARG(2);							      \
+0:.long 0;								      \
+  .previous;								      \
+  mflr  %r0;								      \
+  lis   %r11,0b@ha;		       					      \
+  stw   %r0,4(%r1);	       						      \
+  addi  %r0,%r11,0b@l;							      \
+  bl    JUMPTARGET(_mcount);
+#endif /* PIC */
+#else  /* PROF */
+#define CALL_MCOUNT		/* Do nothing.  */
+#endif /* PROF */
+
+#define	ENTRY(name)							      \
+  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);				      \
+  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
+  .align ALIGNARG(2);							      \
+  C_LABEL(name)								      \
+  CALL_MCOUNT
+
+#define EALIGN_W_0  /* No words to insert.  */
+#define EALIGN_W_1  nop
+#define EALIGN_W_2  nop;nop
+#define EALIGN_W_3  nop;nop;nop
+#define EALIGN_W_4  EALIGN_W_3;nop
+#define EALIGN_W_5  EALIGN_W_4;nop
+#define EALIGN_W_6  EALIGN_W_5;nop
+#define EALIGN_W_7  EALIGN_W_6;nop
+
+/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes
+   past a 2^align boundary.  */
+#ifdef PROF
+#define EALIGN(name, alignt, words)					      \
+  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);				      \
+  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
+  .align ALIGNARG(2);							      \
+  C_LABEL(name)								      \
+  CALL_MCOUNT								      \
+  b 0f;									      \
+  .align ALIGNARG(alignt);						      \
+  EALIGN_W_##words;							      \
+  0:
+#else /* PROF */
+#define EALIGN(name, alignt, words)					      \
+  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);				      \
+  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
+  .align ALIGNARG(alignt);						      \
+  EALIGN_W_##words;							      \
   C_LABEL(name)
+#endif
+
+#undef	END
+#define END(name)							      \
+  ASM_SIZE_DIRECTIVE(name)
 
 #define DO_CALL(syscall)				      		      \
     li 0,syscall;						              \
     sc
 
 #ifdef PIC
+#define JUMPTARGET(name) name##@plt
+#else
+#define JUMPTARGET(name) name
+#endif
+
 #define PSEUDO(name, syscall_name, args)				      \
   .section ".text";							      \
   ENTRY (name)								      \
-    DO_CALL (SYS_ify (syscall_name));					      \
+    DO_CALL (SYS_ify (syscall_name));
+
+#define PSEUDO_RET							      \
     bnslr;								      \
-    b __syscall_error@plt
-#else
-#define PSEUDO(name, syscall_name, args)                                      \
-  .section ".text";							      \
-  ENTRY (name)                                                                \
-    DO_CALL (SYS_ify (syscall_name));				              \
-    bnslr;                                                                    \
-    b __syscall_error
-#endif
+    b JUMPTARGET(__syscall_error)
+#define ret PSEUDO_RET
+
+#undef	PSEUDO_END
+#define	PSEUDO_END(name)						      \
+  END (name)
 
-#define ret	/* Nothing (should be 'blr', but never reached).  */
+/* Local labels stripped out by the linker.  */
+#define L(x) .L##x
 
 #endif	/* ASSEMBLER */
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/ioctls.h b/sysdeps/unix/sysv/linux/sparc/bits/ioctls.h
index 8a14f99f43..46867d8e41 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/ioctls.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/ioctls.h
@@ -33,10 +33,10 @@
 #undef  TCSETS
 #undef  TCSETSW
 #undef  TCSETSF
-#define TCGETS	_IOR ('t', 19, struct __kernel_termios)
-#define TCSETS	_IOW ('t', 20, struct __kernel_termios)
-#define TCSETSW	_IOW ('t', 21, struct __kernel_termios)
-#define TCSETSF	_IOW ('t', 22, struct __kernel_termios)
+#define TCGETS	_IOR ('T', 8, struct __kernel_termios)
+#define TCSETS	_IOW ('T', 9, struct __kernel_termios)
+#define TCSETSW	_IOW ('T', 10, struct __kernel_termios)
+#define TCSETSF	_IOW ('T', 11, struct __kernel_termios)
 
 #include <linux/sockios.h>
 
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/termios.h b/sysdeps/unix/sysv/linux/sparc/bits/termios.h
index bf7aa1480f..54ac773b70 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/termios.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/termios.h
@@ -20,9 +20,9 @@
 #ifndef _SPARC_TERMBITS_H
 #define _SPARC_TERMBITS_H	1
 
-typedef unsigned char   cc_t;
-typedef unsigned int    speed_t;
-typedef unsigned long   tcflag_t;
+typedef unsigned char cc_t;
+typedef unsigned int speed_t;
+typedef unsigned int tcflag_t;
 
 #define NCCS 17
 struct termios
@@ -31,11 +31,11 @@ struct termios
     tcflag_t c_oflag;		/* output mode flags */
     tcflag_t c_cflag;		/* control mode flags */
     tcflag_t c_lflag;		/* local mode flags */
-    cc_t c_line;			/* line discipline */
+    cc_t c_line;		/* line discipline */
     cc_t c_cc[NCCS];		/* control characters */
 #ifdef __KERNEL__
 #define SIZEOF_USER_TERMIOS sizeof (struct termios) - (2*sizeof (cc_t))
-    cc_t _x_cc[2];                  /* We need them to hold vmin/vtime */
+    cc_t _x_cc[2];		/* We need them to hold vmin/vtime */
 #endif
   };
 
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S b/sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S
index c4563776b6..bcc134e09c 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S
@@ -44,3 +44,5 @@ ENTRY(longjmp)
 END(longjmp)
 
 strong_alias(longjmp, __longjmp)
+eak_alias(longjmp, _longjmp)
+weak_alias(longjmp, siglongjmp)