1999-04-12  Philip Blundell  <philb@gnu.org>

	* elf/elf.h: Update ARM definitions to match current gas2.

	* sysdeps/arm/bits/endian.h: Support big endian operation.

	* sysdeps/unix/sysv/linux/arm/ioperm.c (_outw, _outb, _outl):
	Don't bother range checking the port number.

	* sysdeps/unix/sysv/linux/arm/vfork.S: New file.

	* sysdeps/unix/sysv/linux/arm/sysdep.h (INLINE_SYSCALL): Include
	the syscall name in assembler output for ease of debugging.

	* sysdeps/unix/sysv/linux/arm/sigaction.c: Don't rely on undefined
	compiler behaviour.
	* sysdeps/unix/sysv/linux/arm/sigrestorer.S: New file.
	* sysdeps/unix/sysv/linux/arm/Makefile [$(subdir) = signal]
	(sysdep_routines): Add sigrestorer.

	* string/tester.c (test_strcpy): Add new tests for unaligned
	arguments.
	* sysdeps/arm/bits/string.h: Delete inline implementations of
	strcpy and stpcpy.
This commit is contained in:
Ulrich Drepper 1999-04-12 09:05:16 +00:00
parent eb822fcf6f
commit a64e578b6f
11 changed files with 149 additions and 160 deletions

View File

@ -1,3 +1,28 @@
1999-04-12 Philip Blundell <philb@gnu.org>
* elf/elf.h: Update ARM definitions to match current gas2.
* sysdeps/arm/bits/endian.h: Support big endian operation.
* sysdeps/unix/sysv/linux/arm/ioperm.c (_outw, _outb, _outl):
Don't bother range checking the port number.
* sysdeps/unix/sysv/linux/arm/vfork.S: New file.
* sysdeps/unix/sysv/linux/arm/sysdep.h (INLINE_SYSCALL): Include
the syscall name in assembler output for ease of debugging.
* sysdeps/unix/sysv/linux/arm/sigaction.c: Don't rely on undefined
compiler behaviour.
* sysdeps/unix/sysv/linux/arm/sigrestorer.S: New file.
* sysdeps/unix/sysv/linux/arm/Makefile [$(subdir) = signal]
(sysdep_routines): Add sigrestorer.
* string/tester.c (test_strcpy): Add new tests for unaligned
arguments.
* sysdeps/arm/bits/string.h: Delete inline implementations of
strcpy and stpcpy.
1999-04-11 Ulrich Drepper <drepper@cygnus.com>
* libio/Makefile (CPPFLAGS-.o): Don't define IO_DEBUG.

View File

@ -1523,6 +1523,9 @@ typedef Elf32_Addr Elf32_Conflict;
#define EF_ARM_APCS_26 0x08
#define EF_ARM_APCS_FLOAT 0x10
#define EF_ARM_PIC 0x20
#define EF_ALIGN8 0x40 /* 8-bit structure alignment is in use */
#define EF_NEW_ABI 0x80
#define EF_OLD_ABI 0x100
/* Additional symbol types for Thumb */
#define STT_ARM_TFUNC 0xd
@ -1541,17 +1544,19 @@ typedef Elf32_Addr Elf32_Conflict;
#define R_ARM_PC24 1 /* PC relative 26 bit branch */
#define R_ARM_ABS32 2 /* Direct 32 bit */
#define R_ARM_REL32 3 /* PC relative 32 bit */
#define R_ARM_ABS8 4 /* Direct 8 bit */
#define R_ARM_PC13 4
#define R_ARM_ABS16 5 /* Direct 16 bit */
#define R_ARM_ABS12 6 /* Direct 12 bit */
#define R_ARM_THM_ABS5 7
#define R_ARM_THM_PC22 8
#define R_ARM_ABS8 8 /* Direct 8 bit */
#define R_ARM_SBREL32 9
#define R_ARM_AMP_VCALL9 10
#define R_ARM_THM_PC11 11 /* Thumb unconditional branch */
#define R_ARM_THM_PC9 12 /* Thumb conditional branch */
#define R_ARM_GNU_VTINHERIT 13
#define R_ARM_GNU_VTENTRY 14
#define R_ARM_THM_PC22 10
#define R_ARM_THM_PC8 11
#define R_ARM_AMP_VCALL9 12
#define R_ARM_SWI24 13
#define R_ARM_THM_SWI8 14
#define R_ARM_XPC25 15
#define R_ARM_THM_XPC22 16
#define R_ARM_COPY 20 /* Copy symbol at runtime */
#define R_ARM_GLOB_DAT 21 /* Create GOT entry */
#define R_ARM_JUMP_SLOT 22 /* Create PLT entry */
@ -1560,6 +1565,11 @@ typedef Elf32_Addr Elf32_Conflict;
#define R_ARM_GOTPC 25 /* 32 bit PC relative offset to GOT */
#define R_ARM_GOT32 26 /* 32 bit GOT entry */
#define R_ARM_PLT32 27 /* 32 bit PLT address */
#define R_ARM_GNU_VTENTRY 100
#define R_ARM_GNU_VTINHERIT 101
#define R_ARM_THM_PC11 102 /* thumb unconditional branch */
#define R_ARM_THM_PC9 103 /* thumb conditional branch */
#define R_ARM_RXPC25 249
#define R_ARM_RSBREL32 250
#define R_ARM_THM_RPC22 251
#define R_ARM_RREL32 252

View File

@ -1,5 +1,5 @@
/* Tester for string functions.
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
Copyright (C) 1995, 1996, 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
@ -119,6 +119,7 @@ test_strcmp (void)
void
test_strcpy (void)
{
int i;
it = "strcpy";
check (strcpy (one, "abcd") == one, 1); /* Returned value. */
equal (one, "abcd", 2); /* Basic test. */
@ -134,6 +135,14 @@ test_strcpy (void)
(void) strcpy (one, "");
equal (one, "", 7); /* Boundary condition. */
for (i = 0; i < 16; i++)
{
(void) strcpy (one + i, "hi there"); /* Unaligned destination. */
equal (one + i, "hi there", 8 + (i * 2));
(void) strcpy (two, one + i); /* Unaligned source. */
equal (two, "hi there", 9 + (i * 2));
}
}
void

View File

@ -4,5 +4,9 @@
# 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

View File

@ -1,5 +1,5 @@
/* Optimized, inlined string functions. ARM version.
Copyright (C) 1998 Free Software Foundation, Inc.
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
@ -25,126 +25,3 @@
<bits/string2.h> since they don't work on the ARM. */
#define _HAVE_STRING_ARCH_strcpy 1
#define _HAVE_STRING_ARCH_stpcpy 1
/* We only provide optimizations if GNU CC is used and this is a little
endian system (the code below does not work on big endian machines).
With current versions of GCC these optimi\ations produce quite a large
amount of code so we only enable them if the user specifically asked
for it. */
#if !defined __NO_STRING_INLINES && defined __GNUC__ && __GNUC__ >= 2 \
&& !defined __ARMEB__ && defined __USE_STRING_INLINES
/* Copy SRC to DEST. */
#define strcpy(dest, src) \
(__extension__ (__builtin_constant_p (src) \
? (__string2_1bptr_p (src) && strlen (src) + 1 <= 8 \
? __strcpy_small (dest, src, strlen (src) + 1) \
: (char *) memcpy (dest, src, strlen (src) + 1)) \
: strcpy (dest, src)))
#define __strcpy_small(dest, src, srclen) \
(__extension__ ({ char *__dest = (char *) (dest); \
const char *__src = (const char *) (src); \
size_t __srclen = (srclen); \
switch (__srclen) \
{ \
case 5: \
*((unsigned long int *) __dest) = \
*((const unsigned long int *) (__src)); \
__dest += 4; \
__src += 4; \
case 1: \
*__dest++ = '\0'; \
break; \
case 6: \
*((unsigned long int *) __dest) = \
*((const unsigned long int *) (__src)); \
__dest += 4; \
__src += 4; \
case 2: \
*((unsigned short int *) __dest) = \
__src[0]; \
__dest += 2; \
break; \
case 7: \
*((unsigned long int *) __dest) = \
*((const unsigned long int *) (__src)); \
__dest += 4; \
__src += 4; \
case 3: \
*((unsigned short int *) __dest) = \
*((const unsigned short int *) (__src)); \
__dest[2] = '\0'; \
__dest += 3; \
break; \
case 8: \
*((unsigned long int *) __dest) = \
*((const unsigned long int *) (__src)); \
__dest += 4; \
__src += 4; \
case 4: \
*((unsigned long int *) __dest) = \
*((const unsigned short int *) (__src)) | \
(__src[2] << 16); \
__dest += 4; \
break; \
} \
(__dest - __srclen) ; }))
/* Copy SRC to DEST, returning pointer to final NUL byte. */
#define __stpcpy(dest, src) \
(__extension__ (__builtin_constant_p (src) \
? (__string2_1bptr_p (src) && strlen (src) + 1 <= 8 \
? __stpcpy_small (dest, src, strlen (src) + 1) \
: ((char *) __mempcpy (dest, src, strlen (src) + 1) - 1))\
: __stpcpy (dest, src)))
#define __stpcpy_small(dest, src, srclen) \
(__extension__ ({ char *__dest = (char *) (dest); \
const char *__src = (const char *) (src); \
switch (srclen) \
{ \
case 5: \
*((unsigned long int *) __dest) = \
*((const unsigned long int *) (__src)); \
__dest += 4; \
__src += 4; \
case 1: \
*__dest++ = '\0'; \
break; \
case 6: \
*((unsigned long int *) __dest) = \
*((const unsigned long int *) (__src)); \
__dest += 4; \
__src += 4; \
case 2: \
*((unsigned short int *) __dest) = \
__src[0]; \
__dest += 2; \
break; \
case 7: \
*((unsigned long int *) __dest) = \
*((const unsigned long int *) (__src)); \
__dest += 4; \
__src += 4; \
case 3: \
*((unsigned short int *) __dest) = \
*((const unsigned short int *) (__src)); \
__dest[2] = '\0'; \
__dest += 3; \
break; \
case 8: \
*((unsigned long int *) __dest) = \
*((const unsigned long int *) (__src)); \
__dest += 4; \
__src += 4; \
case 4: \
*((unsigned long int *) __dest) = \
*((const unsigned short int *) (__src)) | \
(__src[2] << 16); \
__dest += 4; \
break; \
} \
__dest; }))
#endif

View File

@ -4,5 +4,6 @@ endif
ifeq ($(subdir),signal)
sysdep_routines += rt_sigsuspend rt_sigprocmask rt_sigtimedwait \
rt_sigqueueinfo rt_sigaction rt_sigpending
rt_sigqueueinfo rt_sigaction rt_sigpending \
sigrestorer
endif

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1998 Free Software Foundation, Inc.
/* Copyright (C) 1998, 1999 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.
@ -214,9 +214,6 @@ _iopl (unsigned int level)
void
_outb (unsigned char b, unsigned long int port)
{
if (port >= MAX_PORT)
return;
*((volatile unsigned char *)(IO_ADDR (port))) = b;
}
@ -224,9 +221,6 @@ _outb (unsigned char b, unsigned long int port)
void
_outw (unsigned short b, unsigned long int port)
{
if (port >= MAX_PORT)
return;
*((volatile unsigned short *)(IO_ADDR (port))) = b;
}
@ -234,9 +228,6 @@ _outw (unsigned short b, unsigned long int port)
void
_outl (unsigned int b, unsigned long int port)
{
if (port >= MAX_PORT)
return;
*((volatile unsigned long *)(IO_ADDR (port))) = b;
}

View File

@ -39,11 +39,14 @@ int __libc_missing_rt_sigs;
#define SA_RESTORER 0x04000000
extern void __default_sa_restorer(void);
extern void __default_rt_sa_restorer(void);
/* When RT signals are in use we need to use a different return stub. */
#ifdef __NR_rt_sigreturn
#define choose_restorer(flags) \
(flags & SA_SIGINFO) ? &&__default_rt_sa_restorer \
: &&__default_sa_restorer
(flags & SA_SIGINFO) ? __default_rt_sa_restorer \
: __default_sa_restorer
#else
#define choose_restorer(flags) \
&&__default_sa_restorer
@ -142,20 +145,6 @@ __sigaction (sig, act, oact)
#endif
}
return result;
/* If no SA_RESTORER function was specified by the application we use
this one. This avoids the need for the kernel to synthesise a return
instruction on the stack, which would involve expensive cache flushes. */
__default_sa_restorer:
asm volatile ("swi %0" : : "i" (__NR_sigreturn));
#ifdef __NR_rt_sigreturn
__default_rt_sa_restorer:
asm volatile ("swi %0" : : "i" (__NR_rt_sigreturn));
#endif
/* NOTREACHED */
return -1;
}
weak_alias (__sigaction, sigaction)

View File

@ -0,0 +1,33 @@
/* Copyright (C) 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 Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
/* If no SA_RESTORER function was specified by the application we use
one of these. This avoids the need for the kernel to synthesise a return
instruction on the stack, which would involve expensive cache flushes. */
ENTRY(__default_sa_restorer)
swi SYS_ify(sigreturn)
#ifdef __NR_rt_sigreturn
ENTRY(__default_rt_sa_restorer)
swi SYS_ify(rt_sigreturn)
#endif

View File

@ -114,7 +114,7 @@
{ \
register int _a1 asm ("a1"); \
LOAD_ARGS_##nr (args) \
asm volatile ("swi %1" \
asm volatile ("swi %1 @ syscall " #name \
: "=r" (_a1) \
: "i" (SYS_ify(name)) ASM_ARGS_##nr \
: "a1"); \

View File

@ -0,0 +1,50 @@
/* Copyright (C) 1999 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 Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
#define _ERRNO_H 1
#include <bits/errno.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. */
ENTRY (__vfork)
#ifdef __NR_vfork
swi __NR_vfork
cmn a1, #4096
RETINSTR(movcc, pc, lr)
/* Check if vfork syscall is known at all. */
ldr a2, =-ENOSYS
teq a1, a2
bne PLTJMP(C_SYMBOL_NAME(__syscall_error))
#endif
/* If we don't have vfork, fork is close enough. */
swi __NR_fork
cmn a1, #4096
RETINSTR(movcc, pc, lr)
b PLTJMP(C_SYMBOL_NAME(__syscall_error))
PSEUDO_END (__vfork)
weak_alias (__vfork, vfork)