[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[commits] r10211 - in /fsf/trunk/ports: ./ sysdeps/unix/sysv/linux/arm/eabi/ sysdeps/unix/sysv/linux/arm/eabi/nptl/
- To: commits@xxxxxxxxxx
- Subject: [commits] r10211 - in /fsf/trunk/ports: ./ sysdeps/unix/sysv/linux/arm/eabi/ sysdeps/unix/sysv/linux/arm/eabi/nptl/
- From: eglibc@xxxxxxxxxx
- Date: Fri, 09 Apr 2010 07:04:01 -0000
Author: eglibc
Date: Fri Apr 9 00:04:00 2010
New Revision: 10211
Log:
Import glibc-ports-mainline for 2010-04-09
Added:
fsf/trunk/ports/sysdeps/unix/sysv/linux/arm/eabi/libc-do-syscall.S
Removed:
fsf/trunk/ports/sysdeps/unix/sysv/linux/arm/eabi/nptl/aio_misc.h
Modified:
fsf/trunk/ports/ChangeLog.arm
fsf/trunk/ports/sysdeps/unix/sysv/linux/arm/eabi/Makefile
fsf/trunk/ports/sysdeps/unix/sysv/linux/arm/eabi/sysdep.h
Modified: fsf/trunk/ports/ChangeLog.arm
==============================================================================
--- fsf/trunk/ports/ChangeLog.arm (original)
+++ fsf/trunk/ports/ChangeLog.arm Fri Apr 9 00:04:00 2010
@@ -1,3 +1,12 @@
+2010-04-08 Daniel Jacobowitz <dan@xxxxxxxxxxxxxxxx>
+
+ * 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@xxxxxxxxxxxxxxxx>
* sysdeps/arm/dl-machine.h (VALID_ELF_ABIVERSION, VALID_ELF_OSABI,
Modified: fsf/trunk/ports/sysdeps/unix/sysv/linux/arm/eabi/Makefile
==============================================================================
--- fsf/trunk/ports/sysdeps/unix/sysv/linux/arm/eabi/Makefile (original)
+++ fsf/trunk/ports/sysdeps/unix/sysv/linux/arm/eabi/Makefile Fri Apr 9 00:04:00 2010
@@ -7,3 +7,34 @@
# 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
Added: fsf/trunk/ports/sysdeps/unix/sysv/linux/arm/eabi/libc-do-syscall.S
==============================================================================
--- fsf/trunk/ports/sysdeps/unix/sysv/linux/arm/eabi/libc-do-syscall.S (added)
+++ fsf/trunk/ports/sysdeps/unix/sysv/linux/arm/eabi/libc-do-syscall.S Fri Apr 9 00:04:00 2010
@@ -1,0 +1,43 @@
+/* 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)
Modified: fsf/trunk/ports/sysdeps/unix/sysv/linux/arm/eabi/sysdep.h
==============================================================================
--- fsf/trunk/ports/sysdeps/unix/sysv/linux/arm/eabi/sysdep.h (original)
+++ fsf/trunk/ports/sysdeps/unix/sysv/linux/arm/eabi/sysdep.h Fri Apr 9 00:04:00 2010
@@ -44,30 +44,34 @@
argument; otherwise the (optional) compatibility code for APCS binaries
may be invoked. */
-#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.
+#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.
We can't use push/pop inside the asm because that breaks
- unwinding (ie. thread cancellation). */
-/* FIXME: the str / ldr of r7 are not covered by CFI information. */
+ 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. */
#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"); \
- register int *_r6 asm ("r6") = _sys_buf; \
- *_r6 = name; \
+ int _nametmp = name; \
LOAD_ARGS_##nr (args) \
- 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; })
+ register int _name asm ("ip") = _nametmp; \
+ asm volatile ("bl __libc_do_syscall" \
+ : "=r" (_a1) \
+ : "r" (_name) ASM_ARGS_##nr \
+ : "memory", "lr"); \
+ _a1; })
#else /* ARM */
#undef INTERNAL_SYSCALL_RAW
#define INTERNAL_SYSCALL_RAW(name, err, nr, args...) \