aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland McGrath <roland@redhat.com>2008-01-30 07:30:44 -0500
committerIngo Molnar <mingo@elte.hu>2008-01-30 07:30:44 -0500
commitcadd516422d9382313144aa58f9e46ee7a2c0a28 (patch)
tree84cb8aa63f068bd4609723b43cdfd41ec74c9665
parent16e48e7e7929d841273d87027079660bca5e37bd (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>
-rw-r--r--arch/x86/vdso/vdso32/int80.S2
-rw-r--r--arch/x86/vdso/vdso32/syscall.S2
-rw-r--r--arch/x86/vdso/vdso32/sysenter.S18
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 */
53VDSO32_vsyscall_eh_frame_size = 0x44 53VDSO32_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 */
74VDSO32_vsyscall_eh_frame_size = 0x44 74VDSO32_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