summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv')
-rw-r--r--sysdeps/unix/sysv/linux/i386/clone.S14
-rw-r--r--sysdeps/unix/sysv/linux/i386/getcontext.S6
-rw-r--r--sysdeps/unix/sysv/linux/i386/makecontext.S6
-rw-r--r--sysdeps/unix/sysv/linux/i386/mmap.S4
-rw-r--r--sysdeps/unix/sysv/linux/i386/mmap64.S4
-rw-r--r--sysdeps/unix/sysv/linux/i386/setcontext.S11
-rw-r--r--sysdeps/unix/sysv/linux/i386/sysdep.h5
-rw-r--r--sysdeps/unix/sysv/linux/i386/vfork.S4
8 files changed, 42 insertions, 12 deletions
diff --git a/sysdeps/unix/sysv/linux/i386/clone.S b/sysdeps/unix/sysv/linux/i386/clone.S
index 69243d5c8c..54524ec120 100644
--- a/sysdeps/unix/sysv/linux/i386/clone.S
+++ b/sysdeps/unix/sysv/linux/i386/clone.S
@@ -88,6 +88,7 @@ ENTRY (BP_SYM (__clone))
cfi_adjust_cfa_offset (4)
pushl %edi
cfi_adjust_cfa_offset (4)
+
movl TLS+12(%esp),%esi
cfi_rel_offset (esi, 4)
movl PTID+12(%esp),%edx
@@ -102,16 +103,14 @@ ENTRY (BP_SYM (__clone))
movl %ebx, (%ecx)
#endif
+ /* End FDE now, because in the child the unwind info will be
+ wrong. */
+ cfi_endproc
+
int $0x80
popl %edi
- cfi_adjust_cfa_offset (-4)
- cfi_restore (edi)
popl %esi
- cfi_adjust_cfa_offset (-4)
- cfi_restore (esi)
popl %ebx
- cfi_adjust_cfa_offset (-4)
- cfi_restore (ebx)
test %eax,%eax
jl SYSCALL_ERROR_LABEL
@@ -131,10 +130,8 @@ L(haspid):
call *%ebx
#ifdef PIC
call L(here)
- cfi_adjust_cfa_offset (4)
L(here):
popl %ebx
- cfi_adjust_cfa_offset (-4)
addl $_GLOBAL_OFFSET_TABLE_+[.-L(here)], %ebx
#endif
movl %eax, %ebx
@@ -156,6 +153,7 @@ L(nomoregetpid):
.previous
#endif
+ cfi_startproc
PSEUDO_END (BP_SYM (__clone))
weak_alias (BP_SYM (__clone), BP_SYM (clone))
diff --git a/sysdeps/unix/sysv/linux/i386/getcontext.S b/sysdeps/unix/sysv/linux/i386/getcontext.S
index 68541d5d80..76ba6047c1 100644
--- a/sysdeps/unix/sysv/linux/i386/getcontext.S
+++ b/sysdeps/unix/sysv/linux/i386/getcontext.S
@@ -1,5 +1,5 @@
/* Save current context.
- Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -63,12 +63,16 @@ ENTRY(__getcontext)
/* Save the current signal mask. */
pushl %ebx
+ cfi_adjust_cfa_offset (4)
+ cfi_rel_offset (ebx, 0)
leal oSIGMASK(%eax), %edx
xorl %ecx, %ecx
movl $SIG_BLOCK, %ebx
movl $__NR_sigprocmask, %eax
ENTER_KERNEL
popl %ebx
+ cfi_adjust_cfa_offset (-4)
+ cfi_restore (ebx)
cmpl $-4095, %eax /* Check %eax for error. */
jae SYSCALL_ERROR_LABEL /* Jump to error handler if error. */
diff --git a/sysdeps/unix/sysv/linux/i386/makecontext.S b/sysdeps/unix/sysv/linux/i386/makecontext.S
index ec49b74b9a..03dc648c59 100644
--- a/sysdeps/unix/sysv/linux/i386/makecontext.S
+++ b/sysdeps/unix/sysv/linux/i386/makecontext.S
@@ -1,5 +1,5 @@
/* Create new context.
- Copyright (C) 2001,02 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -68,7 +68,9 @@ ENTRY(__makecontext)
below). */
#ifdef PIC
call 1f
+ cfi_adjust_cfa_offset (4)
1: popl %ecx
+ cfi_adjust_cfa_offset (-4)
addl $L(exitcode)-1b, %ecx
movl %ecx, (%edx)
#else
@@ -83,6 +85,7 @@ ENTRY(__makecontext)
the context 'makecontext' manipulated at the time of the
'makecontext' call. If the pointer is NULL the process must
terminate. */
+ cfi_endproc
L(exitcode):
/* This removes the parameters passed to the function given to
'makecontext' from the stack. EBX contains the number of
@@ -108,6 +111,7 @@ L(exitcode):
/* The 'exit' call should never return. In case it does cause
the process to terminate. */
hlt
+ cfi_startproc
END(__makecontext)
weak_alias(__makecontext, makecontext)
diff --git a/sysdeps/unix/sysv/linux/i386/mmap.S b/sysdeps/unix/sysv/linux/i386/mmap.S
index 9f664de991..10f8bc75a7 100644
--- a/sysdeps/unix/sysv/linux/i386/mmap.S
+++ b/sysdeps/unix/sysv/linux/i386/mmap.S
@@ -26,7 +26,7 @@
ENTRY (__mmap)
-/* I don't think it is worthwhile trzing to use mmap2 whenever it
+/* I don't think it is worthwhile trying to use mmap2 whenever it
is available. Only use it when we are sure the syscall exists. */
#ifdef __ASSUME_MMAP2_SYSCALL
@@ -78,6 +78,7 @@ L(skip):
/* Save registers. */
movl %ebx, %edx
+ cfi_register (ebx, edx)
movl $SYS_ify(mmap), %eax /* System call number in %eax. */
@@ -88,6 +89,7 @@ L(skip):
/* Restore registers. */
movl %edx, %ebx
+ cfi_restore (ebx)
#endif
diff --git a/sysdeps/unix/sysv/linux/i386/mmap64.S b/sysdeps/unix/sysv/linux/i386/mmap64.S
index 89d9f5f356..4209453819 100644
--- a/sysdeps/unix/sysv/linux/i386/mmap64.S
+++ b/sysdeps/unix/sysv/linux/i386/mmap64.S
@@ -130,6 +130,7 @@ L(einval):
3:
/* Save registers. */
movl %ebx, %edx
+ cfi_register (ebx, edx)
cmpl $0, OFFHI-SVRSP(%esp)
jne L(einval2)
@@ -143,6 +144,7 @@ L(einval):
/* Restore registers. */
movl %edx, %ebx
+ cfi_restore (ebx)
/* If 0 > %eax > -4096 there was an error. */
cmpl $-4096, %eax
@@ -154,8 +156,10 @@ L(pseudo_end):
#endif
ret
+ cfi_register (ebx, edx)
L(einval2):
movl %edx, %ebx
+ cfi_restore (ebx)
movl $-EINVAL, %eax
jmp SYSCALL_ERROR_LABEL
#endif
diff --git a/sysdeps/unix/sysv/linux/i386/setcontext.S b/sysdeps/unix/sysv/linux/i386/setcontext.S
index 22469b2b85..c493cf9798 100644
--- a/sysdeps/unix/sysv/linux/i386/setcontext.S
+++ b/sysdeps/unix/sysv/linux/i386/setcontext.S
@@ -61,6 +61,13 @@ ENTRY(__setcontext)
movl oEIP(%eax), %ecx
/* Load the new stack pointer. */
+ cfi_def_cfa (eax, 0)
+ cfi_offset (edi, oEDI)
+ cfi_offset (esi, oESI)
+ cfi_offset (ebp, oEBP)
+ cfi_offset (ebx, oEBX)
+ cfi_offset (edx, oEDX)
+ cfi_offset (ecx, oECX)
movl oESP(%eax), %esp
/* Push the return address on the new stack so we can return there. */
@@ -76,6 +83,10 @@ ENTRY(__setcontext)
movl oECX(%eax), %ecx
movl oEAX(%eax), %eax
+ /* End FDE here, we fall into another context. */
+ cfi_endproc
+ cfi_startproc
+
/* The following 'ret' will pop the address of the code and jump
to it. */
diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h
index d64d0a3a5c..a9637be33d 100644
--- a/sysdeps/unix/sysv/linux/i386/sysdep.h
+++ b/sysdeps/unix/sysv/linux/i386/sysdep.h
@@ -118,6 +118,7 @@
.previous
# else
# define SETUP_PIC_REG(reg) \
+ .ifndef __i686.get_pc_thunk.reg; \
.section .gnu.linkonce.t.__i686.get_pc_thunk.reg,"ax",@progbits; \
.globl __i686.get_pc_thunk.reg; \
.hidden __i686.get_pc_thunk.reg; \
@@ -127,9 +128,13 @@ __i686.get_pc_thunk.reg: \
ret; \
.size __i686.get_pc_thunk.reg, . - __i686.get_pc_thunk.reg; \
.previous; \
+ .endif; \
call __i686.get_pc_thunk.reg
# endif
+# define LOAD_PIC_REG(reg) \
+ SETUP_PIC_REG(reg); addl $_GLOBAL_OFFSET_TABLE_, %e##reg
+
# if RTLD_PRIVATE_ERRNO
# define SYSCALL_ERROR_HANDLER \
0:SETUP_PIC_REG(cx); \
diff --git a/sysdeps/unix/sysv/linux/i386/vfork.S b/sysdeps/unix/sysv/linux/i386/vfork.S
index e660e6b70e..eefd4b49cb 100644
--- a/sysdeps/unix/sysv/linux/i386/vfork.S
+++ b/sysdeps/unix/sysv/linux/i386/vfork.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2002, 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Schwab <schwab@gnu.org>.
@@ -33,6 +33,7 @@ ENTRY (__vfork)
/* Pop the return PC value into ECX. */
popl %ecx
+ cfi_adjust_cfa_offset (-4)
#ifdef SAVE_PID
SAVE_PID
@@ -46,6 +47,7 @@ ENTRY (__vfork)
disturbs the branch target cache. Instead push the return
address back on the stack. */
pushl %ecx
+ cfi_adjust_cfa_offset (4)
#ifdef RESTORE_PID
RESTORE_PID