mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-10 07:10:06 +00:00
Move arm port to ports repository
2005-05-23 Roland McGrath <roland@redhat.com> * sysdeps/arm, sysdeps/unix/arm, sysdeps/unix/sysv/linux/arm: Subdirectories moved to ports repository. * configure.in (base_machine): Remove arm* and thumb* patterns. * shlib-versions (arm.*-.*-linux.*): Remove this pattern.
This commit is contained in:
parent
88b8441a81
commit
ce9b3bc17a
@ -1,3 +1,10 @@
|
||||
2005-05-23 Roland McGrath <roland@redhat.com>
|
||||
|
||||
* sysdeps/arm, sysdeps/unix/arm, sysdeps/unix/sysv/linux/arm:
|
||||
Subdirectories moved to ports repository.
|
||||
* configure.in (base_machine): Remove arm* and thumb* patterns.
|
||||
* shlib-versions (arm.*-.*-linux.*): Remove this pattern.
|
||||
|
||||
2005-05-23 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* sunrpc/bindrsvprt.c (LOWPORT): Apparently some mountd
|
||||
|
@ -1,3 +1,8 @@
|
||||
2005-05-23 Roland McGrath <roland@redhat.com>
|
||||
|
||||
* sysdeps/arm, sysdeps/unix/sysv/linux/arm: Subdirectories moved to
|
||||
ports repository.
|
||||
|
||||
2005-05-23 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h
|
||||
|
@ -1,82 +0,0 @@
|
||||
/* POSIX spinlock implementation. Arm version.
|
||||
Copyright (C) 2000 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 Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser 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 <pthread.h>
|
||||
#include "internals.h"
|
||||
|
||||
|
||||
int
|
||||
__pthread_spin_lock (pthread_spinlock_t *lock)
|
||||
{
|
||||
unsigned int val;
|
||||
|
||||
do
|
||||
asm volatile ("swp %0, %1, [%2]"
|
||||
: "=r" (val)
|
||||
: "0" (1), "r" (lock)
|
||||
: "memory");
|
||||
while (val != 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
weak_alias (__pthread_spin_lock, pthread_spin_lock)
|
||||
|
||||
|
||||
int
|
||||
__pthread_spin_trylock (pthread_spinlock_t *lock)
|
||||
{
|
||||
unsigned int val;
|
||||
|
||||
asm volatile ("swp %0, %1, [%2]"
|
||||
: "=r" (val)
|
||||
: "0" (1), "r" (lock)
|
||||
: "memory");
|
||||
|
||||
return val ? EBUSY : 0;
|
||||
}
|
||||
weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
|
||||
|
||||
|
||||
int
|
||||
__pthread_spin_unlock (pthread_spinlock_t *lock)
|
||||
{
|
||||
return *lock = 0;
|
||||
}
|
||||
weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
|
||||
|
||||
|
||||
int
|
||||
__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
|
||||
{
|
||||
/* We can ignore the `pshared' parameter. Since we are busy-waiting
|
||||
all processes which can access the memory location `lock' points
|
||||
to can use the spinlock. */
|
||||
return *lock = 0;
|
||||
}
|
||||
weak_alias (__pthread_spin_init, pthread_spin_init)
|
||||
|
||||
|
||||
int
|
||||
__pthread_spin_destroy (pthread_spinlock_t *lock)
|
||||
{
|
||||
/* Nothing to do. */
|
||||
return 0;
|
||||
}
|
||||
weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
|
@ -1,55 +0,0 @@
|
||||
/* Machine-dependent pthreads configuration and inline functions.
|
||||
ARM version.
|
||||
Copyright (C) 1997, 1998, 2000, 2002, 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Philip Blundell <philb@gnu.org>.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser 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. */
|
||||
|
||||
#ifndef _PT_MACHINE_H
|
||||
#define _PT_MACHINE_H 1
|
||||
|
||||
#ifndef PT_EI
|
||||
# define PT_EI extern inline __attribute__ ((always_inline))
|
||||
#endif
|
||||
|
||||
extern long int testandset (int *spinlock);
|
||||
extern int __compare_and_swap (long int *p, long int oldval, long int newval);
|
||||
|
||||
/* This will not work on ARM1 or ARM2 because SWP is lacking on those
|
||||
machines. Unfortunately we have no way to detect this at compile
|
||||
time; let's hope nobody tries to use one. */
|
||||
|
||||
/* Spinlock implementation; required. */
|
||||
PT_EI long int
|
||||
testandset (int *spinlock)
|
||||
{
|
||||
register unsigned int ret;
|
||||
|
||||
__asm__ __volatile__("swp %0, %1, [%2]"
|
||||
: "=r"(ret)
|
||||
: "0"(1), "r"(spinlock));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* Get some notion of the current stack. Need not be exactly the top
|
||||
of the stack, just something somewhere in the current frame. */
|
||||
#define CURRENT_STACK_FRAME stack_pointer
|
||||
register char * stack_pointer __asm__ ("sp");
|
||||
|
||||
#endif /* pt-machine.h */
|
@ -1,145 +0,0 @@
|
||||
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Phil Blundell <pb@nexus.co.uk>, 2003.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#ifndef __ASSEMBLER__
|
||||
# include <linuxthreads/internals.h>
|
||||
#endif
|
||||
|
||||
#if !defined NOT_IN_libc || defined IS_IN_libpthread
|
||||
|
||||
/* We push lr onto the stack, so we have to use ldmib instead of ldmia
|
||||
to find the saved arguments. */
|
||||
# ifdef PIC
|
||||
# undef DOARGS_5
|
||||
# undef DOARGS_6
|
||||
# undef DOARGS_7
|
||||
# define DOARGS_5 str r4, [sp, $-4]!; ldr r4, [sp, $8];
|
||||
# define DOARGS_6 mov ip, sp; stmfd sp!, {r4, r5}; ldmib ip, {r4, r5};
|
||||
# define DOARGS_7 mov ip, sp; stmfd sp!, {r4, r5, r6}; ldmib ip, {r4, r5, r6};
|
||||
# endif
|
||||
|
||||
# undef PSEUDO_RET
|
||||
# define PSEUDO_RET \
|
||||
ldrcc pc, [sp], $4; \
|
||||
ldr lr, [sp], $4; \
|
||||
b PLTJMP(SYSCALL_ERROR)
|
||||
|
||||
# undef PSEUDO
|
||||
# define PSEUDO(name, syscall_name, args) \
|
||||
.section ".text"; \
|
||||
PSEUDO_PROLOGUE; \
|
||||
ENTRY (name); \
|
||||
SINGLE_THREAD_P_INT; \
|
||||
bne .Lpseudo_cancel; \
|
||||
DO_CALL (syscall_name, args); \
|
||||
cmn r0, $4096; \
|
||||
PSEUDO_RET_MOV; \
|
||||
.Lpseudo_cancel: \
|
||||
MAYBE_SAVE_LR; \
|
||||
DOCARGS_##args; /* save syscall args around CENABLE. */ \
|
||||
CENABLE; \
|
||||
mov ip, r0; /* put mask in safe place. */ \
|
||||
UNDOCARGS_##args; /* restore syscall args. */ \
|
||||
swi SYS_ify (syscall_name); /* do the call. */ \
|
||||
str r0, [sp, $-4]!; /* save syscall return value. */ \
|
||||
mov r0, ip; /* get mask back. */ \
|
||||
CDISABLE; \
|
||||
ldr r0, [sp], $4; /* retrieve return value. */ \
|
||||
UNDOC2ARGS_##args; /* fix register damage. */ \
|
||||
cmn r0, $4096;
|
||||
|
||||
# define DOCARGS_0
|
||||
# define UNDOCARGS_0
|
||||
# define UNDOC2ARGS_0
|
||||
|
||||
# define DOCARGS_1 str r0, [sp, #-4]!;
|
||||
# define UNDOCARGS_1 ldr r0, [sp], #4;
|
||||
# define UNDOC2ARGS_1
|
||||
|
||||
# define DOCARGS_2 str r1, [sp, #-4]!; str r0, [sp, #-4]!;
|
||||
# define UNDOCARGS_2 ldr r0, [sp], #4; ldr r1, [sp], #4;
|
||||
# define UNDOC2ARGS_2
|
||||
|
||||
# define DOCARGS_3 str r2, [sp, #-4]!; str r1, [sp, #-4]!; str r0, [sp, #-4]!;
|
||||
# define UNDOCARGS_3 ldr r0, [sp], #4; ldr r1, [sp], #4; ldr r2, [sp], #4
|
||||
# define UNDOC2ARGS_3
|
||||
|
||||
# define DOCARGS_4 stmfd sp!, {r0-r3}
|
||||
# define UNDOCARGS_4 ldmfd sp!, {r0-r3}
|
||||
# define UNDOC2ARGS_4
|
||||
|
||||
# define DOCARGS_5 stmfd sp!, {r0-r3}
|
||||
# define UNDOCARGS_5 ldmfd sp, {r0-r3}; str r4, [sp, #-4]!; ldr r4, [sp, #24]
|
||||
# define UNDOC2ARGS_5 ldr r4, [sp], #20
|
||||
|
||||
# ifdef IS_IN_libpthread
|
||||
# define CENABLE bl PLTJMP(__pthread_enable_asynccancel)
|
||||
# define CDISABLE bl PLTJMP(__pthread_disable_asynccancel)
|
||||
# define __local_multiple_threads __pthread_multiple_threads
|
||||
# else
|
||||
# define CENABLE bl PLTJMP(__libc_enable_asynccancel)
|
||||
# define CDISABLE bl PLTJMP(__libc_disable_asynccancel)
|
||||
# define __local_multiple_threads __libc_multiple_threads
|
||||
# endif
|
||||
|
||||
# ifndef __ASSEMBLER__
|
||||
extern int __local_multiple_threads attribute_hidden;
|
||||
# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
|
||||
# else
|
||||
# if !defined PIC
|
||||
# define SINGLE_THREAD_P_INT \
|
||||
ldr ip, =__local_multiple_threads; \
|
||||
ldr ip, [ip]; \
|
||||
teq ip, #0;
|
||||
# define SINGLE_THREAD_P SINGLE_THREAD_P_INT
|
||||
# define MAYBE_SAVE_LR \
|
||||
str lr, [sp, $-4]!;
|
||||
# define PSEUDO_RET_MOV \
|
||||
RETINSTR(cc, lr); \
|
||||
b PLTJMP(SYSCALL_ERROR)
|
||||
# define PSEUDO_PROLOGUE
|
||||
# else
|
||||
# define SINGLE_THREAD_P_PIC(reg) \
|
||||
ldr ip, 1b; \
|
||||
ldr reg, 2b; \
|
||||
3: \
|
||||
add ip, pc, ip; \
|
||||
ldr ip, [ip, reg]; \
|
||||
teq ip, #0;
|
||||
# define SINGLE_THREAD_P_INT \
|
||||
str lr, [sp, $-4]!; \
|
||||
SINGLE_THREAD_P_PIC(lr)
|
||||
# define SINGLE_THREAD_P \
|
||||
SINGLE_THREAD_P_INT; \
|
||||
ldr lr, [sp], $4
|
||||
# define PSEUDO_PROLOGUE \
|
||||
1: .word _GLOBAL_OFFSET_TABLE_ - 3f - 8; \
|
||||
2: .word __local_multiple_threads(GOTOFF);
|
||||
# define MAYBE_SAVE_LR /* lr already saved */
|
||||
# define PSEUDO_RET_MOV PSEUDO_RET
|
||||
# endif
|
||||
# endif
|
||||
|
||||
#elif !defined __ASSEMBLER__
|
||||
|
||||
/* This code should never be used but we define it anyhow. */
|
||||
# define SINGLE_THREAD_P (1)
|
||||
|
||||
#endif
|
@ -1,80 +0,0 @@
|
||||
/* Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Philip Blundell <philb@gnu.org>.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdep-cancel.h>
|
||||
#define _ERRNO_H 1
|
||||
#include <bits/errno.h>
|
||||
#include <kernel-features.h>
|
||||
|
||||
/* Clone the calling process, but without copying the whole address space.
|
||||
The calling process is suspended until the new process exits or is
|
||||
replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
|
||||
and the process ID of the new process to the old process. */
|
||||
|
||||
PSEUDO_PROLOGUE
|
||||
|
||||
ENTRY (__vfork)
|
||||
|
||||
#ifdef __NR_vfork
|
||||
|
||||
#ifdef SHARED
|
||||
ldr ip, 1f
|
||||
ldr r0, 2f
|
||||
3: add ip, pc, ip
|
||||
ldr r0, [ip, r0]
|
||||
#else
|
||||
ldr r0, 1f
|
||||
#endif
|
||||
movs r0, r0
|
||||
bne HIDDEN_JUMPTARGET (__fork)
|
||||
|
||||
swi __NR_vfork
|
||||
cmn a1, #4096
|
||||
RETINSTR(cc, lr)
|
||||
|
||||
#ifndef __ASSUME_VFORK_SYSCALL
|
||||
/* Check if vfork syscall is known at all. */
|
||||
cmn a1, #ENOSYS
|
||||
bne PLTJMP(C_SYMBOL_NAME(__syscall_error))
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef __ASSUME_VFORK_SYSCALL
|
||||
/* If we don't have vfork, fork is close enough. */
|
||||
swi __NR_fork
|
||||
cmn a1, #4096
|
||||
RETINSTR(cc, lr)
|
||||
#elif !defined __NR_vfork
|
||||
# error "__NR_vfork not available and __ASSUME_VFORK_SYSCALL defined"
|
||||
#endif
|
||||
b PLTJMP(C_SYMBOL_NAME(__syscall_error))
|
||||
|
||||
#ifdef SHARED
|
||||
1: .word _GLOBAL_OFFSET_TABLE_ - 3b - 8
|
||||
2: .word __libc_pthread_functions(GOTOFF)
|
||||
#else
|
||||
.weak pthread_create
|
||||
1: .word pthread_create
|
||||
#endif
|
||||
|
||||
PSEUDO_END (__vfork)
|
||||
libc_hidden_def (__vfork)
|
||||
|
||||
weak_alias (__vfork, vfork)
|
@ -1,2 +0,0 @@
|
||||
ieee754.h
|
||||
bits/link.h
|
@ -1,3 +0,0 @@
|
||||
wordsize-32
|
||||
ieee754/flt-32
|
||||
ieee754/dbl-64
|
@ -1,33 +0,0 @@
|
||||
/* longjmp for ARM.
|
||||
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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#define _SETJMP_H
|
||||
#define _ASM
|
||||
#include <bits/setjmp.h>
|
||||
|
||||
/* __longjmp(jmpbuf, val) */
|
||||
|
||||
ENTRY (__longjmp)
|
||||
mov ip, r0
|
||||
movs r0, r1 /* get the return value in place */
|
||||
moveq r0, #1 /* can't let setjmp() return zero! */
|
||||
|
||||
LOADREGS(ia, ip, {v1-v6, sl, fp, sp, pc})
|
||||
END (__longjmp)
|
@ -1,87 +0,0 @@
|
||||
/* Low-level functions for atomic operations. ARM version.
|
||||
Copyright (C) 1997, 1998, 1999, 2000 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#ifndef _ATOMICITY_H
|
||||
#define _ATOMICITY_H 1
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
|
||||
static inline int
|
||||
__attribute__ ((unused))
|
||||
exchange_and_add (volatile uint32_t *mem, int val)
|
||||
{
|
||||
int tmp1;
|
||||
int tmp2;
|
||||
int result;
|
||||
__asm__ ("\n"
|
||||
"0:\tldr\t%0,[%3]\n\t"
|
||||
"add\t%1,%0,%4\n\t"
|
||||
"swp\t%2,%1,[%3]\n\t"
|
||||
"cmp\t%0,%2\n\t"
|
||||
"swpne\t%1,%2,[%3]\n\t"
|
||||
"bne\t0b"
|
||||
: "=&r" (result), "=&r" (tmp1), "=&r" (tmp2)
|
||||
: "r" (mem), "r"(val)
|
||||
: "cc", "memory");
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline void
|
||||
__attribute__ ((unused))
|
||||
atomic_add (volatile uint32_t *mem, int val)
|
||||
{
|
||||
int tmp1;
|
||||
int tmp2;
|
||||
int tmp3;
|
||||
__asm__ ("\n"
|
||||
"0:\tldr\t%0,[%3]\n\t"
|
||||
"add\t%1,%0,%4\n\t"
|
||||
"swp\t%2,%1,[%3]\n\t"
|
||||
"cmp\t%0,%2\n\t"
|
||||
"swpne\t%1,%2,[%3]\n\t"
|
||||
"bne\t0b"
|
||||
: "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3)
|
||||
: "r" (mem), "r"(val)
|
||||
: "cc", "memory");
|
||||
}
|
||||
|
||||
static inline int
|
||||
__attribute__ ((unused))
|
||||
compare_and_swap (volatile long int *p, long int oldval, long int newval)
|
||||
{
|
||||
int result, tmp;
|
||||
__asm__ ("\n"
|
||||
"0:\tldr\t%1,[%2]\n\t"
|
||||
"mov\t%0,#0\n\t"
|
||||
"cmp\t%1,%4\n\t"
|
||||
"bne\t1f\n\t"
|
||||
"swp\t%0,%3,[%2]\n\t"
|
||||
"cmp\t%1,%0\n\t"
|
||||
"swpne\t%1,%0,[%2]\n\t"
|
||||
"bne\t0b\n\t"
|
||||
"mov\t%0,#1\n"
|
||||
"1:"
|
||||
: "=&r" (result), "=&r" (tmp)
|
||||
: "r" (p), "r" (newval), "r" (oldval)
|
||||
: "cc", "memory");
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif /* atomicity.h */
|
@ -1,12 +0,0 @@
|
||||
/* ARM is (usually) little-endian but with a big-endian FPU. */
|
||||
|
||||
#ifndef _ENDIAN_H
|
||||
# error "Never use <bits/endian.h> directly; include <endian.h> instead."
|
||||
#endif
|
||||
|
||||
#ifdef __ARMEB__
|
||||
#define __BYTE_ORDER __BIG_ENDIAN
|
||||
#else
|
||||
#define __BYTE_ORDER __LITTLE_ENDIAN
|
||||
#endif
|
||||
#define __FLOAT_WORD_ORDER __BIG_ENDIAN
|
@ -1,56 +0,0 @@
|
||||
/* `HUGE_VAL' constant for IEEE 754 machines (where it is infinity).
|
||||
Used by <stdlib.h> and <math.h> functions for overflow.
|
||||
ARM version.
|
||||
Copyright (C) 1992, 95, 96, 97, 98, 99, 2000, 2004
|
||||
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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#ifndef _MATH_H
|
||||
# error "Never use <bits/huge_val.h> directly; include <math.h> instead."
|
||||
#endif
|
||||
|
||||
/* IEEE positive infinity (-HUGE_VAL is negative infinity). */
|
||||
|
||||
#if __GNUC_PREREQ(3,3)
|
||||
# define HUGE_VAL (__builtin_huge_val())
|
||||
#elif __GNUC_PREREQ(2,96)
|
||||
# define HUGE_VAL (__extension__ 0x1.0p2047)
|
||||
#elif defined __GNUC__
|
||||
|
||||
# define HUGE_VAL \
|
||||
(__extension__ \
|
||||
((union { unsigned __l __attribute__((__mode__(__DI__))); double __d; }) \
|
||||
{ __l: 0x000000007ff00000ULL }).__d)
|
||||
|
||||
#else /* not GCC */
|
||||
|
||||
# include <endian.h>
|
||||
|
||||
typedef union { unsigned char __c[8]; double __d; } __huge_val_t;
|
||||
|
||||
# if __BYTE_ORDER == __BIG_ENDIAN
|
||||
# define __HUGE_VAL_bytes { 0, 0, 0, 0, 0x7f, 0xf0, 0, 0 }
|
||||
# endif
|
||||
# if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
# define __HUGE_VAL_bytes { 0, 0, 0xf0, 0x7f, 0, 0, 0, 0 }
|
||||
# endif
|
||||
|
||||
static __huge_val_t __huge_val = { __HUGE_VAL_bytes };
|
||||
# define HUGE_VAL (__huge_val.__d)
|
||||
|
||||
#endif /* GCC. */
|
@ -1,4 +0,0 @@
|
||||
struct link_map_machine
|
||||
{
|
||||
Elf32_Addr plt; /* Address of .plt */
|
||||
};
|
@ -1,36 +0,0 @@
|
||||
/* 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
/* Define the machine-dependent type `jmp_buf'. ARM version. */
|
||||
|
||||
#ifndef _SETJMP_H
|
||||
# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
|
||||
#endif
|
||||
|
||||
#ifndef _ASM
|
||||
/* Jump buffer contains v1-v6, sl, fp, sp and pc. Other registers are not
|
||||
saved. */
|
||||
typedef int __jmp_buf[10];
|
||||
#endif
|
||||
|
||||
#define __JMP_BUF_SP 8
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame
|
||||
containing a local variable at ADDRESS. */
|
||||
#define _JMPBUF_UNWINDS(jmpbuf, address) \
|
||||
((void *) (address) < (void *) (jmpbuf[__JMP_BUF_SP]))
|
@ -1,31 +0,0 @@
|
||||
/* Optimized, inlined string functions. ARM version.
|
||||
Copyright (C) 1998, 1999, 2000 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#ifndef _STRING_H
|
||||
# error "Never use <bits/string.h> directly; include <string.h> instead."
|
||||
#endif
|
||||
|
||||
/* We must defeat the generic optimized versions of these functions in
|
||||
<bits/string2.h> since they don't work on the ARM. This is because
|
||||
the games they play with the __STRING2_COPY_ARR# structures fail
|
||||
when structs are always 32-bit aligned.
|
||||
XXX Should provide suitably optimal replacements. */
|
||||
#define _HAVE_STRING_ARCH_strcpy 1
|
||||
#define _HAVE_STRING_ARCH_stpcpy 1
|
||||
#define _HAVE_STRING_ARCH_mempcpy 1
|
@ -1,30 +0,0 @@
|
||||
/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. ARM version.
|
||||
Copyright (C) 1997, 1998, 2002 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
/* This just does a tail-call to `__sigsetjmp (ARG, 1)'.
|
||||
We cannot do it in C because it must be a tail-call, so frame-unwinding
|
||||
in setjmp doesn't clobber the state restored by longjmp. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
ENTRY (_setjmp)
|
||||
mov r1, #0
|
||||
b PLTJMP(C_SYMBOL_NAME(__sigsetjmp))
|
||||
END (_setjmp)
|
||||
libc_hidden_def (_setjmp)
|
@ -1,29 +0,0 @@
|
||||
/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. ARM version.
|
||||
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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
/* This just does a tail-call to `__sigsetjmp (ARG, 1)'.
|
||||
We cannot do it in C because it must be a tail-call, so frame-unwinding
|
||||
in setjmp doesn't clobber the state restored by longjmp. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
ENTRY (setjmp)
|
||||
mov r1, #1
|
||||
b PLTJMP(C_SYMBOL_NAME(__sigsetjmp))
|
||||
END (setjmp)
|
@ -1,640 +0,0 @@
|
||||
/* Machine-dependent ELF dynamic relocation inline functions. ARM version.
|
||||
Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005
|
||||
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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#ifndef dl_machine_h
|
||||
#define dl_machine_h
|
||||
|
||||
#define ELF_MACHINE_NAME "ARM"
|
||||
|
||||
#include <sys/param.h>
|
||||
|
||||
#define VALID_ELF_ABIVERSION(ver) (ver == 0)
|
||||
#define VALID_ELF_OSABI(osabi) \
|
||||
(osabi == ELFOSABI_SYSV || osabi == ELFOSABI_ARM)
|
||||
#define VALID_ELF_HEADER(hdr,exp,size) \
|
||||
memcmp (hdr,exp,size-2) == 0 \
|
||||
&& VALID_ELF_OSABI (hdr[EI_OSABI]) \
|
||||
&& VALID_ELF_ABIVERSION (hdr[EI_ABIVERSION])
|
||||
|
||||
#define CLEAR_CACHE(BEG,END) \
|
||||
{ \
|
||||
register unsigned long _beg __asm ("a1") = (unsigned long)(BEG); \
|
||||
register unsigned long _end __asm ("a2") = (unsigned long)(END); \
|
||||
register unsigned long _flg __asm ("a3") = 0; \
|
||||
__asm __volatile ("swi 0x9f0002 @ sys_cacheflush" \
|
||||
: /* no outputs */ \
|
||||
: /* no inputs */ \
|
||||
: "a1"); \
|
||||
}
|
||||
|
||||
/* Return nonzero iff ELF header is compatible with the running host. */
|
||||
static inline int __attribute__ ((unused))
|
||||
elf_machine_matches_host (const Elf32_Ehdr *ehdr)
|
||||
{
|
||||
return ehdr->e_machine == EM_ARM;
|
||||
}
|
||||
|
||||
|
||||
/* Return the link-time address of _DYNAMIC. Conveniently, this is the
|
||||
first element of the GOT. This must be inlined in a function which
|
||||
uses global data. */
|
||||
static inline Elf32_Addr __attribute__ ((unused))
|
||||
elf_machine_dynamic (void)
|
||||
{
|
||||
register Elf32_Addr *got asm ("r10");
|
||||
return *got;
|
||||
}
|
||||
|
||||
|
||||
/* Return the run-time load address of the shared object. */
|
||||
static inline Elf32_Addr __attribute__ ((unused))
|
||||
elf_machine_load_address (void)
|
||||
{
|
||||
extern void __dl_start asm ("_dl_start");
|
||||
Elf32_Addr got_addr = (Elf32_Addr) &__dl_start;
|
||||
Elf32_Addr pcrel_addr;
|
||||
asm ("adr %0, _dl_start" : "=r" (pcrel_addr));
|
||||
return pcrel_addr - got_addr;
|
||||
}
|
||||
|
||||
|
||||
/* Set up the loaded object described by L so its unrelocated PLT
|
||||
entries will jump to the on-demand fixup code in dl-runtime.c. */
|
||||
|
||||
static inline int __attribute__ ((unused))
|
||||
elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
||||
{
|
||||
Elf32_Addr *got;
|
||||
extern void _dl_runtime_resolve (Elf32_Word);
|
||||
extern void _dl_runtime_profile (Elf32_Word);
|
||||
|
||||
if (l->l_info[DT_JMPREL] && lazy)
|
||||
{
|
||||
/* patb: this is different than i386 */
|
||||
/* The GOT entries for functions in the PLT have not yet been filled
|
||||
in. Their initial contents will arrange when called to push an
|
||||
index into the .got section, load ip with &_GLOBAL_OFFSET_TABLE_[3],
|
||||
and then jump to _GLOBAL_OFFSET_TABLE[2]. */
|
||||
got = (Elf32_Addr *) D_PTR (l, l_info[DT_PLTGOT]);
|
||||
/* If a library is prelinked but we have to relocate anyway,
|
||||
we have to be able to undo the prelinking of .got.plt.
|
||||
The prelinker saved us here address of .plt. */
|
||||
if (got[1])
|
||||
l->l_mach.plt = got[1] + l->l_addr;
|
||||
got[1] = (Elf32_Addr) l; /* Identify this shared object. */
|
||||
|
||||
/* The got[2] entry contains the address of a function which gets
|
||||
called to get the address of a so far unresolved function and
|
||||
jump to it. The profiling extension of the dynamic linker allows
|
||||
to intercept the calls to collect information. In this case we
|
||||
don't store the address in the GOT so that all future calls also
|
||||
end in this function. */
|
||||
if (profile)
|
||||
{
|
||||
got[2] = (Elf32_Addr) &_dl_runtime_profile;
|
||||
|
||||
if (_dl_name_match_p (GLRO(dl_profile), l))
|
||||
/* Say that we really want profiling and the timers are
|
||||
started. */
|
||||
GL(dl_profile_map) = l;
|
||||
}
|
||||
else
|
||||
/* This function will get called to fix up the GOT entry indicated by
|
||||
the offset on the stack, and then jump to the resolved address. */
|
||||
got[2] = (Elf32_Addr) &_dl_runtime_resolve;
|
||||
}
|
||||
return lazy;
|
||||
}
|
||||
|
||||
#if defined(__USE_BX__)
|
||||
#define BX(x) "bx\t" #x
|
||||
#else
|
||||
#define BX(x) "mov\tpc, " #x
|
||||
#endif
|
||||
|
||||
#ifndef PROF
|
||||
# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
|
||||
.text\n\
|
||||
.globl _dl_runtime_resolve\n\
|
||||
.type _dl_runtime_resolve, #function\n\
|
||||
.align 2\n\
|
||||
_dl_runtime_resolve:\n\
|
||||
@ we get called with\n\
|
||||
@ stack[0] contains the return address from this call\n\
|
||||
@ ip contains &GOT[n+3] (pointer to function)\n\
|
||||
@ lr points to &GOT[2]\n\
|
||||
\n\
|
||||
@ stack arguments\n\
|
||||
stmdb sp!,{r0-r3}\n\
|
||||
\n\
|
||||
@ get pointer to linker struct\n\
|
||||
ldr r0, [lr, #-4]\n\
|
||||
\n\
|
||||
@ prepare to call fixup()\n\
|
||||
@ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each\n\
|
||||
sub r1, ip, lr\n\
|
||||
sub r1, r1, #4\n\
|
||||
add r1, r1, r1\n\
|
||||
\n\
|
||||
@ call fixup routine\n\
|
||||
bl fixup\n\
|
||||
\n\
|
||||
@ save the return\n\
|
||||
mov ip, r0\n\
|
||||
\n\
|
||||
@ get arguments and return address back\n\
|
||||
ldmia sp!, {r0-r3,lr}\n\
|
||||
\n\
|
||||
@ jump to the newly found address\n\
|
||||
" BX(ip) "\n\
|
||||
\n\
|
||||
.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
|
||||
\n\
|
||||
.globl _dl_runtime_profile\n\
|
||||
.type _dl_runtime_profile, #function\n\
|
||||
.align 2\n\
|
||||
_dl_runtime_profile:\n\
|
||||
@ stack arguments\n\
|
||||
stmdb sp!, {r0-r3}\n\
|
||||
\n\
|
||||
@ get pointer to linker struct\n\
|
||||
ldr r0, [lr, #-4]\n\
|
||||
\n\
|
||||
@ prepare to call fixup()\n\
|
||||
@ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each\n\
|
||||
sub r1, ip, lr\n\
|
||||
sub r1, r1, #4\n\
|
||||
add r1, r1, r1\n\
|
||||
\n\
|
||||
@ call profiling fixup routine\n\
|
||||
bl profile_fixup\n\
|
||||
\n\
|
||||
@ save the return\n\
|
||||
mov ip, r0\n\
|
||||
\n\
|
||||
@ get arguments and return address back\n\
|
||||
ldmia sp!, {r0-r3,lr}\n\
|
||||
\n\
|
||||
@ jump to the newly found address\n\
|
||||
" BX(ip) "\n\
|
||||
\n\
|
||||
.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
|
||||
.previous\n\
|
||||
");
|
||||
#else // PROF
|
||||
# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
|
||||
.text\n\
|
||||
.globl _dl_runtime_resolve\n\
|
||||
.globl _dl_runtime_profile\n\
|
||||
.type _dl_runtime_resolve, #function\n\
|
||||
.type _dl_runtime_profile, #function\n\
|
||||
.align 2\n\
|
||||
_dl_runtime_resolve:\n\
|
||||
_dl_runtime_profile:\n\
|
||||
@ we get called with\n\
|
||||
@ stack[0] contains the return address from this call\n\
|
||||
@ ip contains &GOT[n+3] (pointer to function)\n\
|
||||
@ lr points to &GOT[2]\n\
|
||||
\n\
|
||||
@ stack arguments\n\
|
||||
stmdb sp!, {r0-r3}\n\
|
||||
\n\
|
||||
@ get pointer to linker struct\n\
|
||||
ldr r0, [lr, #-4]\n\
|
||||
\n\
|
||||
@ prepare to call fixup()\n\
|
||||
@ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each\n\
|
||||
sub r1, ip, lr\n\
|
||||
sub r1, r1, #4\n\
|
||||
add r1, r1, r1\n\
|
||||
\n\
|
||||
@ call profiling fixup routine\n\
|
||||
bl fixup\n\
|
||||
\n\
|
||||
@ save the return\n\
|
||||
mov ip, r0\n\
|
||||
\n\
|
||||
@ get arguments and return address back\n\
|
||||
ldmia sp!, {r0-r3,lr}\n\
|
||||
\n\
|
||||
@ jump to the newly found address\n\
|
||||
" BX(ip) "\n\
|
||||
\n\
|
||||
.size _dl_runtime_profile, .-_dl_runtime_profile\n\
|
||||
.previous\n\
|
||||
");
|
||||
#endif //PROF
|
||||
|
||||
/* Mask identifying addresses reserved for the user program,
|
||||
where the dynamic linker should not map anything. */
|
||||
#define ELF_MACHINE_USER_ADDRESS_MASK 0xf8000000UL
|
||||
|
||||
/* Initial entry point code for the dynamic linker.
|
||||
The C function `_dl_start' is the real entry point;
|
||||
its return value is the user program's entry point. */
|
||||
|
||||
#define RTLD_START asm ("\
|
||||
.text\n\
|
||||
.globl _start\n\
|
||||
.globl _dl_start_user\n\
|
||||
_start:\n\
|
||||
@ we are PIC code, so get global offset table\n\
|
||||
ldr sl, .L_GET_GOT\n\
|
||||
@ See if we were run as a command with the executable file\n\
|
||||
@ name as an extra leading argument.\n\
|
||||
ldr r4, .L_SKIP_ARGS\n\
|
||||
@ at start time, all the args are on the stack\n\
|
||||
mov r0, sp\n\
|
||||
bl _dl_start\n\
|
||||
@ returns user entry point in r0\n\
|
||||
_dl_start_user:\n\
|
||||
add sl, pc, sl\n\
|
||||
.L_GOT_GOT:\n\
|
||||
ldr r4, [sl, r4]\n\
|
||||
@ get the original arg count\n\
|
||||
ldr r1, [sp]\n\
|
||||
@ save the entry point in another register\n\
|
||||
mov r6, r0\n\
|
||||
@ adjust the stack pointer to skip the extra args\n\
|
||||
add sp, sp, r4, lsl #2\n\
|
||||
@ subtract _dl_skip_args from original arg count\n\
|
||||
sub r1, r1, r4\n\
|
||||
@ get the argv address\n\
|
||||
add r2, sp, #4\n\
|
||||
@ store the new argc in the new stack location\n\
|
||||
str r1, [sp]\n\
|
||||
@ compute envp\n\
|
||||
add r3, r2, r1, lsl #2\n\
|
||||
add r3, r3, #4\n\
|
||||
\n\
|
||||
@ now we call _dl_init\n\
|
||||
ldr r0, .L_LOADED\n\
|
||||
ldr r0, [sl, r0]\n\
|
||||
@ call _dl_init\n\
|
||||
bl _dl_init_internal(PLT)\n\
|
||||
@ load the finalizer function\n\
|
||||
ldr r0, .L_FINI_PROC\n\
|
||||
add r0, sl, r0\n\
|
||||
@ jump to the user_s entry point\n\
|
||||
" BX(r6) "\n\
|
||||
.L_GET_GOT:\n\
|
||||
.word _GLOBAL_OFFSET_TABLE_ - .L_GOT_GOT - 4\n\
|
||||
.L_SKIP_ARGS:\n\
|
||||
.word _dl_skip_args(GOTOFF)\n\
|
||||
.L_FINI_PROC:\n\
|
||||
.word _dl_fini(GOTOFF)\n\
|
||||
.L_LOADED:\n\
|
||||
.word _rtld_local(GOTOFF)\n\
|
||||
.previous\n\
|
||||
");
|
||||
|
||||
/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
|
||||
PLT entries should not be allowed to define the value.
|
||||
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
|
||||
of the main executable's symbols, as for a COPY reloc. */
|
||||
#define elf_machine_type_class(type) \
|
||||
((((type) == R_ARM_JUMP_SLOT) * ELF_RTYPE_CLASS_PLT) \
|
||||
| (((type) == R_ARM_COPY) * ELF_RTYPE_CLASS_COPY))
|
||||
|
||||
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
||||
#define ELF_MACHINE_JMP_SLOT R_ARM_JUMP_SLOT
|
||||
|
||||
/* ARM never uses Elf32_Rela relocations for the dynamic linker.
|
||||
Prelinked libraries may use Elf32_Rela though. */
|
||||
#define ELF_MACHINE_PLT_REL 1
|
||||
|
||||
/* We define an initialization functions. This is called very early in
|
||||
_dl_sysdep_start. */
|
||||
#define DL_PLATFORM_INIT dl_platform_init ()
|
||||
|
||||
static inline void __attribute__ ((unused))
|
||||
dl_platform_init (void)
|
||||
{
|
||||
if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0')
|
||||
/* Avoid an empty string which would disturb us. */
|
||||
GLRO(dl_platform) = NULL;
|
||||
}
|
||||
|
||||
static inline Elf32_Addr
|
||||
elf_machine_fixup_plt (struct link_map *map, lookup_t t,
|
||||
const Elf32_Rel *reloc,
|
||||
Elf32_Addr *reloc_addr, Elf32_Addr value)
|
||||
{
|
||||
return *reloc_addr = value;
|
||||
}
|
||||
|
||||
/* Return the final value of a plt relocation. */
|
||||
static inline Elf32_Addr
|
||||
elf_machine_plt_value (struct link_map *map, const Elf32_Rel *reloc,
|
||||
Elf32_Addr value)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
#endif /* !dl_machine_h */
|
||||
|
||||
|
||||
/* ARM never uses Elf32_Rela relocations for the dynamic linker.
|
||||
Prelinked libraries may use Elf32_Rela though. */
|
||||
#define ELF_MACHINE_NO_RELA defined RTLD_BOOTSTRAP
|
||||
|
||||
#ifdef RESOLVE
|
||||
|
||||
/* Deal with an out-of-range PC24 reloc. */
|
||||
static Elf32_Addr
|
||||
fix_bad_pc24 (Elf32_Addr *const reloc_addr, Elf32_Addr value)
|
||||
{
|
||||
static void *fix_page;
|
||||
static unsigned int fix_offset;
|
||||
static size_t pagesize;
|
||||
Elf32_Word *fix_address;
|
||||
|
||||
if (! fix_page)
|
||||
{
|
||||
if (! pagesize)
|
||||
pagesize = getpagesize ();
|
||||
fix_page = mmap (NULL, pagesize, PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
if (! fix_page)
|
||||
assert (! "could not map page for fixup");
|
||||
fix_offset = 0;
|
||||
}
|
||||
|
||||
fix_address = (Elf32_Word *)(fix_page + fix_offset);
|
||||
fix_address[0] = 0xe51ff004; /* ldr pc, [pc, #-4] */
|
||||
fix_address[1] = value;
|
||||
|
||||
fix_offset += 8;
|
||||
if (fix_offset >= pagesize)
|
||||
fix_page = NULL;
|
||||
|
||||
return (Elf32_Addr)fix_address;
|
||||
}
|
||||
|
||||
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
|
||||
MAP is the object containing the reloc. */
|
||||
|
||||
auto inline void
|
||||
__attribute__ ((always_inline))
|
||||
elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
||||
const Elf32_Sym *sym, const struct r_found_version *version,
|
||||
void *const reloc_addr_arg)
|
||||
{
|
||||
Elf32_Addr *const reloc_addr = reloc_addr_arg;
|
||||
const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
|
||||
|
||||
#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
|
||||
if (__builtin_expect (r_type == R_ARM_RELATIVE, 0))
|
||||
{
|
||||
# if !defined RTLD_BOOTSTRAP && !defined HAVE_Z_COMBRELOC
|
||||
/* This is defined in rtld.c, but nowhere in the static libc.a;
|
||||
make the reference weak so static programs can still link.
|
||||
This declaration cannot be done when compiling rtld.c
|
||||
(i.e. #ifdef RTLD_BOOTSTRAP) because rtld.c contains the
|
||||
common defn for _dl_rtld_map, which is incompatible with a
|
||||
weak decl in the same file. */
|
||||
# ifndef SHARED
|
||||
weak_extern (_dl_rtld_map);
|
||||
# endif
|
||||
if (map != &GL(dl_rtld_map)) /* Already done in rtld itself. */
|
||||
# endif
|
||||
*reloc_addr += map->l_addr;
|
||||
}
|
||||
# ifndef RTLD_BOOTSTRAP
|
||||
else if (__builtin_expect (r_type == R_ARM_NONE, 0))
|
||||
return;
|
||||
# endif
|
||||
else
|
||||
#endif
|
||||
{
|
||||
const Elf32_Sym *const refsym = sym;
|
||||
Elf32_Addr value = RESOLVE (&sym, version, r_type);
|
||||
if (sym)
|
||||
value += sym->st_value;
|
||||
|
||||
switch (r_type)
|
||||
{
|
||||
case R_ARM_COPY:
|
||||
if (sym == NULL)
|
||||
/* This can happen in trace mode if an object could not be
|
||||
found. */
|
||||
break;
|
||||
if (sym->st_size > refsym->st_size
|
||||
|| (GLRO(dl_verbose) && sym->st_size < refsym->st_size))
|
||||
{
|
||||
const char *strtab;
|
||||
|
||||
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
||||
_dl_error_printf ("\
|
||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||
rtld_progname ?: "<program name unknown>",
|
||||
strtab + refsym->st_name);
|
||||
}
|
||||
memcpy (reloc_addr_arg, (void *) value,
|
||||
MIN (sym->st_size, refsym->st_size));
|
||||
break;
|
||||
case R_ARM_GLOB_DAT:
|
||||
case R_ARM_JUMP_SLOT:
|
||||
# ifdef RTLD_BOOTSTRAP
|
||||
/* Fix weak undefined references. */
|
||||
if (sym != NULL && sym->st_value == 0)
|
||||
*reloc_addr = 0;
|
||||
else
|
||||
# endif
|
||||
*reloc_addr = value;
|
||||
break;
|
||||
case R_ARM_ABS32:
|
||||
{
|
||||
# ifndef RTLD_BOOTSTRAP
|
||||
/* This is defined in rtld.c, but nowhere in the static
|
||||
libc.a; make the reference weak so static programs can
|
||||
still link. This declaration cannot be done when
|
||||
compiling rtld.c (i.e. #ifdef RTLD_BOOTSTRAP) because
|
||||
rtld.c contains the common defn for _dl_rtld_map, which
|
||||
is incompatible with a weak decl in the same file. */
|
||||
# ifndef SHARED
|
||||
weak_extern (_dl_rtld_map);
|
||||
# endif
|
||||
if (map == &GL(dl_rtld_map))
|
||||
/* Undo the relocation done here during bootstrapping.
|
||||
Now we will relocate it anew, possibly using a
|
||||
binding found in the user program or a loaded library
|
||||
rather than the dynamic linker's built-in definitions
|
||||
used while loading those libraries. */
|
||||
value -= map->l_addr + refsym->st_value;
|
||||
# endif
|
||||
*reloc_addr += value;
|
||||
break;
|
||||
}
|
||||
case R_ARM_PC24:
|
||||
{
|
||||
Elf32_Sword addend;
|
||||
Elf32_Addr newvalue, topbits;
|
||||
|
||||
addend = *reloc_addr & 0x00ffffff;
|
||||
if (addend & 0x00800000) addend |= 0xff000000;
|
||||
|
||||
newvalue = value - (Elf32_Addr)reloc_addr + (addend << 2);
|
||||
topbits = newvalue & 0xfe000000;
|
||||
if (topbits != 0xfe000000 && topbits != 0x00000000)
|
||||
{
|
||||
newvalue = fix_bad_pc24(reloc_addr, value)
|
||||
- (Elf32_Addr)reloc_addr + (addend << 2);
|
||||
topbits = newvalue & 0xfe000000;
|
||||
if (topbits != 0xfe000000 && topbits != 0x00000000)
|
||||
{
|
||||
_dl_signal_error (0, map->l_name, NULL,
|
||||
"R_ARM_PC24 relocation out of range");
|
||||
}
|
||||
}
|
||||
newvalue >>= 2;
|
||||
value = (*reloc_addr & 0xff000000) | (newvalue & 0x00ffffff);
|
||||
*reloc_addr = value;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
_dl_reloc_bad_type (map, r_type, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# ifndef RTLD_BOOTSTRAP
|
||||
auto inline void
|
||||
__attribute__ ((always_inline))
|
||||
elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
||||
const Elf32_Sym *sym, const struct r_found_version *version,
|
||||
void *const reloc_addr_arg)
|
||||
{
|
||||
Elf32_Addr *const reloc_addr = reloc_addr_arg;
|
||||
const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
|
||||
|
||||
if (__builtin_expect (r_type == R_ARM_RELATIVE, 0))
|
||||
*reloc_addr = map->l_addr + reloc->r_addend;
|
||||
else if (__builtin_expect (r_type == R_ARM_NONE, 0))
|
||||
return;
|
||||
else
|
||||
{
|
||||
# ifndef RESOLVE_CONFLICT_FIND_MAP
|
||||
const Elf32_Sym *const refsym = sym;
|
||||
# endif
|
||||
Elf32_Addr value = RESOLVE (&sym, version, r_type);
|
||||
if (sym)
|
||||
value += sym->st_value;
|
||||
|
||||
switch (r_type)
|
||||
{
|
||||
# ifndef RESOLVE_CONFLICT_FIND_MAP
|
||||
/* Not needed for dl-conflict.c. */
|
||||
case R_ARM_COPY:
|
||||
if (sym == NULL)
|
||||
/* This can happen in trace mode if an object could not be
|
||||
found. */
|
||||
break;
|
||||
if (sym->st_size > refsym->st_size
|
||||
|| (GLRO(dl_verbose) && sym->st_size < refsym->st_size))
|
||||
{
|
||||
const char *strtab;
|
||||
|
||||
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
||||
_dl_error_printf ("\
|
||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||
rtld_progname ?: "<program name unknown>",
|
||||
strtab + refsym->st_name);
|
||||
}
|
||||
memcpy (reloc_addr_arg, (void *) value,
|
||||
MIN (sym->st_size, refsym->st_size));
|
||||
break;
|
||||
# endif /* !RESOLVE_CONFLICT_FIND_MAP */
|
||||
case R_ARM_GLOB_DAT:
|
||||
case R_ARM_JUMP_SLOT:
|
||||
case R_ARM_ABS32:
|
||||
*reloc_addr = value + reloc->r_addend;
|
||||
break;
|
||||
case R_ARM_PC24:
|
||||
{
|
||||
Elf32_Addr newvalue, topbits;
|
||||
|
||||
newvalue = value + reloc->r_addend - (Elf32_Addr)reloc_addr;
|
||||
topbits = newvalue & 0xfe000000;
|
||||
if (topbits != 0xfe000000 && topbits != 0x00000000)
|
||||
{
|
||||
newvalue = fix_bad_pc24(reloc_addr, value)
|
||||
- (Elf32_Addr)reloc_addr + (reloc->r_addend << 2);
|
||||
topbits = newvalue & 0xfe000000;
|
||||
if (topbits != 0xfe000000 && topbits != 0x00000000)
|
||||
{
|
||||
_dl_signal_error (0, map->l_name, NULL,
|
||||
"R_ARM_PC24 relocation out of range");
|
||||
}
|
||||
}
|
||||
newvalue >>= 2;
|
||||
value = (*reloc_addr & 0xff000000) | (newvalue & 0x00ffffff);
|
||||
*reloc_addr = value;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
_dl_reloc_bad_type (map, r_type, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
# endif
|
||||
|
||||
auto inline void
|
||||
__attribute__ ((always_inline))
|
||||
elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
|
||||
void *const reloc_addr_arg)
|
||||
{
|
||||
Elf32_Addr *const reloc_addr = reloc_addr_arg;
|
||||
*reloc_addr += l_addr;
|
||||
}
|
||||
|
||||
# ifndef RTLD_BOOTSTRAP
|
||||
auto inline void
|
||||
__attribute__ ((always_inline))
|
||||
elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
|
||||
void *const reloc_addr_arg)
|
||||
{
|
||||
Elf32_Addr *const reloc_addr = reloc_addr_arg;
|
||||
*reloc_addr = l_addr + reloc->r_addend;
|
||||
}
|
||||
# endif
|
||||
|
||||
auto inline void
|
||||
__attribute__ ((always_inline))
|
||||
elf_machine_lazy_rel (struct link_map *map,
|
||||
Elf32_Addr l_addr, const Elf32_Rel *reloc)
|
||||
{
|
||||
Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
|
||||
const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
|
||||
/* Check for unexpected PLT reloc type. */
|
||||
if (__builtin_expect (r_type == R_ARM_JUMP_SLOT, 1))
|
||||
{
|
||||
if (__builtin_expect (map->l_mach.plt, 0) == 0)
|
||||
*reloc_addr += l_addr;
|
||||
else
|
||||
*reloc_addr = map->l_mach.plt;
|
||||
}
|
||||
else
|
||||
_dl_reloc_bad_type (map, r_type, 1);
|
||||
}
|
||||
|
||||
#endif /* RESOLVE */
|
@ -1,102 +0,0 @@
|
||||
/* Startup code for ARM & ELF
|
||||
Copyright (C) 1995, 1996, 1997, 1998, 2001, 2002 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
In addition to the permissions in the GNU Lesser General Public
|
||||
License, the Free Software Foundation gives you unlimited
|
||||
permission to link the compiled version of this file with other
|
||||
programs, and to distribute those programs without any restriction
|
||||
coming from the use of this file. (The GNU Lesser General Public
|
||||
License restrictions do apply in other respects; for example, they
|
||||
cover modification of the file, and distribution when not linked
|
||||
into another program.)
|
||||
|
||||
Note that people who make modified versions of this file are not
|
||||
obligated to grant this special exception for their modified
|
||||
versions; it is their choice whether to do so. The GNU Lesser
|
||||
General Public License gives permission to release a modified
|
||||
version without this exception; this exception also makes it
|
||||
possible to release a modified version which carries forward this
|
||||
exception.
|
||||
|
||||
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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
/* This is the canonical entry point, usually the first thing in the text
|
||||
segment.
|
||||
|
||||
Note that the code in the .init section has already been run.
|
||||
This includes _init and _libc_init
|
||||
|
||||
|
||||
At this entry point, most registers' values are unspecified, except:
|
||||
|
||||
a1 Contains a function pointer to be registered with `atexit'.
|
||||
This is how the dynamic linker arranges to have DT_FINI
|
||||
functions called for shared libraries that have been loaded
|
||||
before this code runs.
|
||||
|
||||
sp The stack contains the arguments and environment:
|
||||
0(sp) argc
|
||||
4(sp) argv[0]
|
||||
...
|
||||
(4*argc)(sp) NULL
|
||||
(4*(argc+1))(sp) envp[0]
|
||||
...
|
||||
NULL
|
||||
*/
|
||||
|
||||
.text
|
||||
.globl _start
|
||||
.type _start,#function
|
||||
_start:
|
||||
/* Fetch address of fini */
|
||||
ldr ip, =__libc_csu_fini
|
||||
|
||||
/* Clear the frame pointer since this is the outermost frame. */
|
||||
mov fp, #0
|
||||
|
||||
/* Pop argc off the stack and save a pointer to argv */
|
||||
ldr a2, [sp], #4
|
||||
mov a3, sp
|
||||
|
||||
/* Push stack limit */
|
||||
str a3, [sp, #-4]!
|
||||
|
||||
/* Push rtld_fini */
|
||||
str a1, [sp, #-4]!
|
||||
|
||||
/* Set up the other arguments in registers */
|
||||
ldr a1, =main
|
||||
ldr a4, =__libc_csu_init
|
||||
|
||||
/* Push fini */
|
||||
str ip, [sp, #-4]!
|
||||
|
||||
/* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end) */
|
||||
|
||||
/* Let the libc call main and exit with its return code. */
|
||||
bl __libc_start_main
|
||||
|
||||
/* should never get here....*/
|
||||
bl abort
|
||||
|
||||
/* Define a symbol for the first piece of initialized data. */
|
||||
.data
|
||||
.globl __data_start
|
||||
__data_start:
|
||||
.long 0
|
||||
.weak data_start
|
||||
data_start = __data_start
|
@ -1,36 +0,0 @@
|
||||
/* longjmp for ARM.
|
||||
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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#define _SETJMP_H
|
||||
#define _ASM
|
||||
#include <bits/setjmp.h>
|
||||
|
||||
/* __longjmp(jmpbuf, val) */
|
||||
|
||||
ENTRY (__longjmp)
|
||||
mov ip, r0 /* save jmp_buf pointer */
|
||||
|
||||
movs r0, r1 /* get the return value in place */
|
||||
moveq r0, #1 /* can't let setjmp() return zero! */
|
||||
|
||||
lfmfd f4, 4, [ip] ! /* load the floating point regs */
|
||||
|
||||
LOADREGS(ia, ip, {v1-v6, sl, fp, sp, pc})
|
||||
END (__longjmp)
|
@ -1,58 +0,0 @@
|
||||
/* Copyright (C) 1997, 1998, 1999 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#ifndef _FENV_H
|
||||
# error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
|
||||
#endif
|
||||
|
||||
/* Define bits representing exceptions in the FPU status word. */
|
||||
enum
|
||||
{
|
||||
FE_INVALID = 1,
|
||||
#define FE_INVALID FE_INVALID
|
||||
FE_DIVBYZERO = 2,
|
||||
#define FE_DIVBYZERO FE_DIVBYZERO
|
||||
FE_OVERFLOW = 4,
|
||||
#define FE_OVERFLOW FE_OVERFLOW
|
||||
FE_UNDERFLOW = 8,
|
||||
#define FE_UNDERFLOW FE_UNDERFLOW
|
||||
};
|
||||
|
||||
/* Amount to shift by to convert an exception to a mask bit. */
|
||||
#define FE_EXCEPT_SHIFT 16
|
||||
|
||||
/* All supported exceptions. */
|
||||
#define FE_ALL_EXCEPT \
|
||||
(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW)
|
||||
|
||||
/* The ARM FPU basically only supports round-to-nearest. Other rounding
|
||||
modes exist, but you have to encode them in the actual instruction. */
|
||||
#define FE_TONEAREST 0
|
||||
|
||||
/* Type representing exception flags. */
|
||||
typedef unsigned long int fexcept_t;
|
||||
|
||||
/* Type representing floating-point environment. */
|
||||
typedef struct
|
||||
{
|
||||
unsigned long int __cw;
|
||||
}
|
||||
fenv_t;
|
||||
|
||||
/* If the default argument is used we use this value. */
|
||||
#define FE_DFL_ENV ((fenv_t *) -1l)
|
@ -1,44 +0,0 @@
|
||||
/* Copyright (C) 1999, 2000, 2004 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#if !defined _MATH_H && !defined _COMPLEX_H
|
||||
# error "Never use <bits/mathdef.h> directly; include <math.h> instead"
|
||||
#endif
|
||||
|
||||
#if defined __USE_ISOC99 && defined _MATH_H && !defined _MATH_H_MATHDEF
|
||||
# define _MATH_H_MATHDEF 1
|
||||
|
||||
/* GCC does not promote `float' values to `double'. */
|
||||
typedef float float_t; /* `float' expressions are evaluated as
|
||||
`float'. */
|
||||
typedef double double_t; /* `double' expressions are evaluated as
|
||||
`double'. */
|
||||
|
||||
/* The values returned by `ilogb' for 0 and NaN respectively. */
|
||||
# define FP_ILOGB0 (-2147483647)
|
||||
# define FP_ILOGBNAN (2147483647)
|
||||
|
||||
#endif /* ISO C99 */
|
||||
|
||||
#ifndef __NO_LONG_DOUBLE_MATH
|
||||
/* Signal that we do not really have a `long double'. This disables the
|
||||
declaration of all the `long double' function variants. */
|
||||
/* XXX The FPA does support this but the patterns in GCC are currently
|
||||
turned off. */
|
||||
# define __NO_LONG_DOUBLE_MATH 1
|
||||
#endif
|
@ -1,36 +0,0 @@
|
||||
/* 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
/* Define the machine-dependent type `jmp_buf'. ARM version. */
|
||||
|
||||
#ifndef _SETJMP_H
|
||||
# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
|
||||
#endif
|
||||
|
||||
#ifndef _ASM
|
||||
/* Jump buffer contains v1-v6, sl, fp, sp and pc. Other registers are not
|
||||
saved. */
|
||||
typedef int __jmp_buf[22];
|
||||
#endif
|
||||
|
||||
#define __JMP_BUF_SP 20
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame
|
||||
containing a local variable at ADDRESS. */
|
||||
#define _JMPBUF_UNWINDS(jmpbuf, address) \
|
||||
((void *) (address) < (void *) (jmpbuf[__JMP_BUF_SP]))
|
@ -1,50 +0,0 @@
|
||||
/* Clear given exceptions in current floating-point environment.
|
||||
Copyright (C) 1997,98,99,2000,01 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
#include <fpu_control.h>
|
||||
|
||||
int
|
||||
__feclearexcept (int excepts)
|
||||
{
|
||||
unsigned long int temp;
|
||||
|
||||
/* Mask out unsupported bits/exceptions. */
|
||||
excepts &= FE_ALL_EXCEPT;
|
||||
|
||||
/* Get the current floating point status. */
|
||||
_FPU_GETCW (temp);
|
||||
|
||||
/* Clear the relevant bits. */
|
||||
temp &= excepts ^ FE_ALL_EXCEPT;
|
||||
|
||||
/* Put the new data in effect. */
|
||||
_FPU_SETCW (temp);
|
||||
|
||||
/* Success. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <shlib-compat.h>
|
||||
#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
|
||||
strong_alias (__feclearexcept, __old_feclearexcept)
|
||||
compat_symbol (libm, __old_feclearexcept, feclearexcept, GLIBC_2_1);
|
||||
#endif
|
||||
|
||||
versioned_symbol (libm, __feclearexcept, feclearexcept, GLIBC_2_2);
|
@ -1,40 +0,0 @@
|
||||
/* Disable floating-point exceptions.
|
||||
Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Philip Blundell <philb@gnu.org>, 2001.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
#include <fpu_control.h>
|
||||
|
||||
int
|
||||
fedisableexcept (int excepts)
|
||||
{
|
||||
unsigned long int new_exc, old_exc;
|
||||
|
||||
_FPU_GETCW(new_exc);
|
||||
|
||||
old_exc = (new_exc >> FE_EXCEPT_SHIFT) & FE_ALL_EXCEPT;
|
||||
|
||||
excepts &= FE_ALL_EXCEPT;
|
||||
|
||||
new_exc &= ~(excepts << FE_EXCEPT_SHIFT);
|
||||
|
||||
_FPU_SETCW(new_exc);
|
||||
|
||||
return old_exc;
|
||||
}
|
@ -1,40 +0,0 @@
|
||||
/* Enable floating-point exceptions.
|
||||
Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Philip Blundell <philb@gnu.org>, 2001.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
#include <fpu_control.h>
|
||||
|
||||
int
|
||||
feenableexcept (int excepts)
|
||||
{
|
||||
unsigned long int new_exc, old_exc;
|
||||
|
||||
_FPU_GETCW(new_exc);
|
||||
|
||||
old_exc = (new_exc >> FE_EXCEPT_SHIFT) & FE_ALL_EXCEPT;
|
||||
|
||||
excepts &= FE_ALL_EXCEPT;
|
||||
|
||||
new_exc |= (excepts << FE_EXCEPT_SHIFT);
|
||||
|
||||
_FPU_SETCW(new_exc);
|
||||
|
||||
return old_exc;
|
||||
}
|
@ -1,40 +0,0 @@
|
||||
/* Store current floating-point environment.
|
||||
Copyright (C) 1997,98,99,2000,01 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
#include <fpu_control.h>
|
||||
|
||||
int
|
||||
__fegetenv (fenv_t *envp)
|
||||
{
|
||||
unsigned long int temp;
|
||||
_FPU_GETCW (temp);
|
||||
envp->__cw = temp;
|
||||
|
||||
/* Success. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <shlib-compat.h>
|
||||
#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
|
||||
strong_alias (__fegetenv, __old_fegetenv)
|
||||
compat_symbol (libm, __old_fegetenv, fegetenv, GLIBC_2_1);
|
||||
#endif
|
||||
|
||||
versioned_symbol (libm, __fegetenv, fegetenv, GLIBC_2_2);
|
@ -1,32 +0,0 @@
|
||||
/* Get floating-point exceptions.
|
||||
Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Philip Blundell <philb@gnu.org>, 2001
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
#include <fpu_control.h>
|
||||
|
||||
int
|
||||
fegetexcept (void)
|
||||
{
|
||||
unsigned long temp;
|
||||
|
||||
_FPU_GETCW (temp);
|
||||
|
||||
return (temp >> FE_EXCEPT_SHIFT) & FE_ALL_EXCEPT;
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
/* Return current rounding direction.
|
||||
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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
|
||||
int
|
||||
fegetround (void)
|
||||
{
|
||||
return FE_TONEAREST; /* Easy. :-) */
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
/* Store current floating-point environment and clear exceptions.
|
||||
Copyright (C) 1997, 1998, 1999 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
#include <fpu_control.h>
|
||||
|
||||
int
|
||||
feholdexcept (fenv_t *envp)
|
||||
{
|
||||
unsigned long int temp;
|
||||
|
||||
/* Store the environment. */
|
||||
_FPU_GETCW(temp);
|
||||
envp->__cw = temp;
|
||||
|
||||
/* Now set all exceptions to non-stop. */
|
||||
temp &= ~(FE_ALL_EXCEPT << FE_EXCEPT_SHIFT);
|
||||
_FPU_SETCW(temp);
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
/* Install given floating-point environment.
|
||||
Copyright (C) 1997,98,99,2000,01,02 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
#include <fpu_control.h>
|
||||
|
||||
int
|
||||
__fesetenv (const fenv_t *envp)
|
||||
{
|
||||
if (envp == FE_DFL_ENV)
|
||||
_FPU_SETCW (_FPU_DEFAULT);
|
||||
else
|
||||
{
|
||||
unsigned long int temp = envp->__cw;
|
||||
_FPU_SETCW (temp);
|
||||
}
|
||||
|
||||
/* Success. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <shlib-compat.h>
|
||||
#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
|
||||
strong_alias (__fesetenv, __old_fesetenv)
|
||||
compat_symbol (libm, __old_fesetenv, fesetenv, GLIBC_2_1);
|
||||
#endif
|
||||
|
||||
libm_hidden_ver (__fesetenv, fesetenv)
|
||||
versioned_symbol (libm, __fesetenv, fesetenv, GLIBC_2_2);
|
@ -1,27 +0,0 @@
|
||||
/* Set current rounding direction.
|
||||
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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
|
||||
int
|
||||
fesetround (int round)
|
||||
{
|
||||
/* We only support FE_TONEAREST, so there is no need for any work. */
|
||||
return (round == FE_TONEAREST)?0:1;
|
||||
}
|
@ -1,102 +0,0 @@
|
||||
/* FPU control word definitions. ARM version.
|
||||
Copyright (C) 1996, 1997, 1998, 2000 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#ifndef _FPU_CONTROL_H
|
||||
#define _FPU_CONTROL_H
|
||||
|
||||
/* We have a slight terminology confusion here. On the ARM, the register
|
||||
* we're interested in is actually the FPU status word - the FPU control
|
||||
* word is something different (which is implementation-defined and only
|
||||
* accessible from supervisor mode.)
|
||||
*
|
||||
* The FPSR looks like this:
|
||||
*
|
||||
* 31-24 23-16 15-8 7-0
|
||||
* | system ID | trap enable | system control | exception flags |
|
||||
*
|
||||
* We ignore the system ID bits; for interest's sake they are:
|
||||
*
|
||||
* 0000 "old" FPE
|
||||
* 1000 FPPC hardware
|
||||
* 0001 FPE 400
|
||||
* 1001 FPA hardware
|
||||
*
|
||||
* The trap enable and exception flags are both structured like this:
|
||||
*
|
||||
* 7 - 5 4 3 2 1 0
|
||||
* | reserved | INX | UFL | OFL | DVZ | IVO |
|
||||
*
|
||||
* where a `1' bit in the enable byte means that the trap can occur, and
|
||||
* a `1' bit in the flags byte means the exception has occurred.
|
||||
*
|
||||
* The exceptions are:
|
||||
*
|
||||
* IVO - invalid operation
|
||||
* DVZ - divide by zero
|
||||
* OFL - overflow
|
||||
* UFL - underflow
|
||||
* INX - inexact (do not use; implementations differ)
|
||||
*
|
||||
* The system control byte looks like this:
|
||||
*
|
||||
* 7-5 4 3 2 1 0
|
||||
* | reserved | AC | EP | SO | NE | ND |
|
||||
*
|
||||
* where the bits mean
|
||||
*
|
||||
* ND - no denormalised numbers (force them all to zero)
|
||||
* NE - enable NaN exceptions
|
||||
* SO - synchronous operation
|
||||
* EP - use expanded packed-decimal format
|
||||
* AC - use alternate definition for C flag on compare operations
|
||||
*/
|
||||
|
||||
/* masking of interrupts */
|
||||
#define _FPU_MASK_IM 0x00010000 /* invalid operation */
|
||||
#define _FPU_MASK_ZM 0x00020000 /* divide by zero */
|
||||
#define _FPU_MASK_OM 0x00040000 /* overflow */
|
||||
#define _FPU_MASK_UM 0x00080000 /* underflow */
|
||||
#define _FPU_MASK_PM 0x00100000 /* inexact */
|
||||
#define _FPU_MASK_DM 0x00000000 /* denormalized operation */
|
||||
|
||||
/* The system id bytes cannot be changed.
|
||||
Only the bottom 5 bits in the trap enable byte can be changed.
|
||||
Only the bottom 5 bits in the system control byte can be changed.
|
||||
Only the bottom 5 bits in the exception flags are used.
|
||||
The exception flags are set by the fpu, but can be zeroed by the user. */
|
||||
#define _FPU_RESERVED 0xffe0e0e0 /* These bits are reserved. */
|
||||
|
||||
/* The fdlibm code requires strict IEEE double precision arithmetic,
|
||||
no interrupts for exceptions, rounding to nearest. Changing the
|
||||
rounding mode will break long double I/O. Turn on the AC bit,
|
||||
the compiler generates code that assumes it is on. */
|
||||
#define _FPU_DEFAULT 0x00001000 /* Default value. */
|
||||
#define _FPU_IEEE 0x001f1000 /* Default + exceptions enabled. */
|
||||
|
||||
/* Type of the control word. */
|
||||
typedef unsigned int fpu_control_t;
|
||||
|
||||
/* Macros for accessing the hardware control word. */
|
||||
#define _FPU_GETCW(cw) __asm__ ("rfs %0" : "=r" (cw))
|
||||
#define _FPU_SETCW(cw) __asm__ ("wfs %0" : : "r" (cw))
|
||||
|
||||
/* Default control word set at startup. */
|
||||
extern fpu_control_t __fpu_control;
|
||||
|
||||
#endif /* _FPU_CONTROL_H */
|
@ -1,44 +0,0 @@
|
||||
/* Raise given exceptions.
|
||||
Copyright (C) 1997,98,99,2000,01,02 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
#include <fpu_control.h>
|
||||
#include <math.h>
|
||||
|
||||
int
|
||||
__feraiseexcept (int excepts)
|
||||
{
|
||||
/* Raise exceptions represented by EXPECTS. */
|
||||
fexcept_t temp;
|
||||
_FPU_GETCW (temp);
|
||||
temp |= (excepts & FE_ALL_EXCEPT);
|
||||
_FPU_SETCW (temp);
|
||||
|
||||
/* Success. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <shlib-compat.h>
|
||||
#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
|
||||
strong_alias (__feraiseexcept, __old_feraiseexcept)
|
||||
compat_symbol (libm, __old_feraiseexcept, feraiseexcept, GLIBC_2_1);
|
||||
#endif
|
||||
|
||||
libm_hidden_ver (__feraiseexcept, feraiseexcept)
|
||||
versioned_symbol (libm, __feraiseexcept, feraiseexcept, GLIBC_2_2);
|
@ -1,49 +0,0 @@
|
||||
/* Set floating-point environment exception handling.
|
||||
Copyright (C) 1997,98,99,2000,01 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
#include <math.h>
|
||||
#include <fpu_control.h>
|
||||
|
||||
int
|
||||
__fesetexceptflag (const fexcept_t *flagp, int excepts)
|
||||
{
|
||||
fexcept_t temp;
|
||||
|
||||
/* Get the current environment. */
|
||||
_FPU_GETCW (temp);
|
||||
|
||||
/* Set the desired exception mask. */
|
||||
temp &= ~((excepts & FE_ALL_EXCEPT) << FE_EXCEPT_SHIFT);
|
||||
temp |= (*flagp & excepts & FE_ALL_EXCEPT) << FE_EXCEPT_SHIFT;
|
||||
|
||||
/* Save state back to the FPU. */
|
||||
_FPU_SETCW (temp);
|
||||
|
||||
/* Success. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <shlib-compat.h>
|
||||
#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
|
||||
strong_alias (__fesetexceptflag, __old_fesetexceptflag)
|
||||
compat_symbol (libm, __old_fesetexceptflag, fesetexceptflag, GLIBC_2_1);
|
||||
#endif
|
||||
|
||||
versioned_symbol (libm, __fesetexceptflag, fesetexceptflag, GLIBC_2_2);
|
@ -1,32 +0,0 @@
|
||||
/* Test exception in current environment.
|
||||
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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
#include <fpu_control.h>
|
||||
|
||||
int
|
||||
fetestexcept (int excepts)
|
||||
{
|
||||
fexcept_t temp;
|
||||
|
||||
/* Get current exceptions. */
|
||||
_FPU_GETCW(temp);
|
||||
|
||||
return temp & excepts & FE_ALL_EXCEPT;
|
||||
}
|
@ -1,35 +0,0 @@
|
||||
/* setjmp for ARM.
|
||||
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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#define _SETJMP_H
|
||||
#define _ASM
|
||||
#include <bits/setjmp.h>
|
||||
|
||||
ENTRY (__sigsetjmp)
|
||||
/* Save registers */
|
||||
sfmea f4, 4, [r0]!
|
||||
stmia r0, {v1-v6, sl, fp, sp, lr}
|
||||
|
||||
/* Restore pointer to jmp_buf */
|
||||
sub r0, r0, #48
|
||||
|
||||
/* Make a tail call to __sigjmp_save; it takes the same args. */
|
||||
B PLTJMP(C_SYMBOL_NAME(__sigjmp_save))
|
||||
END (__sigsetjmp)
|
@ -1,28 +0,0 @@
|
||||
/* Definition of stack frame structure. ARM/APCS version.
|
||||
Copyright (C) 2000, 2002 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
/* This is the APCS stack backtrace structure. */
|
||||
struct layout
|
||||
{
|
||||
struct layout *__unbounded next;
|
||||
void *__unbounded sp;
|
||||
void *__unbounded return_address;
|
||||
};
|
||||
|
||||
#define FIRST_FRAME_POINTER ADVANCE_STACK_FRAME (__builtin_frame_address (0))
|
@ -1,22 +0,0 @@
|
||||
/* Definition of object in frame unwind info. arm version.
|
||||
Copyright (C) 2001 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#define FIRST_PSEUDO_REGISTER 27
|
||||
|
||||
#include <sysdeps/generic/gccframe.h>
|
@ -1,30 +0,0 @@
|
||||
/* gmp-mparam.h -- Compiler/machine parameter header file.
|
||||
|
||||
Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of the GNU MP Library.
|
||||
|
||||
The GNU MP Library is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2.1 of the License, or (at your
|
||||
option) any later version.
|
||||
|
||||
The GNU MP 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 Lesser General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with the GNU MP 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. */
|
||||
|
||||
#define BITS_PER_MP_LIMB 32
|
||||
#define BYTES_PER_MP_LIMB 4
|
||||
#define BITS_PER_LONGINT 32
|
||||
#define BITS_PER_INT 32
|
||||
#define BITS_PER_SHORTINT 16
|
||||
#define BITS_PER_CHAR 8
|
||||
|
||||
#define IEEE_DOUBLE_BIG_ENDIAN 0
|
||||
#define IEEE_DOUBLE_MIXED_ENDIAN 1
|
@ -1,115 +0,0 @@
|
||||
/* Copyright (C) 1992, 1995, 1996, 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#ifndef _IEEE754_H
|
||||
|
||||
#define _IEEE754_H 1
|
||||
#include <features.h>
|
||||
|
||||
#include <endian.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
union ieee754_float
|
||||
{
|
||||
float f;
|
||||
|
||||
/* This is the IEEE 754 single-precision format. */
|
||||
struct
|
||||
{
|
||||
unsigned int mantissa:23;
|
||||
unsigned int exponent:8;
|
||||
unsigned int negative:1;
|
||||
} ieee;
|
||||
|
||||
/* This format makes it easier to see if a NaN is a signalling NaN. */
|
||||
struct
|
||||
{
|
||||
unsigned int mantissa:22;
|
||||
unsigned int quiet_nan:1;
|
||||
unsigned int exponent:8;
|
||||
unsigned int negative:1;
|
||||
} ieee_nan;
|
||||
};
|
||||
|
||||
#define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */
|
||||
|
||||
|
||||
union ieee754_double
|
||||
{
|
||||
double d;
|
||||
|
||||
/* This is the IEEE 754 double-precision format. */
|
||||
struct
|
||||
{
|
||||
unsigned int mantissa0:20;
|
||||
unsigned int exponent:11;
|
||||
unsigned int negative:1;
|
||||
unsigned int mantissa1:32;
|
||||
} ieee;
|
||||
|
||||
/* This format makes it easier to see if a NaN is a signalling NaN. */
|
||||
struct
|
||||
{
|
||||
unsigned int mantissa0:19;
|
||||
unsigned int quiet_nan:1;
|
||||
unsigned int exponent:11;
|
||||
unsigned int negative:1;
|
||||
unsigned int mantissa1:32;
|
||||
} ieee_nan;
|
||||
};
|
||||
|
||||
#define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */
|
||||
|
||||
|
||||
/* The following two structures are correct for `new' floating point systems but
|
||||
wrong for the old FPPC. The only solution seems to be to avoid their use on
|
||||
old hardware. */
|
||||
|
||||
union ieee854_long_double
|
||||
{
|
||||
long double d;
|
||||
|
||||
/* This is the IEEE 854 double-extended-precision format. */
|
||||
struct
|
||||
{
|
||||
unsigned int exponent:15;
|
||||
unsigned int empty:16;
|
||||
unsigned int negative:1;
|
||||
unsigned int mantissa1:32;
|
||||
unsigned int mantissa0:32;
|
||||
} ieee;
|
||||
|
||||
/* This is for NaNs in the IEEE 854 double-extended-precision format. */
|
||||
struct
|
||||
{
|
||||
unsigned int exponent:15;
|
||||
unsigned int empty:16;
|
||||
unsigned int negative:1;
|
||||
unsigned int mantissa1:32;
|
||||
unsigned int mantissa0:30;
|
||||
unsigned int quiet_nan:1;
|
||||
unsigned int one:1;
|
||||
} ieee_nan;
|
||||
};
|
||||
|
||||
#define IEEE854_LONG_DOUBLE_BIAS 0x3fff
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif /* ieee754.h */
|
@ -1,73 +0,0 @@
|
||||
/* Initialization code run first thing by the ELF startup code. For ARM.
|
||||
Copyright (C) 1995,1996,1997,1998,2001,2002 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
extern void __libc_init (int, char **, char **);
|
||||
#ifdef USE_NONOPTION_FLAGS
|
||||
extern void __getopt_clean_environment (char **);
|
||||
#endif
|
||||
extern void __libc_global_ctors (void);
|
||||
|
||||
int __libc_multiple_libcs attribute_hidden = 1;
|
||||
|
||||
static void
|
||||
init (int *data)
|
||||
{
|
||||
int argc = *data;
|
||||
char **argv = (void *) (data + 1);
|
||||
char **envp = &argv[argc + 1];
|
||||
|
||||
__environ = envp;
|
||||
__libc_init (argc, argv, envp);
|
||||
|
||||
#ifdef USE_NONOPTION_FLAGS
|
||||
/* This is a hack to make the special getopt in GNU libc working. */
|
||||
__getopt_clean_environment (envp);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef SHARED
|
||||
/* This function is called to initialize the shared C library.
|
||||
It is called just before the user _start code from i386/elf/start.S,
|
||||
with the stack set up as that code gets it. */
|
||||
|
||||
/* NOTE! The linker notices the magical name `_init' and sets the DT_INIT
|
||||
pointer in the dynamic section based solely on that. It is convention
|
||||
for this function to be in the `.init' section, but the symbol name is
|
||||
the only thing that really matters!! */
|
||||
/*void _init (int argc, ...) __attribute__ ((unused, section (".init")));*/
|
||||
|
||||
void
|
||||
_init (int argc, ...)
|
||||
{
|
||||
init (&argc);
|
||||
|
||||
__libc_global_ctors ();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void
|
||||
__libc_init_first (int argc __attribute__ ((unused)), ...)
|
||||
{
|
||||
#ifndef SHARED
|
||||
init (&argc);
|
||||
#endif
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,67 +0,0 @@
|
||||
/* Machine-dependent definitions for profiling support. ARM version.
|
||||
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
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
/* GCC for the ARM cannot compile __builtin_return_address(N) for N != 0,
|
||||
so we must use an assembly stub. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#ifndef NO_UNDERSCORES
|
||||
/* The asm symbols for C functions are `_function'.
|
||||
The canonical name for the counter function is `mcount', no _. */
|
||||
void _mcount (void) asm ("mcount");
|
||||
#else
|
||||
/* The canonical name for the function is `_mcount' in both C and asm,
|
||||
but some old asm code might assume it's `mcount'. */
|
||||
void _mcount (void);
|
||||
weak_alias (_mcount, mcount)
|
||||
#endif
|
||||
|
||||
static void mcount_internal (u_long frompc, u_long selfpc) __attribute_used__;
|
||||
|
||||
#define _MCOUNT_DECL(frompc, selfpc) \
|
||||
static void mcount_internal (u_long frompc, u_long 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_fp
|
||||
r1 = this_lr
|
||||
r1 = [r1-4] which is caller's lr
|
||||
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 r1, #0;" \
|
||||
"ldrne r1, [fp, $-4];" \
|
||||
"ldrne r0, [fp, $-12];" \
|
||||
"movnes r0, r0;" \
|
||||
"ldrne r0, [r0, $-4];" \
|
||||
"movs r0, r0;" \
|
||||
"blne mcount_internal;" \
|
||||
"ldmia sp!, {r0, r1, r2, r3}"); \
|
||||
}
|
||||
|
@ -1,67 +0,0 @@
|
||||
/* Copyright (C) 1998, 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Philip Blundell <philb@gnu.org>
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
/* void *memset (dstpp, c, len) */
|
||||
|
||||
ENTRY(memset)
|
||||
mov r3, r0
|
||||
cmp r2, #8
|
||||
bcc 2f @ less than 8 bytes to move
|
||||
|
||||
1:
|
||||
tst r3, #3 @ aligned yet?
|
||||
strneb r1, [r3], #1
|
||||
subne r2, r2, #1
|
||||
bne 1b
|
||||
|
||||
orr r1, r1, r1, lsl $8
|
||||
orr r1, r1, r1, lsl $16
|
||||
|
||||
1:
|
||||
subs r2, r2, #8
|
||||
strcs r1, [r3], #4 @ store up to 32 bytes per loop iteration
|
||||
strcs r1, [r3], #4
|
||||
subcss r2, r2, #8
|
||||
strcs r1, [r3], #4
|
||||
strcs r1, [r3], #4
|
||||
subcss r2, r2, #8
|
||||
strcs r1, [r3], #4
|
||||
strcs r1, [r3], #4
|
||||
subcss r2, r2, #8
|
||||
strcs r1, [r3], #4
|
||||
strcs r1, [r3], #4
|
||||
bcs 1b
|
||||
|
||||
and r2, r2, #7
|
||||
2:
|
||||
subs r2, r2, #1 @ store up to 4 bytes per loop iteration
|
||||
strcsb r1, [r3], #1
|
||||
subcss r2, r2, #1
|
||||
strcsb r1, [r3], #1
|
||||
subcss r2, r2, #1
|
||||
strcsb r1, [r3], #1
|
||||
subcss r2, r2, #1
|
||||
strcsb r1, [r3], #1
|
||||
bcs 2b
|
||||
|
||||
DO_RET(lr)
|
||||
END(memset)
|
||||
libc_hidden_builtin_def (memset)
|
@ -1,21 +0,0 @@
|
||||
/* Copyright (C) 2000 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#define GETSP() ({ register uintptr_t stack_ptr asm ("sp"); stack_ptr; })
|
||||
|
||||
#include <sysdeps/generic/memusage.h>
|
@ -1,31 +0,0 @@
|
||||
/* setjmp for ARM.
|
||||
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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#define _SETJMP_H
|
||||
#define _ASM
|
||||
#include <bits/setjmp.h>
|
||||
|
||||
ENTRY (__sigsetjmp)
|
||||
/* Save registers */
|
||||
stmia r0, {v1-v6, sl, fp, sp, lr}
|
||||
|
||||
/* Make a tail call to __sigjmp_save; it takes the same args. */
|
||||
B PLTJMP(C_SYMBOL_NAME(__sigjmp_save))
|
||||
END (__sigsetjmp)
|
@ -1,28 +0,0 @@
|
||||
/* Copyright (C) 2001 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
/* This file contains a bit of information about the stack allocation
|
||||
of the processor. */
|
||||
|
||||
#ifndef _STACKINFO_H
|
||||
#define _STACKINFO_H 1
|
||||
|
||||
/* On Arm the stack grows down. */
|
||||
#define _STACK_GROWS_DOWN 1
|
||||
|
||||
#endif /* stackinfo.h */
|
@ -1,73 +0,0 @@
|
||||
/* Copyright (C) 1998, 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Code contributed by Matthew Wilcox <willy@odie.barnet.ac.uk>
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
/* size_t strlen(const char *S)
|
||||
* entry: r0 -> string
|
||||
* exit: r0 = len
|
||||
*/
|
||||
|
||||
ENTRY(strlen)
|
||||
bic r1, r0, $3 @ addr of word containing first byte
|
||||
ldr r2, [r1], $4 @ get the first word
|
||||
ands r3, r0, $3 @ how many bytes are duff?
|
||||
rsb r0, r3, $0 @ get - that number into counter.
|
||||
beq Laligned @ skip into main check routine if no
|
||||
@ more
|
||||
#ifdef __ARMEB__
|
||||
orr r2, r2, $0xff000000 @ set this byte to non-zero
|
||||
subs r3, r3, $1 @ any more to do?
|
||||
orrgt r2, r2, $0x00ff0000 @ if so, set this byte
|
||||
subs r3, r3, $1 @ more?
|
||||
orrgt r2, r2, $0x0000ff00 @ then set.
|
||||
#else
|
||||
orr r2, r2, $0x000000ff @ set this byte to non-zero
|
||||
subs r3, r3, $1 @ any more to do?
|
||||
orrgt r2, r2, $0x0000ff00 @ if so, set this byte
|
||||
subs r3, r3, $1 @ more?
|
||||
orrgt r2, r2, $0x00ff0000 @ then set.
|
||||
#endif
|
||||
Laligned: @ here, we have a word in r2. Does it
|
||||
tst r2, $0x000000ff @ contain any zeroes?
|
||||
tstne r2, $0x0000ff00 @
|
||||
tstne r2, $0x00ff0000 @
|
||||
tstne r2, $0xff000000 @
|
||||
addne r0, r0, $4 @ if not, the string is 4 bytes longer
|
||||
ldrne r2, [r1], $4 @ and we continue to the next word
|
||||
bne Laligned @
|
||||
Llastword: @ drop through to here once we find a
|
||||
#ifdef __ARMEB__
|
||||
tst r2, $0xff000000 @ word that has a zero byte in it
|
||||
addne r0, r0, $1 @
|
||||
tstne r2, $0x00ff0000 @ and add up to 3 bytes on to it
|
||||
addne r0, r0, $1 @
|
||||
tstne r2, $0x0000ff00 @ (if first three all non-zero, 4th
|
||||
addne r0, r0, $1 @ must be zero)
|
||||
#else
|
||||
tst r2, $0x000000ff @ word that has a zero byte in it
|
||||
addne r0, r0, $1 @
|
||||
tstne r2, $0x0000ff00 @ and add up to 3 bytes on to it
|
||||
addne r0, r0, $1 @
|
||||
tstne r2, $0x00ff0000 @ (if first three all non-zero, 4th
|
||||
addne r0, r0, $1 @ must be zero)
|
||||
#endif
|
||||
DO_RET(lr)
|
||||
END(strlen)
|
||||
libc_hidden_builtin_def (strlen)
|
@ -1,95 +0,0 @@
|
||||
/* Copyright (C) 1998, 1999 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
/* System V/ARM ABI compliant context switching support. */
|
||||
|
||||
#ifndef _SYS_UCONTEXT_H
|
||||
#define _SYS_UCONTEXT_H 1
|
||||
|
||||
#include <features.h>
|
||||
#include <signal.h>
|
||||
|
||||
typedef int greg_t;
|
||||
|
||||
/* Number of general registers. */
|
||||
#define NGREG 16
|
||||
|
||||
/* Container for all general registers. */
|
||||
typedef greg_t gregset_t[NGREG];
|
||||
|
||||
/* Number of each register is the `gregset_t' array. */
|
||||
enum
|
||||
{
|
||||
R0 = 0,
|
||||
#define R0 R0
|
||||
R1 = 1,
|
||||
#define R1 R1
|
||||
R2 = 2,
|
||||
#define R2 R2
|
||||
R3 = 3,
|
||||
#define R3 R3
|
||||
R4 = 4,
|
||||
#define R4 R4
|
||||
R5 = 5,
|
||||
#define R5 R5
|
||||
R6 = 6,
|
||||
#define R6 R6
|
||||
R7 = 7,
|
||||
#define R7 R7
|
||||
R8 = 8,
|
||||
#define R8 R8
|
||||
R9 = 9,
|
||||
#define R9 R9
|
||||
R10 = 10,
|
||||
#define R10 R10
|
||||
R11 = 11,
|
||||
#define R11 R11
|
||||
R12 = 12,
|
||||
#define R12 R12
|
||||
R13 = 13,
|
||||
#define R13 R13
|
||||
R14 = 14,
|
||||
#define R14 R14
|
||||
R15 = 15,
|
||||
#define R15 R15
|
||||
};
|
||||
|
||||
/* Structure to describe FPU registers. */
|
||||
typedef struct fpregset
|
||||
{
|
||||
} fpregset_t;
|
||||
|
||||
/* Context to describe whole processor state. */
|
||||
typedef struct
|
||||
{
|
||||
gregset_t gregs;
|
||||
fpregset_t fpregs;
|
||||
} mcontext_t;
|
||||
|
||||
/* Userlevel context. */
|
||||
typedef struct ucontext
|
||||
{
|
||||
unsigned long int uc_flags;
|
||||
struct ucontext *uc_link;
|
||||
__sigset_t uc_sigmask;
|
||||
stack_t uc_stack;
|
||||
mcontext_t uc_mcontext;
|
||||
long int uc_filler[5];
|
||||
} ucontext_t;
|
||||
|
||||
#endif /* sys/ucontext.h */
|
@ -1,108 +0,0 @@
|
||||
/* Assembler macros for ARM.
|
||||
Copyright (C) 1997, 1998, 2003 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdeps/generic/sysdep.h>
|
||||
|
||||
#if (!defined (__ARM_ARCH_2__) && !defined (__ARM_ARCH_3__) \
|
||||
&& !defined (__ARM_ARCH_3M__) && !defined (__ARM_ARCH_4__))
|
||||
# define __USE_BX__
|
||||
#endif
|
||||
|
||||
#ifdef __ASSEMBLER__
|
||||
|
||||
/* Syntactic details of assembler. */
|
||||
|
||||
#ifdef HAVE_ELF
|
||||
|
||||
#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
|
||||
|
||||
/* In ELF C symbols are asm symbols. */
|
||||
#undef NO_UNDERSCORES
|
||||
#define NO_UNDERSCORES
|
||||
|
||||
#define PLTJMP(_x) _x##(PLT)
|
||||
|
||||
#else
|
||||
|
||||
#define ALIGNARG(log2) log2
|
||||
#define ASM_TYPE_DIRECTIVE(name,type) /* Nothing is specified. */
|
||||
#define ASM_SIZE_DIRECTIVE(name) /* Nothing is specified. */
|
||||
|
||||
#define PLTJMP(_x) _x
|
||||
|
||||
#endif
|
||||
|
||||
/* APCS-32 doesn't preserve the condition codes across function call. */
|
||||
#ifdef __APCS_32__
|
||||
#define LOADREGS(cond, base, reglist...)\
|
||||
ldm##cond base,reglist
|
||||
#ifdef __USE_BX__
|
||||
#define RETINSTR(cond, reg) \
|
||||
bx##cond reg
|
||||
#define DO_RET(_reg) \
|
||||
bx _reg
|
||||
#else
|
||||
#define RETINSTR(cond, reg) \
|
||||
mov##cond pc, reg
|
||||
#define DO_RET(_reg) \
|
||||
mov pc, _reg
|
||||
#endif
|
||||
#else /* APCS-26 */
|
||||
#define LOADREGS(cond, base, reglist...)\
|
||||
ldm##cond base,reglist^
|
||||
#define RETINSTR(cond, reg) \
|
||||
mov##cond##s pc, reg
|
||||
#define DO_RET(_reg) \
|
||||
movs pc, _reg
|
||||
#endif
|
||||
|
||||
/* Define an entry point visible from C. */
|
||||
#define ENTRY(name) \
|
||||
ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \
|
||||
ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),function) \
|
||||
.align ALIGNARG(4); \
|
||||
C_LABEL(name) \
|
||||
CALL_MCOUNT
|
||||
|
||||
#undef END
|
||||
#define END(name) \
|
||||
ASM_SIZE_DIRECTIVE(name)
|
||||
|
||||
/* If compiled for profiling, call `mcount' at the start of each function. */
|
||||
#ifdef PROF
|
||||
#define CALL_MCOUNT \
|
||||
str lr,[sp, #-4]! ; \
|
||||
bl PLTJMP(mcount) ; \
|
||||
ldr lr, [sp], #4 ;
|
||||
#else
|
||||
#define CALL_MCOUNT /* Do nothing. */
|
||||
#endif
|
||||
|
||||
#ifdef NO_UNDERSCORES
|
||||
/* Since C identifiers are not normally prefixed with an underscore
|
||||
on this system, the asm identifier `syscall_error' intrudes on the
|
||||
C name space. Make sure we use an innocuous name. */
|
||||
#define syscall_error __syscall_error
|
||||
#define mcount _mcount
|
||||
#endif
|
||||
|
||||
#endif /* __ASSEMBLER__ */
|
@ -1 +0,0 @@
|
||||
dl-brk.S
|
@ -1,56 +0,0 @@
|
||||
/* Copyright (C) 1991, 92, 93, 95, 97, 98 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
#ifndef SYS_brk
|
||||
#define SYS_brk 17
|
||||
#endif
|
||||
|
||||
.data
|
||||
.globl C_SYMBOL_NAME(__curbrk)
|
||||
C_LABEL(__curbrk)
|
||||
#ifdef HAVE_GNU_LD
|
||||
.long C_SYMBOL_NAME(_end)
|
||||
#else
|
||||
.long C_SYMBOL_NAME(end)
|
||||
#endif
|
||||
|
||||
.text
|
||||
SYSCALL__ (brk, 1)
|
||||
#ifdef PIC
|
||||
ldr r1, 1f
|
||||
ldr r2, _cb_addr
|
||||
2: add r1, pc, r1
|
||||
add r1, r1, r2
|
||||
#else
|
||||
ldr r1, _cb_addr
|
||||
#endif
|
||||
str r0, [r1]
|
||||
mov r0, $0
|
||||
DO_RET (r14)
|
||||
#ifdef PIC
|
||||
1: .long _GLOBAL_OFFSET_TABLE_ - 2b - 8
|
||||
_cb_addr:
|
||||
.long C_SYMBOL_NAME(__curbrk)(GOTOFF)
|
||||
#else
|
||||
_cb_addr:
|
||||
.long C_SYMBOL_NAME(__curbrk)
|
||||
#endif
|
||||
|
||||
weak_alias (__brk, brk)
|
@ -1 +0,0 @@
|
||||
#include <brk.S>
|
@ -1,34 +0,0 @@
|
||||
/* Copyright (C) 1991,92,94,95,97,2002 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
/* ARM version. */
|
||||
|
||||
SYSCALL__ (fork, 0)
|
||||
/* R1 is now 0 for the parent and 1 for the child. Decrement it to
|
||||
make it -1 (all bits set) for the parent, and 0 (no bits set)
|
||||
for the child. Then AND it with R0, so the parent gets
|
||||
R0&-1==R0, and the child gets R0&0==0. */
|
||||
sub r1, r1, $1
|
||||
and r0, r0, r1
|
||||
DO_RET (r14)
|
||||
PSEUDO_END (__fork)
|
||||
libc_hidden_def (__fork)
|
||||
|
||||
weak_alias (__fork, fork)
|
@ -1,97 +0,0 @@
|
||||
/* Special startup code for ARM a.out binaries.
|
||||
Copyright (C) 1998, 2004 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
In addition to the permissions in the GNU Lesser General Public
|
||||
License, the Free Software Foundation gives you unlimited
|
||||
permission to link the compiled version of this file with other
|
||||
programs, and to distribute those programs without any restriction
|
||||
coming from the use of this file. (The GNU Lesser General Public
|
||||
License restrictions do apply in other respects; for example, they
|
||||
cover modification of the file, and distribution when not linked
|
||||
into another program.)
|
||||
|
||||
Note that people who make modified versions of this file are not
|
||||
obligated to grant this special exception for their modified
|
||||
versions; it is their choice whether to do so. The GNU Lesser
|
||||
General Public License gives permission to release a modified
|
||||
version without this exception; this exception also makes it
|
||||
possible to release a modified version which carries forward this
|
||||
exception.
|
||||
|
||||
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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sysdep.h>
|
||||
|
||||
/* The first piece of initialized data. */
|
||||
int __data_start = 0;
|
||||
#ifdef HAVE_WEAK_SYMBOLS
|
||||
weak_alias (__data_start, data_start)
|
||||
#endif
|
||||
|
||||
extern void __libc_init (int argc, char **argv, char **envp);
|
||||
extern int main (int argc, char **argv, char **envp);
|
||||
|
||||
/* N.B.: It is important that this be the first function.
|
||||
This file is the first thing in the text section. */
|
||||
|
||||
/* If this was in C it might create its own stack frame and
|
||||
screw up the arguments. */
|
||||
#ifdef NO_UNDERSCORES
|
||||
asm (".text; .globl _start; _start: B start1");
|
||||
#else
|
||||
asm (".text; .globl __start; __start: B _start1");
|
||||
|
||||
/* Make an alias called `start' (no leading underscore, so it can't
|
||||
conflict with C symbols) for `_start'. This is the name vendor crt0.o's
|
||||
tend to use, and thus the name most linkers expect. */
|
||||
asm (".set start, __start");
|
||||
#endif
|
||||
|
||||
/* Fool gcc into thinking that more args are passed. This makes it look
|
||||
on the stack (correctly) for the real arguments. It causes somewhat
|
||||
strange register usage in start1(), but we aren't too bothered about
|
||||
that at the moment. */
|
||||
#define DUMMIES a1, a2, a3, a4
|
||||
|
||||
#ifdef DUMMIES
|
||||
#define ARG_DUMMIES DUMMIES,
|
||||
#define DECL_DUMMIES int DUMMIES;
|
||||
#else
|
||||
#define ARG_DUMMIES
|
||||
#define DECL_DUMMIES
|
||||
#endif
|
||||
|
||||
/* ARGSUSED */
|
||||
static void
|
||||
start1 (ARG_DUMMIES argc, argv, envp)
|
||||
DECL_DUMMIES
|
||||
int argc;
|
||||
char **argv;
|
||||
char **envp;
|
||||
{
|
||||
/* Store a pointer to the environment. */
|
||||
__environ = envp;
|
||||
|
||||
/* Do C library initializations. */
|
||||
__libc_init (argc, argv, __environ);
|
||||
|
||||
/* Call the user program. */
|
||||
exit (main (argc, argv, __environ));
|
||||
}
|
@ -1,71 +0,0 @@
|
||||
/* Copyright (C) 1991,92,93,94,95,96,97,98,2002,03 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#define _ERRNO_H
|
||||
#include <bits/errno.h>
|
||||
|
||||
.globl C_SYMBOL_NAME(errno)
|
||||
.globl syscall_error
|
||||
|
||||
#undef syscall_error
|
||||
#ifdef NO_UNDERSCORES
|
||||
__syscall_error:
|
||||
#else
|
||||
syscall_error:
|
||||
#endif
|
||||
#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
|
||||
/* We translate the system's EWOULDBLOCK error into EAGAIN.
|
||||
The GNU C library always defines EWOULDBLOCK==EAGAIN.
|
||||
EWOULDBLOCK_sys is the original number. */
|
||||
cmp r0, $EWOULDBLOCK_sys /* Is it the old EWOULDBLOCK? */
|
||||
moveq r0, $EAGAIN /* Yes; translate it to EAGAIN. */
|
||||
#endif
|
||||
|
||||
#ifdef _LIBC_REENTRANT
|
||||
str lr, [sp, #-4]!
|
||||
str r0, [sp, #-4]!
|
||||
bl PLTJMP(C_SYMBOL_NAME(__errno_location))
|
||||
ldr r1, [sp], #4
|
||||
str r1, [r0]
|
||||
mvn r0, $0
|
||||
ldr pc, [sp], #4
|
||||
#else
|
||||
#ifndef PIC
|
||||
ldr r1, 1f
|
||||
str r0, [r1]
|
||||
mvn r0, $0
|
||||
DO_RET (r14)
|
||||
|
||||
1: .long C_SYMBOL_NAME(errno)
|
||||
#else
|
||||
@ we have to establish our PIC register
|
||||
ldr r2, 1f
|
||||
ldr r1, 2f
|
||||
0: add r2, pc, r2
|
||||
str r0, [r1, r2]
|
||||
mvn r0, $0
|
||||
DO_RET (r14)
|
||||
|
||||
1: .word _GLOBAL_OFFSET_TABLE_ - 0b - 8
|
||||
2: .word C_SYMBOL_NAME(errno)(GOTOFF)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#undef __syscall_error
|
||||
END (__syscall_error)
|
@ -1,30 +0,0 @@
|
||||
/* 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdeps/unix/sysdep.h>
|
||||
#include <sysdeps/arm/sysdep.h>
|
||||
|
||||
/* Some definitions to allow the assembler in sysdeps/unix/ to build
|
||||
without needing ARM-specific versions of all the files. */
|
||||
|
||||
#ifdef __ASSEMBLER__
|
||||
|
||||
#define ret DO_RET (r14)
|
||||
#define MOVE(a,b) mov b,a
|
||||
|
||||
#endif
|
@ -1,14 +0,0 @@
|
||||
clone.S
|
||||
dl-procinfo.h
|
||||
ioperm.c
|
||||
setresuid.c
|
||||
setresgid.c
|
||||
setfsuid.c
|
||||
setfsgid.c
|
||||
sigrestorer.S
|
||||
bits/armsigctx.h
|
||||
sys/elf.h
|
||||
sys/io.h
|
||||
sys/procfs.h
|
||||
sys/user.h
|
||||
oldgetrlimit64.c
|
@ -1,12 +0,0 @@
|
||||
ifeq ($(subdir),misc)
|
||||
sysdep_routines += ioperm
|
||||
sysdep_headers += sys/elf.h sys/io.h
|
||||
endif
|
||||
|
||||
ifeq ($(subdir),signal)
|
||||
sysdep_routines += sigrestorer
|
||||
endif
|
||||
|
||||
ifeq ($(subdir),resource)
|
||||
sysdep_routines += oldgetrlimit64
|
||||
endif
|
@ -1,37 +0,0 @@
|
||||
libc {
|
||||
GLIBC_2.0 {
|
||||
# Exception handling support functions from libgcc
|
||||
__register_frame; __register_frame_table; __deregister_frame;
|
||||
__frame_state_for; __register_frame_info_table;
|
||||
}
|
||||
GLIBC_2.1 {
|
||||
ioperm; iopl;
|
||||
inb; inw; inl;
|
||||
outb; outw; outl;
|
||||
}
|
||||
GLIBC_2.2 {
|
||||
# functions used in other libraries
|
||||
__xstat64; __fxstat64; __lxstat64;
|
||||
|
||||
# a*
|
||||
alphasort64;
|
||||
|
||||
# g*
|
||||
glob64;
|
||||
|
||||
# New rlimit interface
|
||||
getrlimit; setrlimit; getrlimit64;
|
||||
|
||||
# r*
|
||||
readdir64; readdir64_r;
|
||||
|
||||
# s*
|
||||
scandir64;
|
||||
|
||||
# v*
|
||||
versionsort64;
|
||||
}
|
||||
GLIBC_2.3.3 {
|
||||
posix_fadvise64; posix_fallocate64;
|
||||
}
|
||||
}
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/alphasort64.c>
|
@ -1,73 +0,0 @@
|
||||
/* Definition of `struct sigcontext' for Linux/ARM
|
||||
Copyright (C) 1996, 1997, 1998, 1999, 2000 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
/* The format of struct sigcontext changed between 2.0 and 2.1 kernels.
|
||||
Fortunately 2.0 puts a magic number in the first word and this is not
|
||||
a legal value for `trap_no', so we can tell them apart. */
|
||||
|
||||
/* Early 2.2 and 2.3 kernels do not have the `fault_address' member in
|
||||
the sigcontext structure. Unfortunately there is no reliable way
|
||||
to test for its presence and this word will contain garbage for too-old
|
||||
kernels. Versions 2.2.14 and 2.3.35 (plus later versions) are known to
|
||||
include this element. */
|
||||
|
||||
#ifndef __ARMSIGCTX_H
|
||||
#define __ARMSIGCTX_H 1
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
union k_sigcontext
|
||||
{
|
||||
struct
|
||||
{
|
||||
unsigned long int trap_no;
|
||||
unsigned long int error_code;
|
||||
unsigned long int oldmask;
|
||||
unsigned long int arm_r0;
|
||||
unsigned long int arm_r1;
|
||||
unsigned long int arm_r2;
|
||||
unsigned long int arm_r3;
|
||||
unsigned long int arm_r4;
|
||||
unsigned long int arm_r5;
|
||||
unsigned long int arm_r6;
|
||||
unsigned long int arm_r7;
|
||||
unsigned long int arm_r8;
|
||||
unsigned long int arm_r9;
|
||||
unsigned long int arm_r10;
|
||||
unsigned long int arm_fp;
|
||||
unsigned long int arm_ip;
|
||||
unsigned long int arm_sp;
|
||||
unsigned long int arm_lr;
|
||||
unsigned long int arm_pc;
|
||||
unsigned long int arm_cpsr;
|
||||
unsigned long fault_address;
|
||||
} v21;
|
||||
struct
|
||||
{
|
||||
unsigned long int magic;
|
||||
struct pt_regs reg;
|
||||
unsigned long int trap_no;
|
||||
unsigned long int error_code;
|
||||
unsigned long int oldmask;
|
||||
} v20;
|
||||
};
|
||||
|
||||
#define SIGCONTEXT_2_0_MAGIC 0x4B534154
|
||||
|
||||
#endif /* bits/armsigctx.h */
|
@ -1,189 +0,0 @@
|
||||
/* O_*, F_*, FD_* bit values for Linux.
|
||||
Copyright (C) 1995-1998, 2000, 2004 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#ifndef _FCNTL_H
|
||||
# error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
|
||||
#endif
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
|
||||
located on an ext2 file system */
|
||||
#define O_ACCMODE 0003
|
||||
#define O_RDONLY 00
|
||||
#define O_WRONLY 01
|
||||
#define O_RDWR 02
|
||||
#define O_CREAT 0100 /* not fcntl */
|
||||
#define O_EXCL 0200 /* not fcntl */
|
||||
#define O_NOCTTY 0400 /* not fcntl */
|
||||
#define O_TRUNC 01000 /* not fcntl */
|
||||
#define O_APPEND 02000
|
||||
#define O_NONBLOCK 04000
|
||||
#define O_NDELAY O_NONBLOCK
|
||||
#define O_SYNC 010000
|
||||
#define O_FSYNC O_SYNC
|
||||
#define O_ASYNC 020000
|
||||
|
||||
#ifdef __USE_GNU
|
||||
# define O_DIRECTORY 040000 /* Must be a directory. */
|
||||
# define O_NOFOLLOW 0100000 /* Do not follow links. */
|
||||
# define O_DIRECT 0200000 /* Direct disk access. */
|
||||
# define O_NOATIME 01000000 /* Do not set atime. */
|
||||
#endif
|
||||
|
||||
#ifdef __USE_LARGEFILE64
|
||||
# define O_LARGEFILE 0400000
|
||||
#endif
|
||||
|
||||
/* For now Linux has synchronisity options for data and read operations.
|
||||
We define the symbols here but let them do the same as O_SYNC since
|
||||
this is a superset. */
|
||||
#if defined __USE_POSIX199309 || defined __USE_UNIX98
|
||||
# define O_DSYNC O_SYNC /* Synchronize data. */
|
||||
# define O_RSYNC O_SYNC /* Synchronize read operations. */
|
||||
#endif
|
||||
|
||||
/* Values for the second argument to `fcntl'. */
|
||||
#define F_DUPFD 0 /* Duplicate file descriptor. */
|
||||
#define F_GETFD 1 /* Get file descriptor flags. */
|
||||
#define F_SETFD 2 /* Set file descriptor flags. */
|
||||
#define F_GETFL 3 /* Get file status flags. */
|
||||
#define F_SETFL 4 /* Set file status flags. */
|
||||
|
||||
#ifndef __USE_FILE_OFFSET64
|
||||
# define F_GETLK 5 /* Get record locking info. */
|
||||
# define F_SETLK 6 /* Set record locking info (non-blocking). */
|
||||
# define F_SETLKW 7 /* Set record locking info (blocking). */
|
||||
#else
|
||||
# define F_GETLK F_GETLK64 /* Get record locking info. */
|
||||
# define F_SETLK F_SETLK64 /* Set record locking info (non-blocking).*/
|
||||
# define F_SETLKW F_SETLKW64 /* Set record locking info (blocking). */
|
||||
#endif
|
||||
#define F_GETLK64 12 /* Get record locking info. */
|
||||
#define F_SETLK64 13 /* Set record locking info (non-blocking). */
|
||||
#define F_SETLKW64 14 /* Set record locking info (blocking). */
|
||||
|
||||
#if defined __USE_BSD || defined __USE_UNIX98
|
||||
# define F_SETOWN 8 /* Get owner of socket (receiver of SIGIO). */
|
||||
# define F_GETOWN 9 /* Set owner of socket (receiver of SIGIO). */
|
||||
#endif
|
||||
|
||||
#ifdef __USE_GNU
|
||||
# define F_SETSIG 10 /* Set number of signal to be sent. */
|
||||
# define F_GETSIG 11 /* Get number of signal to be sent. */
|
||||
#endif
|
||||
|
||||
#ifdef __USE_GNU
|
||||
# define F_SETLEASE 1024 /* Set a lease. */
|
||||
# define F_GETLEASE 1025 /* Enquire what lease is active. */
|
||||
# define F_NOTIFY 1026 /* Request notfications on a directory. */
|
||||
#endif
|
||||
|
||||
/* For F_[GET|SET]FL. */
|
||||
#define FD_CLOEXEC 1 /* actually anything with low bit set goes */
|
||||
|
||||
/* For posix fcntl() and `l_type' field of a `struct flock' for lockf(). */
|
||||
#define F_RDLCK 0 /* Read lock. */
|
||||
#define F_WRLCK 1 /* Write lock. */
|
||||
#define F_UNLCK 2 /* Remove lock. */
|
||||
|
||||
/* for old implementation of bsd flock () */
|
||||
#define F_EXLCK 4 /* or 3 */
|
||||
#define F_SHLCK 8 /* or 4 */
|
||||
|
||||
#ifdef __USE_BSD
|
||||
/* Operations for bsd flock(), also used by the kernel implementation */
|
||||
# define LOCK_SH 1 /* shared lock */
|
||||
# define LOCK_EX 2 /* exclusive lock */
|
||||
# define LOCK_NB 4 /* or'd with one of the above to prevent
|
||||
blocking */
|
||||
# define LOCK_UN 8 /* remove lock */
|
||||
#endif
|
||||
|
||||
#ifdef __USE_GNU
|
||||
# define LOCK_MAND 32 /* This is a mandatory flock: */
|
||||
# define LOCK_READ 64 /* ... which allows concurrent read operations. */
|
||||
# define LOCK_WRITE 128 /* ... which allows concurrent write operations. */
|
||||
# define LOCK_RW 192 /* ... Which allows concurrent read & write operations. */
|
||||
#endif
|
||||
|
||||
#ifdef __USE_GNU
|
||||
/* Types of directory notifications that may be requested with F_NOTIFY. */
|
||||
# define DN_ACCESS 0x00000001 /* File accessed. */
|
||||
# define DN_MODIFY 0x00000002 /* File modified. */
|
||||
# define DN_CREATE 0x00000004 /* File created. */
|
||||
# define DN_DELETE 0x00000008 /* File removed. */
|
||||
# define DN_RENAME 0x00000010 /* File renamed. */
|
||||
# define DN_ATTRIB 0x00000020 /* File changed attibutes. */
|
||||
# define DN_MULTISHOT 0x80000000 /* Don't remove notifier. */
|
||||
#endif
|
||||
|
||||
struct flock
|
||||
{
|
||||
short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
|
||||
short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
|
||||
#ifndef __USE_FILE_OFFSET64
|
||||
__off_t l_start; /* Offset where the lock begins. */
|
||||
__off_t l_len; /* Size of the locked area; zero means until EOF. */
|
||||
#else
|
||||
__off64_t l_start; /* Offset where the lock begins. */
|
||||
__off64_t l_len; /* Size of the locked area; zero means until EOF. */
|
||||
#endif
|
||||
__pid_t l_pid; /* Process holding the lock. */
|
||||
};
|
||||
|
||||
#ifdef __USE_LARGEFILE64
|
||||
struct flock64
|
||||
{
|
||||
short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
|
||||
short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
|
||||
__off64_t l_start; /* Offset where the lock begins. */
|
||||
__off64_t l_len; /* Size of the locked area; zero means until EOF. */
|
||||
__pid_t l_pid; /* Process holding the lock. */
|
||||
};
|
||||
#endif
|
||||
|
||||
/* Define some more compatibility macros to be backward compatible with
|
||||
BSD systems which did not managed to hide these kernel macros. */
|
||||
#ifdef __USE_BSD
|
||||
# define FAPPEND O_APPEND
|
||||
# define FFSYNC O_FSYNC
|
||||
# define FASYNC O_ASYNC
|
||||
# define FNONBLOCK O_NONBLOCK
|
||||
# define FNDELAY O_NDELAY
|
||||
#endif /* Use BSD. */
|
||||
|
||||
/* Advise to `posix_fadvise'. */
|
||||
#ifdef __USE_XOPEN2K
|
||||
# define POSIX_FADV_NORMAL 0 /* No further special treatment. */
|
||||
# define POSIX_FADV_RANDOM 1 /* Expect random page references. */
|
||||
# define POSIX_FADV_SEQUENTIAL 2 /* Expect sequential page references. */
|
||||
# define POSIX_FADV_WILLNEED 3 /* Will need these pages. */
|
||||
# define POSIX_FADV_DONTNEED 4 /* Don't need these pages. */
|
||||
# define POSIX_FADV_NOREUSE 5 /* Data will be accessed once. */
|
||||
#endif
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
/* Provide kernel hint to read ahead. */
|
||||
extern ssize_t readahead (int __fd, __off64_t __offset, size_t __count)
|
||||
__THROW;
|
||||
|
||||
__END_DECLS
|
@ -1,99 +0,0 @@
|
||||
/* Definitions for POSIX memory map interface. Linux/ARM version.
|
||||
Copyright (C) 1997, 2000, 2003 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#ifndef _SYS_MMAN_H
|
||||
# error "Never include this file directly. Use <sys/mman.h> instead"
|
||||
#endif
|
||||
|
||||
/* The following definitions basically come from the kernel headers.
|
||||
But the kernel header is not namespace clean. */
|
||||
|
||||
|
||||
/* Protections are chosen from these bits, OR'd together. The
|
||||
implementation does not necessarily support PROT_EXEC or PROT_WRITE
|
||||
without PROT_READ. The only guarantees are that no writing will be
|
||||
allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
|
||||
|
||||
#define PROT_READ 0x1 /* Page can be read. */
|
||||
#define PROT_WRITE 0x2 /* Page can be written. */
|
||||
#define PROT_EXEC 0x4 /* Page can be executed. */
|
||||
#define PROT_NONE 0x0 /* Page can not be accessed. */
|
||||
#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
|
||||
growsdown vma (mprotect only). */
|
||||
#define PROT_GROWSUP 0x02000000 /* Extend change to start of
|
||||
growsup vma (mprotect only). */
|
||||
|
||||
/* Sharing types (must choose one and only one of these). */
|
||||
#define MAP_SHARED 0x01 /* Share changes. */
|
||||
#define MAP_PRIVATE 0x02 /* Changes are private. */
|
||||
#ifdef __USE_MISC
|
||||
# define MAP_TYPE 0x0f /* Mask for type of mapping. */
|
||||
#endif
|
||||
|
||||
/* Other flags. */
|
||||
#define MAP_FIXED 0x10 /* Interpret addr exactly. */
|
||||
#ifdef __USE_MISC
|
||||
# define MAP_FILE 0
|
||||
# define MAP_ANONYMOUS 0x20 /* Don't use a file. */
|
||||
# define MAP_ANON MAP_ANONYMOUS
|
||||
#endif
|
||||
|
||||
/* These are Linux-specific. */
|
||||
#ifdef __USE_MISC
|
||||
# define MAP_GROWSDOWN 0x00100 /* Stack-like segment. */
|
||||
# define MAP_DENYWRITE 0x00800 /* ETXTBSY */
|
||||
# define MAP_EXECUTABLE 0x01000 /* Mark it as an executable. */
|
||||
# define MAP_LOCKED 0x02000 /* Lock the mapping. */
|
||||
# define MAP_NORESERVE 0x04000 /* Don't check for reservations. */
|
||||
# define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */
|
||||
# define MAP_NONBLOCK 0x10000 /* Do not block on IO. */
|
||||
#endif
|
||||
|
||||
/* Flags to `msync'. */
|
||||
#define MS_ASYNC 1 /* Sync memory asynchronously. */
|
||||
#define MS_SYNC 4 /* Synchronous memory sync. */
|
||||
#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
|
||||
space. */
|
||||
|
||||
/* Flags for `mremap'. */
|
||||
#ifdef __USE_GNU
|
||||
# define MREMAP_MAYMOVE 1
|
||||
#endif
|
||||
|
||||
/* Advice to `madvise'. */
|
||||
#ifdef __USE_BSD
|
||||
# define MADV_NORMAL 0 /* No further special treatment. */
|
||||
# define MADV_RANDOM 1 /* Expect random page references. */
|
||||
# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
|
||||
# define MADV_WILLNEED 3 /* Will need these pages. */
|
||||
# define MADV_DONTNEED 4 /* Don't need these pages. */
|
||||
#endif
|
||||
|
||||
/* The POSIX people had to invent similar names for the same things. */
|
||||
#ifdef __USE_XOPEN2K
|
||||
# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
|
||||
# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
|
||||
# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
|
||||
# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
|
||||
# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
|
||||
#endif
|
@ -1,49 +0,0 @@
|
||||
/* 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; 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)
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/m68k/chown.c>
|
@ -1,60 +0,0 @@
|
||||
/* Copyright (C) 1996, 1997, 1998, 1999, 2002 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
/* clone() is even more special than fork() as it mucks with stacks
|
||||
and invokes a function in the right context after its all over. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#define _ERRNO_H 1
|
||||
#include <bits/errno.h>
|
||||
|
||||
/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
|
||||
|
||||
.text
|
||||
ENTRY(__clone)
|
||||
@ sanity check args
|
||||
cmp r0, #0
|
||||
cmpne r1, #0
|
||||
moveq r0, #-EINVAL
|
||||
beq PLTJMP(syscall_error)
|
||||
|
||||
@ insert the args onto the new stack
|
||||
str r3, [r1, #-4]!
|
||||
str r0, [r1, #-4]!
|
||||
|
||||
@ do the system call
|
||||
@ get flags
|
||||
mov r0, r2
|
||||
@ new sp is already in r1
|
||||
swi SYS_ify(clone)
|
||||
movs a1, a1
|
||||
blt PLTJMP(C_SYMBOL_NAME(__syscall_error))
|
||||
RETINSTR(ne, lr)
|
||||
|
||||
@ 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
|
||||
b PLTJMP(_exit)
|
||||
|
||||
PSEUDO_END (__clone)
|
||||
|
||||
weak_alias (__clone, clone)
|
@ -1,64 +0,0 @@
|
||||
/* Data for Linux/ARM version of processor capability information.
|
||||
Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Philip Blundell <philb@gnu.org>, 2001.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
/* This information must be kept in sync with the _DL_HWCAP_COUNT and
|
||||
_DL_PLATFORM_COUNT definitions in procinfo.h.
|
||||
|
||||
If anything should be added here check whether the size of each string
|
||||
is still ok with the given array size.
|
||||
|
||||
All the #ifdefs in the definitions ar equite irritating but
|
||||
necessary if we want to avoid duplicating the information. There
|
||||
are three different modes:
|
||||
|
||||
- PROCINFO_DECL is defined. This means we are only interested in
|
||||
declarations.
|
||||
|
||||
- PROCINFO_DECL is not defined:
|
||||
|
||||
+ if SHARED is defined the file is included in an array
|
||||
initializer. The .element = { ... } syntax is needed.
|
||||
|
||||
+ if SHARED is not defined a normal array initialization is
|
||||
needed.
|
||||
*/
|
||||
|
||||
#ifndef PROCINFO_CLASS
|
||||
#define PROCINFO_CLASS
|
||||
#endif
|
||||
|
||||
#if !defined PROCINFO_DECL && defined SHARED
|
||||
._dl_arm_cap_flags
|
||||
#else
|
||||
PROCINFO_CLASS const char _dl_arm_cap_flags[8][10]
|
||||
#endif
|
||||
#ifndef PROCINFO_DECL
|
||||
= {
|
||||
"swp", "half", "thumb", "26bit", "fast-mult", "fpa", "vfp", "edsp",
|
||||
}
|
||||
#endif
|
||||
#if !defined SHARED || defined PROCINFO_DECL
|
||||
;
|
||||
#else
|
||||
,
|
||||
#endif
|
||||
|
||||
#undef PROCINFO_DECL
|
||||
#undef PROCINFO_CLASS
|
@ -1,86 +0,0 @@
|
||||
/* Linux/ARM version of processor capability information handling macros.
|
||||
Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Philip Blundell <philb@gnu.org>, 2001.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#ifndef _DL_PROCINFO_H
|
||||
#define _DL_PROCINFO_H 1
|
||||
|
||||
#include <ldsodefs.h>
|
||||
|
||||
#define _DL_HWCAP_COUNT 8
|
||||
|
||||
/* The kernel provides platform data but it is not interesting. */
|
||||
#define _DL_HWCAP_PLATFORM 0
|
||||
|
||||
|
||||
static inline int
|
||||
__attribute__ ((unused))
|
||||
_dl_procinfo (int word)
|
||||
{
|
||||
int i;
|
||||
|
||||
_dl_printf ("AT_HWCAP: ");
|
||||
|
||||
for (i = 0; i < _DL_HWCAP_COUNT; ++i)
|
||||
if (word & (1 << i))
|
||||
_dl_printf (" %s", GLRO(dl_arm_cap_flags)[i]);
|
||||
|
||||
_dl_printf ("\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline const char *
|
||||
__attribute__ ((unused))
|
||||
_dl_hwcap_string (int idx)
|
||||
{
|
||||
return GLRO(dl_arm_cap_flags)[idx];
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
HWCAP_ARM_SWP = 1 << 0,
|
||||
HWCAP_ARM_HALF = 1 << 1,
|
||||
HWCAP_ARM_THUMB = 1 << 2,
|
||||
HWCAP_ARM_26BIT = 1 << 3,
|
||||
HWCAP_ARM_FAST_MULT = 1 << 4,
|
||||
HWCAP_ARM_FPA = 1 << 5,
|
||||
HWCAP_ARM_VFP = 1 << 6,
|
||||
HWCAP_ARM_EDSP = 1 << 7,
|
||||
|
||||
HWCAP_IMPORTANT = (HWCAP_ARM_HALF | HWCAP_ARM_FAST_MULT)
|
||||
};
|
||||
|
||||
static inline int
|
||||
__attribute__ ((unused))
|
||||
_dl_string_hwcap (const char *str)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < _DL_HWCAP_COUNT; i++)
|
||||
{
|
||||
if (strcmp (str, GLRO(dl_arm_cap_flags)[i]) == 0)
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
};
|
||||
|
||||
#define _dl_string_platform(str) (-1)
|
||||
|
||||
#endif /* dl-procinfo.h */
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/fchown.c>
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/fxstat.c>
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/getdents64.c>
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/getegid.c>
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/geteuid.c>
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/getgid.c>
|
@ -1,2 +0,0 @@
|
||||
/* We also have to rewrite the kernel gid_t to the user land type. */
|
||||
#include <sysdeps/unix/sysv/linux/i386/getgroups.c>
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/getresgid.c>
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/getresuid.c>
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/getrlimit.c>
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/getrlimit64.c>
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/getuid.c>
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/glob64.c>
|
@ -1,274 +0,0 @@
|
||||
/* Copyright (C) 1998, 1999, 2003 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Phil Blundell, based on the Alpha version by
|
||||
David Mosberger.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
/* I/O port access on the ARM is something of a fiction. What we do is to
|
||||
map an appropriate area of /dev/mem into user space so that a program
|
||||
can blast away at the hardware in such a way as to generate I/O cycles
|
||||
on the bus. To insulate user code from dependencies on particular
|
||||
hardware we don't allow calls to inb() and friends to be inlined, but
|
||||
force them to come through code in here every time. Performance-critical
|
||||
registers tend to be memory mapped these days so this should be no big
|
||||
problem. */
|
||||
|
||||
/* Once upon a time this file used mprotect to enable and disable
|
||||
access to particular areas of I/O space. Unfortunately the
|
||||
mprotect syscall also has the side effect of enabling caching for
|
||||
the area affected (this is a kernel limitation). So we now just
|
||||
enable all the ports all of the time. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
#define PATH_ARM_SYSTYPE "/etc/arm_systype"
|
||||
#define PATH_CPUINFO "/proc/cpuinfo"
|
||||
|
||||
#define MAX_PORT 0x10000
|
||||
|
||||
static struct {
|
||||
unsigned long int base;
|
||||
unsigned long int io_base;
|
||||
unsigned int shift;
|
||||
unsigned int initdone; /* since all the above could be 0 */
|
||||
} io;
|
||||
|
||||
#define IO_BASE_FOOTBRIDGE 0x7c000000
|
||||
#define IO_SHIFT_FOOTBRIDGE 0
|
||||
|
||||
static struct platform {
|
||||
const char *name;
|
||||
unsigned long int io_base;
|
||||
unsigned int shift;
|
||||
} platform[] = {
|
||||
/* All currently supported platforms are in fact the same. :-) */
|
||||
{"Chalice-CATS", IO_BASE_FOOTBRIDGE, IO_SHIFT_FOOTBRIDGE},
|
||||
{"DEC-EBSA285", IO_BASE_FOOTBRIDGE, IO_SHIFT_FOOTBRIDGE},
|
||||
{"Corel-NetWinder", IO_BASE_FOOTBRIDGE, IO_SHIFT_FOOTBRIDGE},
|
||||
{"Rebel-NetWinder", IO_BASE_FOOTBRIDGE, IO_SHIFT_FOOTBRIDGE},
|
||||
};
|
||||
|
||||
#define IO_ADDR(port) (io.base + ((port) << io.shift))
|
||||
|
||||
/*
|
||||
* Initialize I/O system. There are several ways to get the information
|
||||
* we need. Each is tried in turn until one succeeds.
|
||||
*
|
||||
* 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*). This is the preferred method
|
||||
* but not all kernels support it.
|
||||
*
|
||||
* 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE.
|
||||
* - If it matches one of the entries in the table above, use the
|
||||
* corresponding values.
|
||||
* - If it begins with a number, assume this is a previously
|
||||
* unsupported system and the values encode, in order,
|
||||
* "<io_base>,<port_shift>".
|
||||
*
|
||||
* 3. Lookup the "system type" field in /proc/cpuinfo. Again, if it
|
||||
* matches an entry in the platform[] table, use the corresponding
|
||||
* values.
|
||||
*/
|
||||
|
||||
static int
|
||||
init_iosys (void)
|
||||
{
|
||||
char systype[256];
|
||||
int i, n;
|
||||
static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE };
|
||||
static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT };
|
||||
size_t len = sizeof(io.base);
|
||||
|
||||
if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0)
|
||||
&& ! sysctl (ioshift_name, 3, &io.shift, &len, NULL, 0))
|
||||
{
|
||||
io.initdone = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
n = readlink (PATH_ARM_SYSTYPE, systype, sizeof (systype) - 1);
|
||||
if (n > 0)
|
||||
{
|
||||
systype[n] = '\0';
|
||||
if (isdigit (systype[0]))
|
||||
{
|
||||
if (sscanf (systype, "%li,%i", &io.io_base, &io.shift) == 2)
|
||||
{
|
||||
io.initdone = 1;
|
||||
return 0;
|
||||
}
|
||||
/* else we're likely going to fail with the system match below */
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
FILE * fp;
|
||||
|
||||
fp = fopen (PATH_CPUINFO, "r");
|
||||
if (! fp)
|
||||
return -1;
|
||||
while ((n = fscanf (fp, "Hardware\t: %256[^\n]\n", systype))
|
||||
!= EOF)
|
||||
{
|
||||
if (n == 1)
|
||||
break;
|
||||
else
|
||||
fgets (systype, 256, fp);
|
||||
}
|
||||
fclose (fp);
|
||||
|
||||
if (n == EOF)
|
||||
{
|
||||
/* this can happen if the format of /proc/cpuinfo changes... */
|
||||
fprintf (stderr,
|
||||
"ioperm: Unable to determine system type.\n"
|
||||
"\t(May need " PATH_ARM_SYSTYPE " symlink?)\n");
|
||||
__set_errno (ENODEV);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* translate systype name into i/o system: */
|
||||
for (i = 0; i < sizeof (platform) / sizeof (platform[0]); ++i)
|
||||
{
|
||||
if (strcmp (platform[i].name, systype) == 0)
|
||||
{
|
||||
io.shift = platform[i].shift;
|
||||
io.io_base = platform[i].io_base;
|
||||
io.initdone = 1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* systype is not a known platform name... */
|
||||
__set_errno (ENODEV);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
_ioperm (unsigned long int from, unsigned long int num, int turn_on)
|
||||
{
|
||||
if (! io.initdone && init_iosys () < 0)
|
||||
return -1;
|
||||
|
||||
/* this test isn't as silly as it may look like; consider overflows! */
|
||||
if (from >= MAX_PORT || from + num > MAX_PORT)
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (turn_on)
|
||||
{
|
||||
if (! io.base)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = open ("/dev/mem", O_RDWR);
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
|
||||
io.base =
|
||||
(unsigned long int) __mmap (0, MAX_PORT << io.shift,
|
||||
PROT_READ | PROT_WRITE,
|
||||
MAP_SHARED, fd, io.io_base);
|
||||
close (fd);
|
||||
if ((long) io.base == -1)
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
_iopl (unsigned int level)
|
||||
{
|
||||
if (level > 3)
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
return -1;
|
||||
}
|
||||
if (level)
|
||||
{
|
||||
return _ioperm (0, MAX_PORT, 1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_outb (unsigned char b, unsigned long int port)
|
||||
{
|
||||
*((volatile unsigned char *)(IO_ADDR (port))) = b;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_outw (unsigned short b, unsigned long int port)
|
||||
{
|
||||
*((volatile unsigned short *)(IO_ADDR (port))) = b;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_outl (unsigned int b, unsigned long int port)
|
||||
{
|
||||
*((volatile unsigned long *)(IO_ADDR (port))) = b;
|
||||
}
|
||||
|
||||
|
||||
unsigned int
|
||||
_inb (unsigned long int port)
|
||||
{
|
||||
return *((volatile unsigned char *)(IO_ADDR (port)));
|
||||
}
|
||||
|
||||
|
||||
unsigned int
|
||||
_inw (unsigned long int port)
|
||||
{
|
||||
return *((volatile unsigned short *)(IO_ADDR (port)));
|
||||
}
|
||||
|
||||
|
||||
unsigned int
|
||||
_inl (unsigned long int port)
|
||||
{
|
||||
return *((volatile unsigned long *)(IO_ADDR (port)));
|
||||
}
|
||||
|
||||
weak_alias (_ioperm, ioperm);
|
||||
weak_alias (_iopl, iopl);
|
||||
weak_alias (_inb, inb);
|
||||
weak_alias (_inw, inw);
|
||||
weak_alias (_inl, inl);
|
||||
weak_alias (_outb, outb);
|
||||
weak_alias (_outw, outw);
|
||||
weak_alias (_outl, outl);
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/lchown.c>
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/lockf64.c>
|
@ -1,2 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/lxstat.c>
|
||||
|
@ -1,92 +0,0 @@
|
||||
/* Copyright (C) 1998, 2000, 2003 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <kernel-features.h>
|
||||
|
||||
#define EINVAL 22
|
||||
|
||||
.text
|
||||
|
||||
ENTRY (__mmap)
|
||||
# ifdef __ASSUME_MMAP2_SYSCALL
|
||||
/* This code is actually a couple of cycles slower than the
|
||||
sys_mmap version below, so it might seem like a loss. But the
|
||||
code path inside the kernel is sufficiently much shorter to
|
||||
make it a net gain to use mmap2 when it's known to be
|
||||
available. */
|
||||
|
||||
/* shuffle args */
|
||||
str r5, [sp, #-4]!
|
||||
ldr r5, [sp, #8]
|
||||
str r4, [sp, #-4]!
|
||||
ldr r4, [sp, #8]
|
||||
|
||||
/* convert offset to pages */
|
||||
movs ip, r5, lsl #20
|
||||
bne .Linval
|
||||
mov r5, r5, lsr #12
|
||||
|
||||
/* do the syscall */
|
||||
swi SYS_ify (mmap2)
|
||||
|
||||
/* restore registers */
|
||||
2:
|
||||
ldr r4, [sp], #4
|
||||
ldr r5, [sp], #4
|
||||
|
||||
cmn r0, $4096
|
||||
RETINSTR(cc, lr)
|
||||
b PLTJMP(syscall_error)
|
||||
|
||||
.Linval:
|
||||
mov r0, #-EINVAL
|
||||
b 2b
|
||||
# else
|
||||
/* Because we can only get five args through the syscall interface, and
|
||||
mmap() takes six, we need to build a parameter block and pass its
|
||||
address instead. The 386 port does a similar trick. */
|
||||
|
||||
/* This code previously moved sp into ip and stored the args using
|
||||
stmdb ip!, {a1-a4}. It did not modify sp, so the stack never had
|
||||
to be restored after the syscall completed. It saved an
|
||||
instruction and meant no stack cleanup work was required.
|
||||
|
||||
This will not work in the case of a mmap call being interrupted
|
||||
by a signal. If the signal handler uses any stack the arguments
|
||||
to mmap will be trashed. The results of a restart of mmap are
|
||||
then unpredictable. */
|
||||
|
||||
/* store args on the stack */
|
||||
stmdb sp!, {a1-a4}
|
||||
|
||||
/* do the syscall */
|
||||
mov a1, sp
|
||||
swi SYS_ify (mmap)
|
||||
|
||||
/* pop args off the stack. */
|
||||
add sp, sp, #16
|
||||
|
||||
cmn r0, $4096
|
||||
RETINSTR(cc, lr)
|
||||
b PLTJMP(syscall_error);
|
||||
#endif
|
||||
|
||||
PSEUDO_END (__mmap)
|
||||
|
||||
weak_alias (__mmap, mmap)
|
@ -1,80 +0,0 @@
|
||||
/* Copyright (C) 2000, 2003 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
#define EINVAL 22
|
||||
#define ENOSYS 38
|
||||
|
||||
#include "kernel-features.h"
|
||||
|
||||
/* The mmap2 system call takes six arguments, all in registers. */
|
||||
.text
|
||||
ENTRY (__mmap64)
|
||||
#ifdef __NR_mmap2
|
||||
ldr ip, [sp, $4] @ offset low part
|
||||
str r5, [sp, #-4]!
|
||||
ldr r5, [sp, $12] @ offset high part
|
||||
str r4, [sp, #-4]!
|
||||
movs r4, ip, lsl $20 @ check that offset is page-aligned
|
||||
mov ip, ip, lsr $12
|
||||
moveqs r4, r5, lsr $12 @ check for overflow
|
||||
bne .Linval
|
||||
ldr r4, [sp, $8] @ load fd
|
||||
orr r5, ip, r5, lsl $20 @ compose page offset
|
||||
mov ip, r0
|
||||
swi SYS_ify (mmap2)
|
||||
cmn r0, $4096
|
||||
# ifdef __ASSUME_MMAP2_SYSCALL
|
||||
ldr r4, [sp], #4
|
||||
ldr r5, [sp], #4
|
||||
RETINSTR(cc, lr)
|
||||
b PLTJMP(syscall_error)
|
||||
# else
|
||||
ldrcc r4, [sp], #4
|
||||
ldrcc r5, [sp], #4
|
||||
RETINSTR(cc, lr)
|
||||
cmn r0, $ENOSYS
|
||||
bne .Lerror
|
||||
/* The current kernel does not support mmap2. Fall back to plain
|
||||
mmap if the offset is small enough. */
|
||||
ldr r5, [sp, $16]
|
||||
mov r0, ip @ first arg was clobbered
|
||||
teq r5, $0
|
||||
ldreq r4, [sp], #4
|
||||
ldreq r5, [sp], #4
|
||||
beq PLTJMP(__mmap)
|
||||
# endif
|
||||
.Linval:
|
||||
mov r0, $-EINVAL
|
||||
.Lerror:
|
||||
ldr r4, [sp], #4
|
||||
ldr r5, [sp], #4
|
||||
b PLTJMP(syscall_error)
|
||||
#else
|
||||
/* The kernel headers do not support mmap2. Fall back to plain
|
||||
mmap if the offset is small enough. */
|
||||
ldr ip, [sp, $8]
|
||||
teq ip, $0
|
||||
beq PLTJMP(__mmap)
|
||||
mov r0, $-EINVAL
|
||||
b PLTJMP(syscall_error)
|
||||
#endif
|
||||
PSEUDO_END (__mmap64)
|
||||
|
||||
weak_alias (__mmap64, mmap64)
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/msgctl.c>
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/oldgetrlimit64.c>
|
@ -1,37 +0,0 @@
|
||||
/* Low-level statistical profiling support function. Linux/ARM version.
|
||||
Copyright (C) 1996, 1997, 1998, 2002 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 Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <signal.h>
|
||||
#include <bits/armsigctx.h>
|
||||
|
||||
void
|
||||
profil_counter (int signo, int _a2, int _a3, int _a4, union k_sigcontext sc)
|
||||
{
|
||||
void *pc;
|
||||
if (sc.v20.magic == SIGCONTEXT_2_0_MAGIC)
|
||||
pc = (void *) sc.v20.reg.ARM_pc;
|
||||
else
|
||||
pc = (void *) sc.v21.arm_pc;
|
||||
profil_count (pc);
|
||||
|
||||
/* This is a hack to prevent the compiler from implementing the
|
||||
above function call as a sibcall. The sibcall would overwrite
|
||||
the signal context. */
|
||||
asm volatile ("");
|
||||
}
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/readdir64.c>
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/readdir64_r.c>
|
@ -1,166 +0,0 @@
|
||||
/* Dump registers.
|
||||
Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Philip Blundell <pb@nexus.co.uk>, 1998.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sys/uio.h>
|
||||
#include <stdio-common/_itoa.h>
|
||||
#include <bits/armsigctx.h>
|
||||
|
||||
/* We will print the register dump in this format:
|
||||
|
||||
R0: XXXXXXXX R1: XXXXXXXX R2: XXXXXXXX R3: XXXXXXXX
|
||||
R4: XXXXXXXX R5: XXXXXXXX R6: XXXXXXXX R7: XXXXXXXX
|
||||
R8: XXXXXXXX R9: XXXXXXXX SL: XXXXXXXX FP: XXXXXXXX
|
||||
IP: XXXXXXXX SP: XXXXXXXX LR: XXXXXXXX PC: XXXXXXXX
|
||||
|
||||
CPSR: XXXXXXXX
|
||||
|
||||
Trap: XXXXXXXX Error: XXXXXXXX OldMask: XXXXXXXX
|
||||
Addr: XXXXXXXX
|
||||
|
||||
*/
|
||||
|
||||
static void
|
||||
hexvalue (unsigned long int value, char *buf, size_t len)
|
||||
{
|
||||
char *cp = _itoa_word (value, buf + len, 16, 0);
|
||||
while (cp > buf)
|
||||
*--cp = '0';
|
||||
}
|
||||
|
||||
static void
|
||||
register_dump (int fd, union k_sigcontext *ctx)
|
||||
{
|
||||
char regs[21][8];
|
||||
struct iovec iov[97];
|
||||
size_t nr = 0;
|
||||
|
||||
#define ADD_STRING(str) \
|
||||
iov[nr].iov_base = (char *) str; \
|
||||
iov[nr].iov_len = strlen (str); \
|
||||
++nr
|
||||
#define ADD_MEM(str, len) \
|
||||
iov[nr].iov_base = str; \
|
||||
iov[nr].iov_len = len; \
|
||||
++nr
|
||||
|
||||
/* Generate strings of register contents. */
|
||||
if (ctx->v20.magic == SIGCONTEXT_2_0_MAGIC)
|
||||
{
|
||||
hexvalue (ctx->v20.reg.ARM_r0, regs[0], 8);
|
||||
hexvalue (ctx->v20.reg.ARM_r1, regs[1], 8);
|
||||
hexvalue (ctx->v20.reg.ARM_r2, regs[2], 8);
|
||||
hexvalue (ctx->v20.reg.ARM_r3, regs[3], 8);
|
||||
hexvalue (ctx->v20.reg.ARM_r4, regs[4], 8);
|
||||
hexvalue (ctx->v20.reg.ARM_r5, regs[5], 8);
|
||||
hexvalue (ctx->v20.reg.ARM_r6, regs[6], 8);
|
||||
hexvalue (ctx->v20.reg.ARM_r7, regs[7], 8);
|
||||
hexvalue (ctx->v20.reg.ARM_r8, regs[8], 8);
|
||||
hexvalue (ctx->v20.reg.ARM_r9, regs[9], 8);
|
||||
hexvalue (ctx->v20.reg.ARM_r10, regs[10], 8);
|
||||
hexvalue (ctx->v20.reg.ARM_fp, regs[11], 8);
|
||||
hexvalue (ctx->v20.reg.ARM_ip, regs[12], 8);
|
||||
hexvalue (ctx->v20.reg.ARM_sp, regs[13], 8);
|
||||
hexvalue (ctx->v20.reg.ARM_lr, regs[14], 8);
|
||||
hexvalue (ctx->v20.reg.ARM_pc, regs[15], 8);
|
||||
hexvalue (ctx->v20.reg.ARM_cpsr, regs[16], 8);
|
||||
hexvalue (ctx->v20.trap_no, regs[17], 8);
|
||||
hexvalue (ctx->v20.error_code, regs[18], 8);
|
||||
hexvalue (ctx->v20.oldmask, regs[19], 8);
|
||||
}
|
||||
else
|
||||
{
|
||||
hexvalue (ctx->v21.arm_r0, regs[0], 8);
|
||||
hexvalue (ctx->v21.arm_r1, regs[1], 8);
|
||||
hexvalue (ctx->v21.arm_r2, regs[2], 8);
|
||||
hexvalue (ctx->v21.arm_r3, regs[3], 8);
|
||||
hexvalue (ctx->v21.arm_r4, regs[4], 8);
|
||||
hexvalue (ctx->v21.arm_r5, regs[5], 8);
|
||||
hexvalue (ctx->v21.arm_r6, regs[6], 8);
|
||||
hexvalue (ctx->v21.arm_r7, regs[7], 8);
|
||||
hexvalue (ctx->v21.arm_r8, regs[8], 8);
|
||||
hexvalue (ctx->v21.arm_r9, regs[9], 8);
|
||||
hexvalue (ctx->v21.arm_r10, regs[10], 8);
|
||||
hexvalue (ctx->v21.arm_fp, regs[11], 8);
|
||||
hexvalue (ctx->v21.arm_ip, regs[12], 8);
|
||||
hexvalue (ctx->v21.arm_sp, regs[13], 8);
|
||||
hexvalue (ctx->v21.arm_lr, regs[14], 8);
|
||||
hexvalue (ctx->v21.arm_pc, regs[15], 8);
|
||||
hexvalue (ctx->v21.arm_cpsr, regs[16], 8);
|
||||
hexvalue (ctx->v21.trap_no, regs[17], 8);
|
||||
hexvalue (ctx->v21.error_code, regs[18], 8);
|
||||
hexvalue (ctx->v21.oldmask, regs[19], 8);
|
||||
hexvalue (ctx->v21.fault_address, regs[20], 8);
|
||||
}
|
||||
|
||||
/* Generate the output. */
|
||||
ADD_STRING ("Register dump:\n\n R0: ");
|
||||
ADD_MEM (regs[0], 8);
|
||||
ADD_STRING (" R1: ");
|
||||
ADD_MEM (regs[1], 8);
|
||||
ADD_STRING (" R2: ");
|
||||
ADD_MEM (regs[2], 8);
|
||||
ADD_STRING (" R3: ");
|
||||
ADD_MEM (regs[3], 8);
|
||||
ADD_STRING ("\n R4: ");
|
||||
ADD_MEM (regs[4], 8);
|
||||
ADD_STRING (" R5: ");
|
||||
ADD_MEM (regs[5], 8);
|
||||
ADD_STRING (" R6: ");
|
||||
ADD_MEM (regs[6], 8);
|
||||
ADD_STRING (" R7: ");
|
||||
ADD_MEM (regs[7], 8);
|
||||
ADD_STRING ("\n R8: ");
|
||||
ADD_MEM (regs[8], 8);
|
||||
ADD_STRING (" R9: ");
|
||||
ADD_MEM (regs[9], 8);
|
||||
ADD_STRING (" SL: ");
|
||||
ADD_MEM (regs[10], 8);
|
||||
ADD_STRING (" FP: ");
|
||||
ADD_MEM (regs[11], 8);
|
||||
ADD_STRING ("\n IP: ");
|
||||
ADD_MEM (regs[12], 8);
|
||||
ADD_STRING (" SP: ");
|
||||
ADD_MEM (regs[13], 8);
|
||||
ADD_STRING (" LR: ");
|
||||
ADD_MEM (regs[14], 8);
|
||||
ADD_STRING (" PC: ");
|
||||
ADD_MEM (regs[15], 8);
|
||||
ADD_STRING ("\n\n CPSR: ");
|
||||
ADD_MEM (regs[16], 8);
|
||||
ADD_STRING ("\n\n Trap: ");
|
||||
ADD_MEM (regs[17], 8);
|
||||
ADD_STRING (" Error: ");
|
||||
ADD_MEM (regs[18], 8);
|
||||
ADD_STRING (" OldMask: ");
|
||||
ADD_MEM (regs[19], 8);
|
||||
if (ctx->v20.magic != SIGCONTEXT_2_0_MAGIC)
|
||||
{
|
||||
ADD_STRING ("\n Addr: ");
|
||||
ADD_MEM (regs[20], 8);
|
||||
}
|
||||
|
||||
ADD_STRING ("\n");
|
||||
|
||||
/* Write the stuff out. */
|
||||
writev (fd, iov, nr);
|
||||
}
|
||||
|
||||
|
||||
#define REGISTER_DUMP register_dump (fd, &ctx)
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/scandir64.c>
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/semctl.c>
|
@ -1 +0,0 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/setegid.c>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user