Add missing unwind info. Add comments.

This commit is contained in:
Ulrich Drepper 2003-04-14 02:52:46 +00:00
parent 657a543b42
commit 4ae7142df2
1 changed files with 128 additions and 107 deletions

View File

@ -42,9 +42,7 @@
PUSHCARGS_##args \ PUSHCARGS_##args \
DOCARGS_##args \ DOCARGS_##args \
movl $SYS_ify (syscall_name), %eax; \ movl $SYS_ify (syscall_name), %eax; \
/* Until we can handle unwinding from the sysenter page the kernel \ ENTER_KERNEL; \
provides we cannot use ENTER_KERNEL here. */ \
int $0x80; \
POPCARGS_##args; \ POPCARGS_##args; \
POPSTATE_##args \ POPSTATE_##args \
cmpl $-4095, %eax; \ cmpl $-4095, %eax; \
@ -75,10 +73,10 @@
/* Encoding: DW_EH_PE_pcrel + DW_EH_PE_sdata4. */ \ /* Encoding: DW_EH_PE_pcrel + DW_EH_PE_sdata4. */ \
.byte 0x1b; \ .byte 0x1b; \
/* Start of the table initialization. */ \ /* Start of the table initialization. */ \
.byte 0xc; \ .byte 0xc; /* DW_CFA_def_cfa */ \
.uleb128 4; \ .uleb128 4; \
.uleb128 4; \ .uleb128 4; \
.byte 0x88; \ .byte 0x88; /* DW_CFA_offset, column 0x8 */ \
.uleb128 1; \ .uleb128 1; \
.align 4; \ .align 4; \
L(ENDCIE): \ L(ENDCIE): \
@ -104,149 +102,172 @@
simple. The only place the stack pointer is changed is when the old simple. The only place the stack pointer is changed is when the old
cancellation state value is saved. */ cancellation state value is saved. */
# define EH_FRAME_0(name) \ # define EH_FRAME_0(name) \
.byte 4; \ .byte 0x40+L(PUSHSTATE)-L(name##START); /* DW_CFA_advance_loc+N */ \
.long L(PUSHSTATE)-L(name##START); \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.byte 14; \
.uleb128 8; \ .uleb128 8; \
.byte 4; \ .byte 0x40+L(POPSTATE)-L(PUSHSTATE); /* DW_CFA_advance_loc+N */ \
.long L(POPSTATE)-L(PUSHSTATE); \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.byte 14; \
.uleb128 4 .uleb128 4
/* For syscalls with one and two parameters the code is the same as for /* For syscalls with one and two parameters the code is the same as for
those which take no parameter. */ 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) # define EH_FRAME_2(name) EH_FRAME_1 (name)
/* For syscalls with three parameters the stack pointer is changed /* For syscalls with three parameters the stack pointer is changed
also to save the content of the %ebx register. */ also to save the content of the %ebx register. */
# define EH_FRAME_3(name) \ # define EH_FRAME_3(name) \
.byte 4; \ .byte 0x40+L(PUSHBX1)-L(name##START); /* DW_CFA_advance_loc+N */ \
.long L(PUSHBX1)-L(name##START); \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.byte 14; \
.uleb128 8; \ .uleb128 8; \
.byte 4; \ .byte 0x83; /* DW_CFA_offset %ebx */ \
.long L(POPBX1)-L(PUSHBX1); \ .uleb128 2; \
.byte 14; \ .byte 0x40+L(POPBX1)-L(PUSHBX1); /* DW_CFA_advance_loc+N */ \
.byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 4; \ .uleb128 4; \
.byte 4; \ .byte 0xc3; /* DW_CFA_restore %ebx */ \
.long L(PUSHSTATE)-L(POPBX1); \ .byte 0x40+L(PUSHSTATE)-L(POPBX1); /* DW_CFA_advance_loc+N */ \
.byte 14; \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \ .uleb128 8; \
.byte 4; \ .byte 0x40+L(PUSHBX2)-L(PUSHSTATE); /* DW_CFA_advance_loc+N */ \
.long L(PUSHBX2)-L(PUSHSTATE); \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.byte 14; \
.uleb128 12; \ .uleb128 12; \
.byte 4; \ .byte 0x83; /* DW_CFA_offset %ebx */ \
.long L(POPBX2)-L(PUSHBX2); \ .uleb128 3; \
.byte 14; \ .byte 0x40+L(POPBX2)-L(PUSHBX2); /* DW_CFA_advance_loc+N */ \
.byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \ .uleb128 8; \
.byte 4; \ .byte 0xc3; /* DW_CFA_restore %ebx */ \
.long L(POPSTATE)-L(POPBX2); \ .byte 0x40+L(POPSTATE)-L(POPBX2); /* DW_CFA_advance_loc+N */ \
.byte 14; \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 4 .uleb128 4
/* With four parameters the syscall wrappers have to save %ebx and %esi. */ /* With four parameters the syscall wrappers have to save %ebx and %esi. */
# define EH_FRAME_4(name) \ # define EH_FRAME_4(name) \
.byte 4; \ .byte 0x40+L(PUSHSI1)-L(name##START); /* DW_CFA_advance_loc+N */ \
.long L(PUSHSI1)-L(name##START); \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.byte 14; \
.uleb128 8; \ .uleb128 8; \
.byte 4; \ .byte 0x86; /* DW_CFA_offset %esi */ \
.long L(PUSHBX1)-L(PUSHSI1); \ .uleb128 2; \
.byte 14; \ .byte 0x40+L(PUSHBX1)-L(PUSHSI1); /* DW_CFA_advance_loc+N */ \
.byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 12; \ .uleb128 12; \
.byte 4; \ .byte 0x83; /* DW_CFA_offset %ebx */ \
.long L(POPBX1)-L(PUSHBX1); \ .uleb128 3; \
.byte 14; \ .byte 0x40+L(POPBX1)-L(PUSHBX1); /* DW_CFA_advance_loc+N */ \
.byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \ .uleb128 8; \
.byte 4; \ .byte 0xc3; /* DW_CFA_restore %ebx */ \
.long L(POPSI1)-L(POPBX1); \ .byte 0x40+L(POPSI1)-L(POPBX1); /* DW_CFA_advance_loc+N */ \
.byte 14; \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 4; \ .uleb128 4; \
.byte 4; \ .byte 0xc6; /* DW_CFA_restore %esi */ \
.long L(PUSHSTATE)-L(POPSI1); \ .byte 0x40+L(PUSHSTATE)-L(POPSI1); /* DW_CFA_advance_loc+N */ \
.byte 14; \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \ .uleb128 8; \
.byte 4; \ .byte 0x40+L(PUSHSI2)-L(PUSHSTATE); /* DW_CFA_advance_loc+N */ \
.long L(PUSHSI2)-L(PUSHSTATE); \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.byte 14; \
.uleb128 12; \ .uleb128 12; \
.byte 4; \ .byte 0x86; /* DW_CFA_offset %esi */ \
.long L(PUSHBX2)-L(PUSHSI2); \ .uleb128 3; \
.byte 14; \ .byte 0x40+L(PUSHBX2)-L(PUSHSI2); /* DW_CFA_advance_loc+N */ \
.byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 16; \ .uleb128 16; \
.byte 4; \ .byte 0x83; /* DW_CFA_offset %ebx */ \
.long L(POPBX2)-L(PUSHBX2); \ .uleb128 4; \
.byte 14; \ .byte 0x40+L(POPBX2)-L(PUSHBX2); /* DW_CFA_advance_loc+N */ \
.byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 12; \ .uleb128 12; \
.byte 4; \ .byte 0xc3; /* DW_CFA_restore %ebx */ \
.long L(POPSI2)-L(POPBX2); \ .byte 0x40+L(POPSI2)-L(POPBX2); /* DW_CFA_advance_loc+N */ \
.byte 14; \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \ .uleb128 8; \
.byte 4; \ .byte 0xc6; /* DW_CFA_restore %esi */ \
.long L(POPSTATE)-L(POPSI2); \ .byte 0x40+L(POPSTATE)-L(POPSI2); /* DW_CFA_advance_loc+N */ \
.byte 14; \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 4 .uleb128 4
/* With five parameters the syscall wrappers have to save %ebx, %esi, /* With five parameters the syscall wrappers have to save %ebx, %esi,
and %edi. */ and %edi. */
# define EH_FRAME_5(name) \ # define EH_FRAME_5(name) \
.byte 4; \ .byte 0x40+L(PUSHDI1)-L(name##START); /* DW_CFA_advance_loc+N */ \
.long L(PUSHDI1)-L(name##START); \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.byte 14; \
.uleb128 8; \ .uleb128 8; \
.byte 4; \ .byte 0x87; /* DW_CFA_offset %edi */ \
.long L(PUSHSI1)-L(PUSHDI1); \ .uleb128 2; \
.byte 14; \ .byte 0x40+L(PUSHSI1)-L(PUSHDI1); /* DW_CFA_advance_loc+N */ \
.byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 12; \ .uleb128 12; \
.byte 4; \ .byte 0x86; /* DW_CFA_offset %esi */ \
.long L(PUSHBX1)-L(PUSHSI1); \ .uleb128 3; \
.byte 14; \ .byte 0x40+L(PUSHBX1)-L(PUSHSI1); /* DW_CFA_advance_loc+N */ \
.byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 16; \ .uleb128 16; \
.byte 4; \ .byte 0x83; /* DW_CFA_offset %ebx */ \
.long L(POPBX1)-L(PUSHBX1); \
.byte 14; \
.uleb128 12; \
.byte 4; \
.long L(POPSI1)-L(POPBX1); \
.byte 14; \
.uleb128 8; \
.byte 4; \
.long L(POPDI1)-L(POPSI1); \
.byte 14; \
.uleb128 4; \ .uleb128 4; \
.byte 4; \ .byte 0x40+L(POPBX1)-L(PUSHBX1); /* DW_CFA_advance_loc+N */ \
.long L(PUSHSTATE)-L(POPDI1); \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.byte 14; \
.uleb128 8; \
.byte 4; \
.long L(PUSHDI2)-L(PUSHSTATE); \
.byte 14; \
.uleb128 12; \ .uleb128 12; \
.byte 4; \ .byte 0xc3; /* DW_CFA_restore %ebx */ \
.long L(PUSHSI2)-L(PUSHDI2); \ .byte 0x40+L(POPSI1)-L(POPBX1); /* DW_CFA_advance_loc+N */ \
.byte 14; \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \
.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 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 0x40+L(PUSHDI2)-L(PUSHSTATE); /* DW_CFA_advance_loc+N */ \
.byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 12; \
.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; \ .uleb128 16; \
.byte 4; \ .byte 0x86; /* DW_CFA_offset %esi */ \
.long L(PUSHBX2)-L(PUSHSI2); \ .uleb128 4; \
.byte 14; \ .byte 0x40+L(PUSHBX2)-L(PUSHSI2); /* DW_CFA_advance_loc+N */ \
.byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 20; \ .uleb128 20; \
.byte 4; \ .byte 0x83; /* DW_CFA_offset %ebx */ \
.long L(POPBX2)-L(PUSHBX2); \ .uleb128 5; \
.byte 14; \ .byte 0x40+L(POPBX2)-L(PUSHBX2); /* DW_CFA_advance_loc+N */ \
.byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 16; \ .uleb128 16; \
.byte 4; \ .byte 0xc3; /* DW_CFA_restore %ebx */ \
.long L(POPSI2)-L(POPBX2); \ .byte 0x40+L(POPSI2)-L(POPBX2); /* DW_CFA_advance_loc+N */ \
.byte 14; \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 12; \ .uleb128 12; \
.byte 4; \ .byte 0xc6; /* DW_CFA_restore %esi */ \
.long L(POPDI2)-L(POPSI2); \ .byte 0x40+L(POPDI2)-L(POPSI2); /* DW_CFA_advance_loc+N */ \
.byte 14; \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 8; \ .uleb128 8; \
.byte 4; \ .byte 0xc7; /* DW_CFA_restore %edi */ \
.long L(POPSTATE)-L(POPDI2); \ .byte 0x40+L(POPSTATE)-L(POPDI2); /* DW_CFA_advance_loc+N */ \
.byte 14; \ .byte 14; /* DW_CFA_def_cfa_offset */ \
.uleb128 4 .uleb128 4
@ -266,9 +287,9 @@
# define _PUSHCARGS_0 /* No arguments to push. */ # define _PUSHCARGS_0 /* No arguments to push. */
# define _POPCARGS_0 /* No arguments to pop. */ # 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 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 _PUSHCARGS_1 pushl %ebx; L(PUSHBX2): _PUSHCARGS_0
# define _POPCARGS_1 _POPCARGS_0; popl %ebx; L(POPBX2): # define _POPCARGS_1 _POPCARGS_0; popl %ebx; L(POPBX2):