/*
- * Code for the vsyscall page.  This version uses the old int $0x80 method.
+ * Code for the vDSO.  This version uses the old int $0x80 method.
  *
- * NOTE:
- * 1) __kernel_vsyscall _must_ be first in this page.
- * 2) there are alignment constraints on this stub, see vsyscall-sigreturn.S
- *    for details.
+ * First get the common code for the sigreturn entry points.
+ * This must come first.
  */
+#include "sigreturn.S"
 
        .text
        .globl __kernel_vsyscall
        .type __kernel_vsyscall,@function
+       ALIGN
 __kernel_vsyscall:
 .LSTART_vsyscall:
        int $0x80
 .LENDFDEDLSI:
        .previous
 
-/*
- * Get the common code for the sigreturn entry points.
- */
-#include "sigreturn.S"
+       /*
+        * Pad out the segment to match the size of the sysenter.S version.
+        */
+VDSO32_vsyscall_eh_frame_size = 0x44
+       .section .data,"aw",@progbits
+       .space VDSO32_vsyscall_eh_frame_size-(.LENDFDEDLSI-.LSTARTFRAMEDLSI), 0
+       .previous
 
 /*
- * Common code for the sigreturn entry points on the vsyscall page.
+ * Common code for the sigreturn entry points in vDSO images.
  * So far this code is the same for both int80 and sysenter versions.
- * This file is #include'd by vsyscall-*.S to define them after the
- * vsyscall entry point.  The kernel assumes that the addresses of these
- * routines are constant for all vsyscall implementations.
+ * This file is #include'd by int80.S et al to define them first thing.
+ * The kernel assumes that the addresses of these routines are constant
+ * for all vDSO implementations.
  */
 
+#include <linux/linkage.h>
 #include <asm/unistd_32.h>
 #include <asm/asm-offsets.h>
 
 #define        SYSCALL_ENTER_KERNEL    int $0x80
 #endif
 
-/* XXX
-   Should these be named "_sigtramp" or something?
-*/
-
        .text
-       .org __kernel_vsyscall+32,0x90
        .globl __kernel_sigreturn
        .type __kernel_sigreturn,@function
+       ALIGN
 __kernel_sigreturn:
 .LSTART_sigreturn:
        popl %eax               /* XXX does this mean it needs unwind info? */
        movl $__NR_sigreturn, %eax
        SYSCALL_ENTER_KERNEL
 .LEND_sigreturn:
+       nop
        .size __kernel_sigreturn,.-.LSTART_sigreturn
 
-       .balign 32
        .globl __kernel_rt_sigreturn
        .type __kernel_rt_sigreturn,@function
+       ALIGN
 __kernel_rt_sigreturn:
 .LSTART_rt_sigreturn:
        movl $__NR_rt_sigreturn, %eax
        SYSCALL_ENTER_KERNEL
 .LEND_rt_sigreturn:
+       nop
        .size __kernel_rt_sigreturn,.-.LSTART_rt_sigreturn
-       .balign 32
        .previous
 
        .section .eh_frame,"a",@progbits
 
 /*
- * Code for the vsyscall page.  This version uses the syscall instruction.
+ * Code for the vDSO.  This version uses the syscall instruction.
+ *
+ * First get the common code for the sigreturn entry points.
+ * This must come first.
  */
+#define SYSCALL_ENTER_KERNEL   syscall
+#include "sigreturn.S"
 
-#include <asm/asm-offsets.h>
 #include <asm/segment.h>
 
        .text
        .globl __kernel_vsyscall
        .type __kernel_vsyscall,@function
+       ALIGN
 __kernel_vsyscall:
 .LSTART_vsyscall:
        push    %ebp
        .uleb128 4
        .align 4
 .LENDFDE1:
+       .previous
 
-/*
- * Get the common code for the sigreturn entry points.
- */
-#define SYSCALL_ENTER_KERNEL   syscall
-#include "sigreturn.S"
+       /*
+        * Pad out the segment to match the size of the sysenter.S version.
+        */
+VDSO32_vsyscall_eh_frame_size = 0x44
+       .section .data,"aw",@progbits
+       .space VDSO32_vsyscall_eh_frame_size-(.LENDFDE1-.LSTARTFRAME), 0
+       .previous
 
 /*
- * Code for the vsyscall page.  This version uses the sysenter instruction.
+ * Code for the vDSO.  This version uses the sysenter instruction.
  *
- * NOTE:
- * 1) __kernel_vsyscall _must_ be first in this page.
- * 2) there are alignment constraints on this stub, see vsyscall-sigreturn.S
- *    for details.
+ * First get the common code for the sigreturn entry points.
+ * This must come first.
  */
+#include "sigreturn.S"
 
 /*
  * The caller puts arg2 in %ecx, which gets pushed. The kernel will use
  * arg6 from the stack.
  *
  * You can not use this vsyscall for the clone() syscall because the
- * three dwords on the parent stack do not get copied to the child.
+ * three words on the parent stack do not get copied to the child.
  */
        .text
        .globl __kernel_vsyscall
        .type __kernel_vsyscall,@function
+       ALIGN
 __kernel_vsyscall:
 .LSTART_vsyscall:
        push %ecx
 .LENDFDEDLSI:
        .previous
 
-/*
- * Get the common code for the sigreturn entry points.
- */
-#include "sigreturn.S"
+       /*
+        * Emit a symbol with the size of this .eh_frame data,
+        * to verify it matches the other versions.
+        */
+VDSO32_vsyscall_eh_frame_size = (.LENDFDEDLSI-.LSTARTFRAMEDLSI)