diff options
author | Robert Schwebel <r.schwebel@pengutronix.de> | 2010-06-11 13:47:22 +0200 |
---|---|---|
committer | Michael Olbrich <m.olbrich@pengutronix.de> | 2011-02-22 11:26:05 +0100 |
commit | d722ca4356b65c3d8d7a29b150b061f991ef031a (patch) | |
tree | 950c35bd6c84dace434ab31e838065b0de5e2eec /patches | |
parent | 104c49dc996ff25679e8155c6ab410c3752a7c7e (diff) | |
download | OSELAS.Toolchain-d722ca4356b65c3d8d7a29b150b061f991ef031a.tar.gz OSELAS.Toolchain-d722ca4356b65c3d8d7a29b150b061f991ef031a.tar.xz |
[glibc-ports-2.12.1] revert one upstream patch
Signed-off-by: Robert Schwebel <r.schwebel@pengutronix.de>
Diffstat (limited to 'patches')
-rw-r--r-- | patches/glibc-ports-2.12.1/0001-Revert-fix-unwinding-through-Thumb-2-system-calls.patch | 241 | ||||
-rw-r--r-- | patches/glibc-ports-2.12.1/series | 1 |
2 files changed, 242 insertions, 0 deletions
diff --git a/patches/glibc-ports-2.12.1/0001-Revert-fix-unwinding-through-Thumb-2-system-calls.patch b/patches/glibc-ports-2.12.1/0001-Revert-fix-unwinding-through-Thumb-2-system-calls.patch new file mode 100644 index 0000000..4de8b19 --- /dev/null +++ b/patches/glibc-ports-2.12.1/0001-Revert-fix-unwinding-through-Thumb-2-system-calls.patch @@ -0,0 +1,241 @@ +Revert the patch below. + +Signed-off-by: Robert Schwebel <r.schwebel@pengutronix.de> + +--- + +From 2dcd7ed8fd149a5aefc8c7a7ff041ff389348b4f Mon Sep 17 00:00:00 2001 +From: Daniel Jacobowitz <dan@codesourcery.com> +Date: Thu, 8 Apr 2010 12:43:55 -0400 +Subject: [PATCH] Fix unwinding through Thumb-2 system calls. + +--- + ChangeLog.arm | 9 --- + sysdeps/unix/sysv/linux/arm/eabi/Makefile | 31 ------------ + sysdeps/unix/sysv/linux/arm/eabi/libc-do-syscall.S | 43 ----------------- + sysdeps/unix/sysv/linux/arm/eabi/nptl/aio_misc.h | 52 +++++++++++++++++++++ + sysdeps/unix/sysv/linux/arm/eabi/sysdep.h | 38 ++++++--------- + 5 files changed, 69 insertions(+), 104 deletions(-) + create mode 100644 sysdeps/unix/sysv/linux/arm/eabi/libc-do-syscall.S + delete mode 100644 sysdeps/unix/sysv/linux/arm/eabi/nptl/aio_misc.h + +Index: glibc-ports-2.12.1/ChangeLog.arm +=================================================================== +--- glibc-ports-2.12.1.orig/ChangeLog.arm ++++ glibc-ports-2.12.1/ChangeLog.arm +@@ -2,15 +2,6 @@ + + * sysdeps/unix/sysv/linux/arm/eabi/internal_recvmmsg.S: New. + +-2010-04-08 Daniel Jacobowitz <dan@codesourcery.com> +- +- * sysdeps/unix/sysv/linux/arm/eabi/libc-do-syscall.S: New file. +- * sysdeps/unix/sysv/linux/arm/eabi/sysdep.h [__thumb__] +- (INTERNAL_SYSCALL_RAW): Rewrite to use __libc_do_syscall. +- * sysdeps/unix/sysv/linux/arm/eabi/Makefile: Add libc-do-syscall +- to libraries and tests that require it. +- * sysdeps/unix/sysv/linux/arm/eabi/nptl/aio_misc.h: Delete. +- + 2010-03-30 Joseph Myers <joseph@codesourcery.com> + + * sysdeps/arm/dl-machine.h (VALID_ELF_ABIVERSION, VALID_ELF_OSABI, +Index: glibc-ports-2.12.1/sysdeps/unix/sysv/linux/arm/eabi/libc-do-syscall.S +=================================================================== +--- glibc-ports-2.12.1.orig/sysdeps/unix/sysv/linux/arm/eabi/libc-do-syscall.S ++++ /dev/null +@@ -1,43 +0,0 @@ +-/* Copyright (C) 2010 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> +- +-/* Out-of-line syscall stub. We expect the system call number in ip +- and return the raw result in r0. No registers are clobbered. +- We could avoid using the stack for this, but the goal is accurate +- unwind information - and while there is a reserved prefix in the +- ARM unwind tables for register to register moves, the actual opcodes +- are not defined. */ +- +- .thumb +- .syntax unified +- .hidden __libc_do_syscall +- +-ENTRY (__libc_do_syscall) +- .fnstart +- push {r7, lr} +- .save {r7, lr} +- cfi_adjust_cfa_offset (8) +- cfi_rel_offset (r7, 0) +- cfi_rel_offset (lr, 4) +- mov r7, ip +- swi 0x0 +- pop {r7, pc} +- .fnend +-END (__libc_do_syscall) +Index: glibc-ports-2.12.1/sysdeps/unix/sysv/linux/arm/eabi/Makefile +=================================================================== +--- glibc-ports-2.12.1.orig/sysdeps/unix/sysv/linux/arm/eabi/Makefile ++++ glibc-ports-2.12.1/sysdeps/unix/sysv/linux/arm/eabi/Makefile +@@ -7,34 +7,3 @@ ifeq ($(subdir),csu) + # unwind tables for __libc_start_main. + CFLAGS-libc-start.c += -fexceptions + endif +- +-# Add a syscall function to each library that needs one. +- +-ifeq ($(subdir),rt) +-librt-sysdep_routines += libc-do-syscall +-librt-shared-only-routines += libc-do-syscall +-endif +- +-ifeq ($(subdir),nptl) +-libpthread-sysdep_routines += libc-do-syscall +-libpthread-shared-only-routines += libc-do-syscall +-endif +- +-ifeq ($(subdir),resolv) +-libanl-sysdep_routines += libc-do-syscall +-libanl-shared-only-routines += libc-do-syscall +-endif +- +-ifeq ($(subdir),csu) +-sysdep_routines += libc-do-syscall +-endif +- +-ifeq ($(subdir),nscd) +-nscd-modules += libc-do-syscall +-endif +- +-ifeq ($(subdir),posix) +-LDFLAGS-tst-rfc3484 += $(common-objpfx)csu/libc-do-syscall.o +-LDFLAGS-tst-rfc3484-2 += $(common-objpfx)csu/libc-do-syscall.o +-LDFLAGS-tst-rfc3484-3 += $(common-objpfx)csu/libc-do-syscall.o +-endif +Index: glibc-ports-2.12.1/sysdeps/unix/sysv/linux/arm/eabi/nptl/aio_misc.h +=================================================================== +--- /dev/null ++++ glibc-ports-2.12.1/sysdeps/unix/sysv/linux/arm/eabi/nptl/aio_misc.h +@@ -0,0 +1,52 @@ ++/* Copyright (C) 2008 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_next <aio_misc.h> ++ ++#ifdef __thumb2__ ++ ++#include <errno.h> ++ ++/* The Thumb-2 definition of INTERNAL_SYSCALL_RAW has to hide the use ++ of r7 from the compiler because it cannot handle asm clobbering the ++ hard frame pointer. In aio_suspend, GCC does not eliminate the ++ hard frame pointer because the function uses variable-length ++ arrays, so it generates unwind information using r7 as virtual ++ stack pointer. During system calls, when r7 has been saved on the ++ stack, this means the unwind information is invalid. Without extra ++ unwind directives, which would need to cause unwind information for ++ the asm to be generated separately from that for the parts of the ++ function before and after the asm (with three index table entries), ++ it is not possible to represent any temporary change to the virtual ++ stack pointer. Instead, we move the problematic system calls out ++ of line into a function that does not require a frame pointer. */ ++ ++static __attribute_noinline__ void ++aio_misc_wait (int *resultp, ++ volatile int *futexp, ++ const struct timespec *timeout, ++ int cancel) ++{ ++ AIO_MISC_WAIT (*resultp, *futexp, timeout, cancel); ++} ++ ++#undef AIO_MISC_WAIT ++#define AIO_MISC_WAIT(result, futex, timeout, cancel) \ ++ aio_misc_wait (&result, &futex, timeout, cancel) ++ ++#endif +Index: glibc-ports-2.12.1/sysdeps/unix/sysv/linux/arm/eabi/sysdep.h +=================================================================== +--- glibc-ports-2.12.1.orig/sysdeps/unix/sysv/linux/arm/eabi/sysdep.h ++++ glibc-ports-2.12.1/sysdeps/unix/sysv/linux/arm/eabi/sysdep.h +@@ -44,34 +44,30 @@ + argument; otherwise the (optional) compatibility code for APCS binaries + may be invoked. */ + +-#if defined(__thumb__) +-/* We can not expose the use of r7 to the compiler. GCC (as +- of 4.5) uses r7 as the hard frame pointer for Thumb - although +- for Thumb-2 it isn't obviously a better choice than r11. +- And GCC does not support asms that conflict with the frame +- pointer. +- +- This would be easier if syscall numbers never exceeded 255, +- but they do. For the moment the LOAD_ARGS_7 is sacrificed. ++#ifdef __thumb__ ++/* Hide the use of r7 from the compiler, this would be a lot ++ easier but for the fact that the syscalls can exceed 255. ++ For the moment the LOAD_ARGS_7 is sacrificed. + We can't use push/pop inside the asm because that breaks +- unwinding (i.e. thread cancellation) for this frame. We can't +- locally save and restore r7, because we do not know if this +- function uses r7 or if it is our caller's r7; if it is our caller's, +- then unwinding will fail higher up the stack. So we move the +- syscall out of line and provide its own unwind information. */ ++ unwinding (ie. thread cancellation). */ ++/* FIXME: the str / ldr of r7 are not covered by CFI information. */ + #undef LOAD_ARGS_7 + #undef INTERNAL_SYSCALL_RAW + #define INTERNAL_SYSCALL_RAW(name, err, nr, args...) \ + ({ \ ++ int _sys_buf[2]; \ + register int _a1 asm ("a1"); \ +- int _nametmp = name; \ ++ register int *_r6 asm ("r6") = _sys_buf; \ ++ *_r6 = name; \ + LOAD_ARGS_##nr (args) \ +- register int _name asm ("ip") = _nametmp; \ +- asm volatile ("bl __libc_do_syscall" \ +- : "=r" (_a1) \ +- : "r" (_name) ASM_ARGS_##nr \ +- : "memory", "lr"); \ +- _a1; }) ++ asm volatile ("str r7, [r6, #4]\n\t" \ ++ "ldr r7, [r6]\n\t" \ ++ "swi 0 @ syscall " #name "\n\t" \ ++ "ldr r7, [r6, #4]" \ ++ : "=r" (_a1) \ ++ : "r" (_r6) ASM_ARGS_##nr \ ++ : "memory"); \ ++ _a1; }) + #else /* ARM */ + #undef INTERNAL_SYSCALL_RAW + #define INTERNAL_SYSCALL_RAW(name, err, nr, args...) \ diff --git a/patches/glibc-ports-2.12.1/series b/patches/glibc-ports-2.12.1/series new file mode 100644 index 0000000..8261dcf --- /dev/null +++ b/patches/glibc-ports-2.12.1/series @@ -0,0 +1 @@ +0001-Revert-fix-unwinding-through-Thumb-2-system-calls.patch |