aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h229
1 files changed, 125 insertions, 104 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
index 09a294b..2f80654 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
+++ b/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
@@ -42,9 +42,7 @@
PUSHCARGS_##args \
DOCARGS_##args \
movl $SYS_ify (syscall_name), %eax; \
- /* Until we can handle unwinding from the sysenter page the kernel \
- provides we cannot use ENTER_KERNEL here. */ \
- int $0x80; \
+ ENTER_KERNEL; \
POPCARGS_##args; \
POPSTATE_##args \
cmpl $-4095, %eax; \
@@ -75,10 +73,10 @@
/* Encoding: DW_EH_PE_pcrel + DW_EH_PE_sdata4. */ \
.byte 0x1b; \
/* Start of the table initialization. */ \
- .byte 0xc; \
+ .byte 0xc; /* DW_CFA_def_cfa */ \
.uleb128 4; \
.uleb128 4; \
- .byte 0x88; \
+ .byte 0x88; /* DW_CFA_offset, column 0x8 */ \
.uleb128 1; \
.align 4; \
L(ENDCIE): \
@@ -104,149 +102,172 @@
simple. The only place the stack pointer is changed is when the old
cancellation state value is saved. */
# define EH_FRAME_0(name) \
- .byte 4; \
- .long L(PUSHSTATE)-L(name##START); \
- .byte 14; \
+ .byte 0x40+L(PUSHSTATE)-L(name##START); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \
- .byte 4; \
- .long L(POPSTATE)-L(PUSHSTATE); \
- .byte 14; \
+ .byte 0x40+L(POPSTATE)-L(PUSHSTATE); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 4
/* For syscalls with one and two parameters the code is the same as for
those which take no parameter. */
-# define EH_FRAME_1(name) EH_FRAME_0 (name)
+# define EH_FRAME_1(name) \
+ .byte 0x40+L(SAVEBX1)-L(name##START); /* DW_CFA_advance_loc+N */ \
+ .byte 9; /* DW_CFA_register */ \
+ .uleb128 3; /* %ebx */ \
+ .uleb128 2; /* %edx */ \
+ .byte 0x40+L(RESTBX1)-L(SAVEBX1); /* DW_CFA_advance_loc+N */ \
+ .byte 0xc3; /* DW_CFA_restore %ebx */ \
+ .byte 0x40+L(PUSHSTATE)-L(RESTBX1); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
+ .uleb128 8; \
+ .byte 0x40+L(SAVEBX2)-L(PUSHSTATE); /* DW_CFA_advance_loc+N */ \
+ .byte 9; /* DW_CFA_register */ \
+ .uleb128 3; /* %ebx */ \
+ .uleb128 2; /* %edx */ \
+ .byte 0x40+L(RESTBX2)-L(SAVEBX2); /* DW_CFA_advance_loc+N */ \
+ .byte 0xc3; /* DW_CFA_restore %ebx */ \
+ .byte 0x40+L(POPSTATE)-L(RESTBX2); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
+ .uleb128 4
+
# define EH_FRAME_2(name) EH_FRAME_1 (name)
/* For syscalls with three parameters the stack pointer is changed
also to save the content of the %ebx register. */
# define EH_FRAME_3(name) \
- .byte 4; \
- .long L(PUSHBX1)-L(name##START); \
- .byte 14; \
+ .byte 0x40+L(PUSHBX1)-L(name##START); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \
- .byte 4; \
- .long L(POPBX1)-L(PUSHBX1); \
- .byte 14; \
+ .byte 0x83; /* DW_CFA_offset %ebx */ \
+ .uleb128 2; \
+ .byte 0x40+L(POPBX1)-L(PUSHBX1); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 4; \
- .byte 4; \
- .long L(PUSHSTATE)-L(POPBX1); \
- .byte 14; \
+ .byte 0xc3; /* DW_CFA_restore %ebx */ \
+ .byte 0x40+L(PUSHSTATE)-L(POPBX1); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \
- .byte 4; \
- .long L(PUSHBX2)-L(PUSHSTATE); \
- .byte 14; \
+ .byte 0x40+L(PUSHBX2)-L(PUSHSTATE); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 12; \
- .byte 4; \
- .long L(POPBX2)-L(PUSHBX2); \
- .byte 14; \
+ .byte 0x83; /* DW_CFA_offset %ebx */ \
+ .uleb128 3; \
+ .byte 0x40+L(POPBX2)-L(PUSHBX2); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \
- .byte 4; \
- .long L(POPSTATE)-L(POPBX2); \
- .byte 14; \
+ .byte 0xc3; /* DW_CFA_restore %ebx */ \
+ .byte 0x40+L(POPSTATE)-L(POPBX2); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 4
/* With four parameters the syscall wrappers have to save %ebx and %esi. */
# define EH_FRAME_4(name) \
- .byte 4; \
- .long L(PUSHSI1)-L(name##START); \
- .byte 14; \
+ .byte 0x40+L(PUSHSI1)-L(name##START); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \
- .byte 4; \
- .long L(PUSHBX1)-L(PUSHSI1); \
- .byte 14; \
+ .byte 0x86; /* DW_CFA_offset %esi */ \
+ .uleb128 2; \
+ .byte 0x40+L(PUSHBX1)-L(PUSHSI1); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 12; \
- .byte 4; \
- .long L(POPBX1)-L(PUSHBX1); \
- .byte 14; \
+ .byte 0x83; /* DW_CFA_offset %ebx */ \
+ .uleb128 3; \
+ .byte 0x40+L(POPBX1)-L(PUSHBX1); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \
- .byte 4; \
- .long L(POPSI1)-L(POPBX1); \
- .byte 14; \
+ .byte 0xc3; /* DW_CFA_restore %ebx */ \
+ .byte 0x40+L(POPSI1)-L(POPBX1); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 4; \
- .byte 4; \
- .long L(PUSHSTATE)-L(POPSI1); \
- .byte 14; \
+ .byte 0xc6; /* DW_CFA_restore %esi */ \
+ .byte 0x40+L(PUSHSTATE)-L(POPSI1); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \
- .byte 4; \
- .long L(PUSHSI2)-L(PUSHSTATE); \
- .byte 14; \
+ .byte 0x40+L(PUSHSI2)-L(PUSHSTATE); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 12; \
- .byte 4; \
- .long L(PUSHBX2)-L(PUSHSI2); \
- .byte 14; \
+ .byte 0x86; /* DW_CFA_offset %esi */ \
+ .uleb128 3; \
+ .byte 0x40+L(PUSHBX2)-L(PUSHSI2); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 16; \
- .byte 4; \
- .long L(POPBX2)-L(PUSHBX2); \
- .byte 14; \
+ .byte 0x83; /* DW_CFA_offset %ebx */ \
+ .uleb128 4; \
+ .byte 0x40+L(POPBX2)-L(PUSHBX2); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 12; \
- .byte 4; \
- .long L(POPSI2)-L(POPBX2); \
- .byte 14; \
+ .byte 0xc3; /* DW_CFA_restore %ebx */ \
+ .byte 0x40+L(POPSI2)-L(POPBX2); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \
- .byte 4; \
- .long L(POPSTATE)-L(POPSI2); \
- .byte 14; \
+ .byte 0xc6; /* DW_CFA_restore %esi */ \
+ .byte 0x40+L(POPSTATE)-L(POPSI2); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 4
/* With five parameters the syscall wrappers have to save %ebx, %esi,
and %edi. */
# define EH_FRAME_5(name) \
- .byte 4; \
- .long L(PUSHDI1)-L(name##START); \
- .byte 14; \
+ .byte 0x40+L(PUSHDI1)-L(name##START); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \
- .byte 4; \
- .long L(PUSHSI1)-L(PUSHDI1); \
- .byte 14; \
+ .byte 0x87; /* DW_CFA_offset %edi */ \
+ .uleb128 2; \
+ .byte 0x40+L(PUSHSI1)-L(PUSHDI1); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 12; \
- .byte 4; \
- .long L(PUSHBX1)-L(PUSHSI1); \
- .byte 14; \
+ .byte 0x86; /* DW_CFA_offset %esi */ \
+ .uleb128 3; \
+ .byte 0x40+L(PUSHBX1)-L(PUSHSI1); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 16; \
- .byte 4; \
- .long L(POPBX1)-L(PUSHBX1); \
- .byte 14; \
+ .byte 0x83; /* DW_CFA_offset %ebx */ \
+ .uleb128 4; \
+ .byte 0x40+L(POPBX1)-L(PUSHBX1); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 12; \
- .byte 4; \
- .long L(POPSI1)-L(POPBX1); \
- .byte 14; \
+ .byte 0xc3; /* DW_CFA_restore %ebx */ \
+ .byte 0x40+L(POPSI1)-L(POPBX1); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \
- .byte 4; \
- .long L(POPDI1)-L(POPSI1); \
- .byte 14; \
+ .byte 0xc6; /* DW_CFA_restore %esi */ \
+ .byte 0x40+L(POPDI1)-L(POPSI1); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 4; \
- .byte 4; \
- .long L(PUSHSTATE)-L(POPDI1); \
- .byte 14; \
+ .byte 0xc7; /* DW_CFA_restore %edi */ \
+ .byte 0x40+L(PUSHSTATE)-L(POPDI1); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \
- .byte 4; \
- .long L(PUSHDI2)-L(PUSHSTATE); \
- .byte 14; \
+ .byte 0x40+L(PUSHDI2)-L(PUSHSTATE); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 12; \
- .byte 4; \
- .long L(PUSHSI2)-L(PUSHDI2); \
- .byte 14; \
+ .byte 0x87; /* DW_CFA_offset %edi */ \
+ .uleb128 3; \
+ .byte 0x40+L(PUSHSI2)-L(PUSHDI2); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 16; \
- .byte 4; \
- .long L(PUSHBX2)-L(PUSHSI2); \
- .byte 14; \
+ .byte 0x86; /* DW_CFA_offset %esi */ \
+ .uleb128 4; \
+ .byte 0x40+L(PUSHBX2)-L(PUSHSI2); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 20; \
- .byte 4; \
- .long L(POPBX2)-L(PUSHBX2); \
- .byte 14; \
+ .byte 0x83; /* DW_CFA_offset %ebx */ \
+ .uleb128 5; \
+ .byte 0x40+L(POPBX2)-L(PUSHBX2); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 16; \
- .byte 4; \
- .long L(POPSI2)-L(POPBX2); \
- .byte 14; \
+ .byte 0xc3; /* DW_CFA_restore %ebx */ \
+ .byte 0x40+L(POPSI2)-L(POPBX2); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 12; \
- .byte 4; \
- .long L(POPDI2)-L(POPSI2); \
- .byte 14; \
+ .byte 0xc6; /* DW_CFA_restore %esi */ \
+ .byte 0x40+L(POPDI2)-L(POPSI2); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \
- .byte 4; \
- .long L(POPSTATE)-L(POPDI2); \
- .byte 14; \
+ .byte 0xc7; /* DW_CFA_restore %edi */ \
+ .byte 0x40+L(POPSTATE)-L(POPDI2); /* DW_CFA_advance_loc+N */ \
+ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 4
@@ -266,9 +287,9 @@
# define _PUSHCARGS_0 /* No arguments to push. */
# define _POPCARGS_0 /* No arguments to pop. */
-# define PUSHCARGS_1 movl %ebx, %edx; PUSHCARGS_0
+# define PUSHCARGS_1 movl %ebx, %edx; L(SAVEBX2): PUSHCARGS_0
# define DOCARGS_1 _DOARGS_1 (4)
-# define POPCARGS_1 POPCARGS_0; movl %edx, %ebx
+# define POPCARGS_1 POPCARGS_0; movl %edx, %ebx; L(RESTBX2):
# define _PUSHCARGS_1 pushl %ebx; L(PUSHBX2): _PUSHCARGS_0
# define _POPCARGS_1 _POPCARGS_0; popl %ebx; L(POPBX2):