diff options
author | Roland McGrath <roland@redhat.com> | 2008-01-30 07:30:44 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 07:30:44 -0500 |
commit | cadd516422d9382313144aa58f9e46ee7a2c0a28 (patch) | |
tree | 84cb8aa63f068bd4609723b43cdfd41ec74c9665 /arch/x86/vdso | |
parent | 16e48e7e7929d841273d87027079660bca5e37bd (diff) |
x86 vDSO: canonicalize sysenter .eh_frame
Some assembler versions automagically optimize .eh_frame contents,
changing their size. The CFI in sysenter.S was not using optimal
formatting, so it would be changed by newer/smarter assemblers.
This ran afoul of the wired constant for padding out the other vDSO
images to match its size. This changes the original hand-coded
source to use the optimal format encoding for its operations. That
leaves nothing more for a fancy assembler to do, so the sizes will
match the wired-in expected size regardless of the assembler version.
Signed-off-by: Roland McGrath <roland@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/vdso')
-rw-r--r-- | arch/x86/vdso/vdso32/int80.S | 2 | ||||
-rw-r--r-- | arch/x86/vdso/vdso32/syscall.S | 2 | ||||
-rw-r--r-- | arch/x86/vdso/vdso32/sysenter.S | 18 |
3 files changed, 8 insertions, 14 deletions
diff --git a/arch/x86/vdso/vdso32/int80.S b/arch/x86/vdso/vdso32/int80.S index be4b7a9a7cdd..b15b7c01aedb 100644 --- a/arch/x86/vdso/vdso32/int80.S +++ b/arch/x86/vdso/vdso32/int80.S | |||
@@ -50,7 +50,7 @@ __kernel_vsyscall: | |||
50 | /* | 50 | /* |
51 | * Pad out the segment to match the size of the sysenter.S version. | 51 | * Pad out the segment to match the size of the sysenter.S version. |
52 | */ | 52 | */ |
53 | VDSO32_vsyscall_eh_frame_size = 0x44 | 53 | VDSO32_vsyscall_eh_frame_size = 0x40 |
54 | .section .data,"aw",@progbits | 54 | .section .data,"aw",@progbits |
55 | .space VDSO32_vsyscall_eh_frame_size-(.LENDFDEDLSI-.LSTARTFRAMEDLSI), 0 | 55 | .space VDSO32_vsyscall_eh_frame_size-(.LENDFDEDLSI-.LSTARTFRAMEDLSI), 0 |
56 | .previous | 56 | .previous |
diff --git a/arch/x86/vdso/vdso32/syscall.S b/arch/x86/vdso/vdso32/syscall.S index fe88d34f822f..5415b5613d55 100644 --- a/arch/x86/vdso/vdso32/syscall.S +++ b/arch/x86/vdso/vdso32/syscall.S | |||
@@ -71,7 +71,7 @@ __kernel_vsyscall: | |||
71 | /* | 71 | /* |
72 | * Pad out the segment to match the size of the sysenter.S version. | 72 | * Pad out the segment to match the size of the sysenter.S version. |
73 | */ | 73 | */ |
74 | VDSO32_vsyscall_eh_frame_size = 0x44 | 74 | VDSO32_vsyscall_eh_frame_size = 0x40 |
75 | .section .data,"aw",@progbits | 75 | .section .data,"aw",@progbits |
76 | .space VDSO32_vsyscall_eh_frame_size-(.LENDFDE1-.LSTARTFRAME), 0 | 76 | .space VDSO32_vsyscall_eh_frame_size-(.LENDFDE1-.LSTARTFRAME), 0 |
77 | .previous | 77 | .previous |
diff --git a/arch/x86/vdso/vdso32/sysenter.S b/arch/x86/vdso/vdso32/sysenter.S index 902d5fc11f1b..e2800affa754 100644 --- a/arch/x86/vdso/vdso32/sysenter.S +++ b/arch/x86/vdso/vdso32/sysenter.S | |||
@@ -84,31 +84,25 @@ VDSO32_SYSENTER_RETURN: /* Symbol used by sysenter.c via vdso32-syms.h */ | |||
84 | .uleb128 0 | 84 | .uleb128 0 |
85 | /* What follows are the instructions for the table generation. | 85 | /* What follows are the instructions for the table generation. |
86 | We have to record all changes of the stack pointer. */ | 86 | We have to record all changes of the stack pointer. */ |
87 | .byte 0x04 /* DW_CFA_advance_loc4 */ | 87 | .byte 0x40 + (.Lpush_ecx-.LSTART_vsyscall) /* DW_CFA_advance_loc */ |
88 | .long .Lpush_ecx-.LSTART_vsyscall | ||
89 | .byte 0x0e /* DW_CFA_def_cfa_offset */ | 88 | .byte 0x0e /* DW_CFA_def_cfa_offset */ |
90 | .byte 0x08 /* RA at offset 8 now */ | 89 | .byte 0x08 /* RA at offset 8 now */ |
91 | .byte 0x04 /* DW_CFA_advance_loc4 */ | 90 | .byte 0x40 + (.Lpush_edx-.Lpush_ecx) /* DW_CFA_advance_loc */ |
92 | .long .Lpush_edx-.Lpush_ecx | ||
93 | .byte 0x0e /* DW_CFA_def_cfa_offset */ | 91 | .byte 0x0e /* DW_CFA_def_cfa_offset */ |
94 | .byte 0x0c /* RA at offset 12 now */ | 92 | .byte 0x0c /* RA at offset 12 now */ |
95 | .byte 0x04 /* DW_CFA_advance_loc4 */ | 93 | .byte 0x40 + (.Lenter_kernel-.Lpush_edx) /* DW_CFA_advance_loc */ |
96 | .long .Lenter_kernel-.Lpush_edx | ||
97 | .byte 0x0e /* DW_CFA_def_cfa_offset */ | 94 | .byte 0x0e /* DW_CFA_def_cfa_offset */ |
98 | .byte 0x10 /* RA at offset 16 now */ | 95 | .byte 0x10 /* RA at offset 16 now */ |
99 | .byte 0x85, 0x04 /* DW_CFA_offset %ebp -16 */ | 96 | .byte 0x85, 0x04 /* DW_CFA_offset %ebp -16 */ |
100 | /* Finally the epilogue. */ | 97 | /* Finally the epilogue. */ |
101 | .byte 0x04 /* DW_CFA_advance_loc4 */ | 98 | .byte 0x40 + (.Lpop_ebp-.Lenter_kernel) /* DW_CFA_advance_loc */ |
102 | .long .Lpop_ebp-.Lenter_kernel | ||
103 | .byte 0x0e /* DW_CFA_def_cfa_offset */ | 99 | .byte 0x0e /* DW_CFA_def_cfa_offset */ |
104 | .byte 0x0c /* RA at offset 12 now */ | 100 | .byte 0x0c /* RA at offset 12 now */ |
105 | .byte 0xc5 /* DW_CFA_restore %ebp */ | 101 | .byte 0xc5 /* DW_CFA_restore %ebp */ |
106 | .byte 0x04 /* DW_CFA_advance_loc4 */ | 102 | .byte 0x40 + (.Lpop_edx-.Lpop_ebp) /* DW_CFA_advance_loc */ |
107 | .long .Lpop_edx-.Lpop_ebp | ||
108 | .byte 0x0e /* DW_CFA_def_cfa_offset */ | 103 | .byte 0x0e /* DW_CFA_def_cfa_offset */ |
109 | .byte 0x08 /* RA at offset 8 now */ | 104 | .byte 0x08 /* RA at offset 8 now */ |
110 | .byte 0x04 /* DW_CFA_advance_loc4 */ | 105 | .byte 0x40 + (.Lpop_ecx-.Lpop_edx) /* DW_CFA_advance_loc */ |
111 | .long .Lpop_ecx-.Lpop_edx | ||
112 | .byte 0x0e /* DW_CFA_def_cfa_offset */ | 106 | .byte 0x0e /* DW_CFA_def_cfa_offset */ |
113 | .byte 0x04 /* RA at offset 4 now */ | 107 | .byte 0x04 /* RA at offset 4 now */ |
114 | .align 4 | 108 | .align 4 |