From b2b2415fe0ec0ea0db880c5b5e9f3fb768f4197e Mon Sep 17 00:00:00 2001 From: Philip Blundell Date: Fri, 6 Nov 2009 08:07:18 +0000 Subject: [PATCH] Fix ARMv4T interworking. * sysdeps/unix/sysv/linux/arm/clone.S: Support V4T interworking. * sysdeps/unix/sysv/linux/arm/sysdep.h (__local_syscall_error): Likewise. * sysdeps/arm/memcpy.S: Likewise. * sysdeps/arm/memmove.S: Likewise. --- ChangeLog.arm | 7 +++++++ sysdeps/arm/memcpy.S | 7 ++++++- sysdeps/arm/memmove.S | 7 ++++++- sysdeps/unix/sysv/linux/arm/clone.S | 8 +++++++- sysdeps/unix/sysv/linux/arm/sysdep.h | 9 +++++++-- 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/ChangeLog.arm b/ChangeLog.arm index 16380331e1..d784564cf4 100644 --- a/ChangeLog.arm +++ b/ChangeLog.arm @@ -1,3 +1,10 @@ +2009-11-04 Philip Blundell + + * sysdeps/unix/sysv/linux/arm/clone.S: Support V4T interworking. + * sysdeps/unix/sysv/linux/arm/sysdep.h (__local_syscall_error): Likewise. + * sysdeps/arm/memcpy.S: Likewise. + * sysdeps/arm/memmove.S: Likewise. + 2009-10-29 Joseph Myers * sysdeps/unix/sysv/linux/arm/bits/fcntl.h: Define F_OWNER_* and diff --git a/sysdeps/arm/memcpy.S b/sysdeps/arm/memcpy.S index 61cf33cbfb..7f669a6e90 100644 --- a/sysdeps/arm/memcpy.S +++ b/sysdeps/arm/memcpy.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2006 Free Software Foundation, Inc. +/* Copyright (C) 2006, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by MontaVista Software, Inc. (written by Nicolas Pitre) @@ -130,7 +130,12 @@ ENTRY(memcpy) strcsb r4, [r0], #1 strcsb ip, [r0] +#if defined (__ARM_ARCH_4T__) && defined(__THUMB_INTERWORK__) + ldmfd sp!, {r0, r4, lr} + bx lr +#else ldmfd sp!, {r0, r4, pc} +#endif 9: rsb ip, ip, #4 cmp ip, #2 diff --git a/sysdeps/arm/memmove.S b/sysdeps/arm/memmove.S index eda1bcc9b7..9c9b2344d2 100644 --- a/sysdeps/arm/memmove.S +++ b/sysdeps/arm/memmove.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2006, 2008 Free Software Foundation, Inc. +/* Copyright (C) 2006, 2008, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by MontaVista Software, Inc. (written by Nicolas Pitre) @@ -144,7 +144,12 @@ ENTRY(memmove) strneb r3, [r0, #-1]! strcsb r4, [r0, #-1]! strcsb ip, [r0, #-1] +#if defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__) + ldmfd sp!, {r0, r4, lr} + bx lr +#else ldmfd sp!, {r0, r4, pc} +#endif 9: cmp ip, #2 ldrgtb r3, [r1, #-1]! diff --git a/sysdeps/unix/sysv/linux/arm/clone.S b/sysdeps/unix/sysv/linux/arm/clone.S index cfd2e7ef71..1a19f5b558 100644 --- a/sysdeps/unix/sysv/linux/arm/clone.S +++ b/sysdeps/unix/sysv/linux/arm/clone.S @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 1998, 1999, 2002, 2005, 2008 +/* Copyright (C) 1996, 1997, 1998, 1999, 2002, 2005, 2008, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Pat Beirne @@ -96,8 +96,14 @@ ENTRY(__clone) #endif @ pick the function arg and call address off the stack and execute ldr r0, [sp, #4] +#if defined(__ARM_ARCH_4T__) && defined(__THUMB_INTERWORK__) + ldr ip, [sp], #8 + mov lr, pc + bx ip +#else mov lr, pc ldr pc, [sp], #8 +#endif @ and we are done, passing the return value through r0 b PLTJMP(HIDDEN_JUMPTARGET(_exit)) diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.h b/sysdeps/unix/sysv/linux/arm/sysdep.h index 3d7fafcb6f..3911aee626 100644 --- a/sysdeps/unix/sysv/linux/arm/sysdep.h +++ b/sysdeps/unix/sysv/linux/arm/sysdep.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1992, 93, 1995-2000, 2002, 2003, 2005, 2006 +/* Copyright (C) 1992, 93, 1995-2000, 2002, 2003, 2005, 2006, 2009 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper, , August 1995. @@ -129,6 +129,11 @@ __local_syscall_error: \ DO_RET(lr); \ 1: .word C_SYMBOL_NAME(rtld_errno) - 0b - 8; # else +#if defined(__ARM_ARCH_4T__) && defined(__THUMB_INTERWORK__) +#define POP_PC ldr lr, [sp], #4; bx lr +#else +#define POP_PC ldr pc, [sp], #4 +#endif # define SYSCALL_ERROR_HANDLER \ __local_syscall_error: \ str lr, [sp, #-4]!; \ @@ -138,7 +143,7 @@ __local_syscall_error: \ rsb r1, r1, #0; \ str r1, [r0]; \ mvn r0, #0; \ - ldr pc, [sp], #4; + POP_PC; # endif #else # define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */