aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-07-27 17:55:05 +0000
committerUlrich Drepper <drepper@redhat.com>1998-07-27 17:55:05 +0000
commit3f62b69af3f0f61299ac7bcbc7c3b35cbd16cf4a (patch)
tree325c502561495d94ab29442c1929afd08ac41686 /sysdeps
parent6730873037b6afad1504bb237399c343cce18451 (diff)
downloadglibc-3f62b69af3f0f61299ac7bcbc7c3b35cbd16cf4a.tar
glibc-3f62b69af3f0f61299ac7bcbc7c3b35cbd16cf4a.tar.gz
glibc-3f62b69af3f0f61299ac7bcbc7c3b35cbd16cf4a.tar.bz2
glibc-3f62b69af3f0f61299ac7bcbc7c3b35cbd16cf4a.zip
Update.
1998-07-27 17:42 Ulrich Drepper <drepper@cygnus.com> * nss/nss_files/files-parse.c (INT_FIELD): Use strtoul instead of strtol. (INT_FIELD_MAYBE_NULL): Likewise. * posix/globtest.c: Rewrite for extended test suite. * posix/globtest.sh: More tests. Patch by Brian Wellington <bwelling@anomaly.munge.com>. * stdlib/strtol.c: Don't redefine LONG_MAX, LONG_MIN, and ULONG_MAX. Use new macro. * sysdeps/generic/readv.c: Correct return type. * sysdeps/generic/writev.c: Likewise. 1998-07-24 Gordon Matzigkeit <gord@fig.org> * argp/argp-help.c (_GNU_SOURCE): Define, to suck in program_invocation_name when compiling outside of glibc. 1998-07-26 Philip Blundell <philb@gnu.org> * sysdeps/unix/sysv/linux/arm/siglist.c: New file; ARM tools don't like `@' in .type directives. * sysdeps/libm-ieee754/e_expf.c (__ieee754_expf): Check whether FE_TONEAREST exists for this platform before using it. * sysdeps/libm-ieee754/e_exp.c (__ieee754_exp): Likewise. * sysdeps/arm/dl-machine.h (elf_machine_rel): Delete redundant debugging code. Correct handling of PC24 relocs. * elf/Makefile (ld-map): Only define if versioning is in use. * sysdeps/arm/fpu_control.h: Move to ... * sysdeps/arm/fpu/fpu_control.h: ... here. * sysdeps/generic/fpu_control.h: Made usable as a dummy implementation. * sysdeps/unix/sysv/linux/arm/brk.c: New file. * sysdeps/arm/machine-gmon.h: Improved profiling for ARM. * sysdeps/arm/sysdep.h (CALL_MCOUNT): Replace stub with real implementation. * sysdeps/unix/sysv/linux/arm/clone.S: Likewise. Based on patch from Scott Bambrough and Pat Beirne. * shlib-versions: Add appropriate definitions for ARM machines. * README.template: Mention that Linux/ARM with ELF works now. 1998-07-18 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * Makerules: Generate compilation rules for all object suffixes, not only those currently selected, for sources in the current or object directory. 1998-07-24 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * posix/fnmatch.c (fnmatch): Allow `/' in character class. Don't match `/' in filename by a character class if requested. * posix/testfnm.c: Rewritten. * posix/testfnm.args: Removed. 1998-07-25 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * posix/annexc.c (limits_syms): Add missing symbols. (stdarg_syms): Move va_list to `maybe' list. (stdio_syms): Add FOPEN_MAX.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/arm/dl-machine.h36
-rw-r--r--sysdeps/arm/fpu/fpu_control.h (renamed from sysdeps/arm/fpu_control.h)0
-rw-r--r--sysdeps/arm/machine-gmon.h42
-rw-r--r--sysdeps/arm/sysdep.h8
-rw-r--r--sysdeps/generic/fpu_control.h8
-rw-r--r--sysdeps/generic/readv.c4
-rw-r--r--sysdeps/generic/writev.c4
-rw-r--r--sysdeps/libm-ieee754/e_exp.c2
-rw-r--r--sysdeps/libm-ieee754/e_expf.c2
-rw-r--r--sysdeps/unix/sysv/linux/arm/brk.c49
-rw-r--r--sysdeps/unix/sysv/linux/arm/clone.S36
-rw-r--r--sysdeps/unix/sysv/linux/arm/siglist.c75
12 files changed, 206 insertions, 60 deletions
diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h
index 7612285907..912f7863fb 100644
--- a/sysdeps/arm/dl-machine.h
+++ b/sysdeps/arm/dl-machine.h
@@ -398,35 +398,6 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
break;
case R_ARM_GLOB_DAT:
case R_ARM_JUMP_SLOT:
-
-#if 0
-#define _HEX(i) for (j=28; j>=0; j-=4) b[7-j/4]="0123456789abcdef"[((int)i>>j)&15];
-{
-char b[10];
-int j;
-_HEX(map->l_addr);
-__asm__ (" mov r0, #2; mov r1, %0; mov r2, #9; swi 0x00900004; "
- : : "r"(b) : "r0", "r1", "r2" );
-_HEX(sym->st_size);
-__asm__ (" mov r0, #2; mov r1, %0; mov r2, #9; swi 0x00900004; "
- : : "r"(b) : "r0", "r1", "r2" );
-_HEX(&sym->st_value);
-__asm__ (" mov r0, #2; mov r1, %0; mov r2, #9; swi 0x00900004; "
- : : "r"(b) : "r0", "r1", "r2" );
-_HEX(sym->st_value);
-__asm__ (" mov r0, #2; mov r1, %0; mov r2, #9; swi 0x00900004; "
- : : "r"(b) : "r0", "r1", "r2" );
-_HEX(sym);
-__asm__ (" mov r0, #2; mov r1, %0; mov r2, #9; swi 0x00900004; "
- : : "r"(b) : "r0", "r1", "r2" );
-_HEX(reloc_addr);
-__asm__ (" mov r0, #2; mov r1, %0; mov r2, #9; swi 0x00900004; "
- : : "r"(b) : "r0", "r1", "r2" );
-b[0]=' '; b[1]='\n';
-__asm__ (" mov r0, #2; mov r1, %0; mov r2, #2; swi 0x00900004; "
- : : "r"(b) : "r0", "r1", "r2" );
-}
-#endif
*reloc_addr = value;
break;
case R_ARM_ABS32:
@@ -451,7 +422,12 @@ __asm__ (" mov r0, #2; mov r1, %0; mov r2, #2; swi 0x00900004; "
break;
}
case R_ARM_PC24:
- *reloc_addr += (value - (Elf32_Addr) reloc_addr);
+ {
+ long int disp = (value - (Elf32_Addr) reloc_addr) / 4;
+ if ((disp >= (1<<24)) || (disp <= -(1<<24)))
+ assert (! "address out of range for PC24 reloc");
+ *reloc_addr += disp;
+ }
break;
default:
assert (! "unexpected dynamic reloc type");
diff --git a/sysdeps/arm/fpu_control.h b/sysdeps/arm/fpu/fpu_control.h
index 8a2d338c49..8a2d338c49 100644
--- a/sysdeps/arm/fpu_control.h
+++ b/sysdeps/arm/fpu/fpu_control.h
diff --git a/sysdeps/arm/machine-gmon.h b/sysdeps/arm/machine-gmon.h
index 27643df884..96b4c13c72 100644
--- a/sysdeps/arm/machine-gmon.h
+++ b/sysdeps/arm/machine-gmon.h
@@ -1,5 +1,5 @@
/* Machine-dependent definitions for profiling support. ARM version.
- Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 1998 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
@@ -37,19 +37,29 @@ static void mcount_internal (u_long frompc, u_long selfpc);
#define _MCOUNT_DECL(frompc, selfpc) \
static void mcount_internal (u_long frompc, u_long selfpc)
-#define MCOUNT \
-void _mcount (void) \
-{ \
- register unsigned long int frompc, selfpc; \
- __asm__("movs fp, fp; " \
- "moveq %0, $0; " \
- "ldrne %0, [fp, $-4]; " \
- "ldrne %1, [fp, $-12]; " \
- "movnes %1, %1; " \
- "ldrne %1, [%1, $-4]; " \
- : "=g" (selfpc), "=g" (frompc) \
- : : "cc" \
- ); \
- if (selfpc) \
- mcount_internal(frompc, selfpc); \
+/* This macro/func MUST save r0, r1 because the compiler inserts
+ blind calls to _mount(), ignoring the fact that _mcount may
+ clobber registers; therefore, _mcount may NOT clobber registers */
+/* if (this_fp!=0) {
+ r0 = this_lr
+ r1 = this_fp
+ r1 = [r1-4] which is caller's fp
+ if (r1!=0)
+ r1 = caller's lr
+ call mcount_internal(this_lr, caller's_lr)
+ }
+*/
+#define MCOUNT \
+void _mcount (void) \
+{ \
+ __asm__("stmdb sp!, {r0, r1, r2, r3};" \
+ "movs fp, fp;" \
+ "moveq r0, #0;" \
+ "ldrne r0, [fp, $-4];" \
+ "ldrne r1, [fp, $-12];" \
+ "movnes r1, r1;" \
+ "ldrne r1, [r1, $-4];" \
+ "movs r1, r1;" \
+ "blne mcount_internal;" \
+ "ldmia sp!, {r0, r1, r2, r3}"); \
}
diff --git a/sysdeps/arm/sysdep.h b/sysdeps/arm/sysdep.h
index 4fc90aeed0..13d34c741b 100644
--- a/sysdeps/arm/sysdep.h
+++ b/sysdeps/arm/sysdep.h
@@ -73,10 +73,10 @@
/* If compiled for profiling, call `mcount' at the start of each function. */
#ifdef PROF
-/* The mcount code relies on a normal frame pointer being on the stack
- to locate our caller, so push one just for its benefit. */
-#define CALL_MCOUNT \
-#error Profiling not supported.
+#define CALL_MCOUNT \
+ str lr,[sp, #-4]! \
+ bl PLTJMP(mcount) \
+ ldr lr, [sp], #4
#else
#define CALL_MCOUNT /* Do nothing. */
#endif
diff --git a/sysdeps/generic/fpu_control.h b/sysdeps/generic/fpu_control.h
index e91638d008..4d3d978426 100644
--- a/sysdeps/generic/fpu_control.h
+++ b/sysdeps/generic/fpu_control.h
@@ -20,18 +20,18 @@
#ifndef _FPU_CONTROL_H
#define _FPU_CONTROL_H
-#define _FPU_RESERVED ??? /* These bits are reserved are not changed. */
+#define _FPU_RESERVED 0xffffffff /* These bits are reserved and not changed. */
/* The fdlibm code requires no interrupts for exceptions. Don't
change the rounding mode, it would break long double I/O! */
#define _FPU_DEFAULT 0x00000000 /* Default value. */
/* Type of the control word. */
-typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__?I__)));
+typedef unsigned int fpu_control_t;
/* Macros for accessing the hardware control word. */
-#define _FPU_GETCW(cw) __asm__ ("fetch fpu control word into %0" : "=g" (cw))
-#define _FPU_SETCW(cw) __asm__ ("set fpu control word to %0" : : "g" (cw))
+#define _FPU_GETCW(cw) 0
+#define _FPU_SETCW(cw) do { } while (0)
/* Default control word set at startup. */
extern fpu_control_t __fpu_control;
diff --git a/sysdeps/generic/readv.c b/sysdeps/generic/readv.c
index b210d53552..6be63d9ef3 100644
--- a/sysdeps/generic/readv.c
+++ b/sysdeps/generic/readv.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1995, 1996, 1997, 1998 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
@@ -25,7 +25,7 @@
The buffers are filled in the order specified.
Operates just like `read' (see <unistd.h>) except that data are
put in VECTOR instead of a contiguous buffer. */
-int
+ssize_t
__readv (fd, vector, count)
int fd;
const struct iovec *vector;
diff --git a/sysdeps/generic/writev.c b/sysdeps/generic/writev.c
index fc6bc20095..b53851493d 100644
--- a/sysdeps/generic/writev.c
+++ b/sysdeps/generic/writev.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1995, 1996, 1997, 1998 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
@@ -25,7 +25,7 @@
The data is written in the order specified.
Operates just like `write' (see <unistd.h>) except that the data
are taken from VECTOR instead of a contiguous buffer. */
-int
+ssize_t
__writev (fd, vector, count)
int fd;
const struct iovec *vector;
diff --git a/sysdeps/libm-ieee754/e_exp.c b/sysdeps/libm-ieee754/e_exp.c
index 5eae12a19c..ee0b22f6ae 100644
--- a/sysdeps/libm-ieee754/e_exp.c
+++ b/sysdeps/libm-ieee754/e_exp.c
@@ -91,7 +91,9 @@ __ieee754_exp (double x)
fenv_t oldenv;
feholdexcept (&oldenv);
+#ifdef FE_TONEAREST
fesetround (FE_TONEAREST);
+#endif
/* Calculate n. */
n = x * M_1_LN2 + THREEp51;
diff --git a/sysdeps/libm-ieee754/e_expf.c b/sysdeps/libm-ieee754/e_expf.c
index ff6357bd1d..e8a9c9d874 100644
--- a/sysdeps/libm-ieee754/e_expf.c
+++ b/sysdeps/libm-ieee754/e_expf.c
@@ -87,7 +87,9 @@ __ieee754_expf (float x)
fenv_t oldenv;
feholdexcept (&oldenv);
+#ifdef FE_TONEAREST
fesetround (FE_TONEAREST);
+#endif
/* Calculate n. */
n = x * M_1_LN2 + THREEp22;
diff --git a/sysdeps/unix/sysv/linux/arm/brk.c b/sysdeps/unix/sysv/linux/arm/brk.c
new file mode 100644
index 0000000000..560e5a8337
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arm/brk.c
@@ -0,0 +1,49 @@
+/* brk system call for Linux/ARM.
+ Copyright (C) 1995, 1996 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 <errno.h>
+#include <unistd.h>
+#include <sysdep.h>
+
+/* This must be initialized data because commons can't have aliases. */
+void *__curbrk = 0;
+
+int
+__brk (void *addr)
+{
+ void *newbrk;
+
+ asm ("mov a1, %1\n" /* save the argment in r0 */
+ "swi %2\n" /* do the system call */
+ "mov %0, a1;" /* keep the return value */
+ : "=r"(newbrk)
+ : "r"(addr), "i" (SYS_ify (brk))
+ : "a1");
+
+ __curbrk = newbrk;
+
+ if (newbrk < addr)
+ {
+ __set_errno (ENOMEM);
+ return -1;
+ }
+
+ return 0;
+}
+weak_alias (__brk, brk)
diff --git a/sysdeps/unix/sysv/linux/arm/clone.S b/sysdeps/unix/sysv/linux/arm/clone.S
index 8125ebff20..728d62f3e3 100644
--- a/sysdeps/unix/sysv/linux/arm/clone.S
+++ b/sysdeps/unix/sysv/linux/arm/clone.S
@@ -1,5 +1,6 @@
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
+ Contributed by Pat Beirne <patb@corelcomputer.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
@@ -27,7 +28,38 @@
.text
ENTRY(__clone)
- /* Somebody needs to write this. */
+ @ sanity check args
+ cmp r0, #0
+ cmpne r1, #0
+ moveq r0, #-EINVAL
+ beq PLTJMP(syscall_error)
+
+ @ insert the args onto the new stack
+ sub r1, r1, #8
+ str r3, [r1, #4]
+ @ save the function pointer as the 0th element
+ str r0, [r1]
+
+ @ do the system call
+ @ get flags
+ mov r0, r2
+ @ new sp is already in r1
+ swi SYS_ify(clone)
+ cmp r0, #0
+ blt PLTJMP(syscall_error)
+ beq thread_start
+ @ else, thread was launched...
+ mov pc, lr
+
+thread_start:
+ @ pick the function arg and call address off the stack and execute
+ ldr r0, [sp, #4]
+ mov lr, pc
+ ldr pc, [sp]
+
+ @ and we are done, passing the return value through r0
+ bl PLTJMP(_exit)
+
PSEUDO_END (__clone)
weak_alias (__clone, clone)
diff --git a/sysdeps/unix/sysv/linux/arm/siglist.c b/sysdeps/unix/sysv/linux/arm/siglist.c
new file mode 100644
index 0000000000..9a539604ff
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arm/siglist.c
@@ -0,0 +1,75 @@
+/* Copyright (C) 1997, 1998 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 <stddef.h>
+#include <signal.h>
+#include <sizes.h>
+
+#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+# define SYS_SIGLIST __new_sys_siglist
+# define SYS_SIGABBREV __new_sys_sigabbrev
+#else
+# define SYS_SIGLIST _sys_siglist
+# define SYS_SIGABBREV _sys_sigabbrev
+#endif
+
+#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+asm (".data; .globl __old_sys_siglist; __old_sys_siglist:");
+#endif
+
+const char *const SYS_SIGLIST[NSIG] =
+{
+#define init_sig(sig, abbrev, desc) [sig] desc,
+#include "siglist.h"
+#undef init_sig
+};
+
+#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+asm (".type __old_sys_siglist,%object;.size __old_sys_siglist,"
+ OLD_SIGLIST_SIZE_STR "*" PTR_SIZE_STR);
+
+asm (".data; .globl __old_sys_sigabbrev; __old_sys_sigabbrev:");
+#endif
+
+const char *const SYS_SIGABBREV[NSIG] =
+{
+#define init_sig(sig, abbrev, desc) [sig] abbrev,
+#include "siglist.h"
+#undef init_sig
+};
+
+#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+asm (".type __old_sys_sigabbrev,%object;.size __old_sys_sigabbrev,"
+ OLD_SIGLIST_SIZE_STR "*" PTR_SIZE_STR);
+
+extern const char *const *__old_sys_siglist;
+extern const char *const *__old_sys_sigabbrev;
+
+strong_alias (__old_sys_siglist, _old_sys_siglist)
+symbol_version (__old_sys_siglist, _sys_siglist, GLIBC_2.0);
+symbol_version (_old_sys_siglist, sys_siglist, GLIBC_2.0);
+symbol_version (__old_sys_sigabbrev, sys_sigabbrev, GLIBC_2.0);
+
+strong_alias (__new_sys_siglist, _new_sys_siglist)
+default_symbol_version (__new_sys_siglist, _sys_siglist, GLIBC_2.1);
+default_symbol_version (_new_sys_siglist, sys_siglist, GLIBC_2.1);
+default_symbol_version (__new_sys_sigabbrev, sys_sigabbrev, GLIBC_2.1);
+#else
+weak_alias (_sys_siglist, sys_siglist)
+weak_alias (_sys_sigabbrev, sys_sigabbrev)
+#endif