summaryrefslogtreecommitdiff
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)