i386: prepare shared kernel/vsyscall-sigreturn.S
authorThomas Gleixner <tglx@linutronix.de>
Thu, 11 Oct 2007 09:13:03 +0000 (11:13 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 11 Oct 2007 09:13:03 +0000 (11:13 +0200)
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/i386/kernel/vsyscall-int80_32.S
arch/i386/kernel/vsyscall-sigreturn.S [deleted file]
arch/i386/kernel/vsyscall-sigreturn_32.S [new file with mode: 0644]
arch/i386/kernel/vsyscall-sysenter_32.S

index 530d0525e5e23e66d510a837f09853fd4bb5088d..103cab6aa7c031141042a0e131a1f04d33d9bcd7 100644 (file)
@@ -50,4 +50,4 @@ __kernel_vsyscall:
 /*
  * Get the common code for the sigreturn entry points.
  */
-#include "vsyscall-sigreturn.S"
+#include "vsyscall-sigreturn_32.S"
diff --git a/arch/i386/kernel/vsyscall-sigreturn.S b/arch/i386/kernel/vsyscall-sigreturn.S
deleted file mode 100644 (file)
index a92262f..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Common code for the sigreturn entry points on the vsyscall page.
- * 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.
- */
-
-#include <asm/unistd.h>
-#include <asm/asm-offsets.h>
-
-
-/* XXX
-   Should these be named "_sigtramp" or something?
-*/
-
-       .text
-       .org __kernel_vsyscall+32,0x90
-       .globl __kernel_sigreturn
-       .type __kernel_sigreturn,@function
-__kernel_sigreturn:
-.LSTART_sigreturn:
-       popl %eax               /* XXX does this mean it needs unwind info? */
-       movl $__NR_sigreturn, %eax
-       int $0x80
-.LEND_sigreturn:
-       .size __kernel_sigreturn,.-.LSTART_sigreturn
-
-       .balign 32
-       .globl __kernel_rt_sigreturn
-       .type __kernel_rt_sigreturn,@function
-__kernel_rt_sigreturn:
-.LSTART_rt_sigreturn:
-       movl $__NR_rt_sigreturn, %eax
-       int $0x80
-.LEND_rt_sigreturn:
-       .size __kernel_rt_sigreturn,.-.LSTART_rt_sigreturn
-       .balign 32
-       .previous
-
-       .section .eh_frame,"a",@progbits
-.LSTARTFRAMEDLSI1:
-       .long .LENDCIEDLSI1-.LSTARTCIEDLSI1
-.LSTARTCIEDLSI1:
-       .long 0                 /* CIE ID */
-       .byte 1                 /* Version number */
-       .string "zRS"           /* NUL-terminated augmentation string */
-       .uleb128 1              /* Code alignment factor */
-       .sleb128 -4             /* Data alignment factor */
-       .byte 8                 /* Return address register column */
-       .uleb128 1              /* Augmentation value length */
-       .byte 0x1b              /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
-       .byte 0                 /* DW_CFA_nop */
-       .align 4
-.LENDCIEDLSI1:
-       .long .LENDFDEDLSI1-.LSTARTFDEDLSI1 /* Length FDE */
-.LSTARTFDEDLSI1:
-       .long .LSTARTFDEDLSI1-.LSTARTFRAMEDLSI1 /* CIE pointer */
-       /* HACK: The dwarf2 unwind routines will subtract 1 from the
-          return address to get an address in the middle of the
-          presumed call instruction.  Since we didn't get here via
-          a call, we need to include the nop before the real start
-          to make up for it.  */
-       .long .LSTART_sigreturn-1-.     /* PC-relative start address */
-       .long .LEND_sigreturn-.LSTART_sigreturn+1
-       .uleb128 0                      /* Augmentation */
-       /* What follows are the instructions for the table generation.
-          We record the locations of each register saved.  This is
-          complicated by the fact that the "CFA" is always assumed to
-          be the value of the stack pointer in the caller.  This means
-          that we must define the CFA of this body of code to be the
-          saved value of the stack pointer in the sigcontext.  Which
-          also means that there is no fixed relation to the other 
-          saved registers, which means that we must use DW_CFA_expression
-          to compute their addresses.  It also means that when we 
-          adjust the stack with the popl, we have to do it all over again.  */
-
-#define do_cfa_expr(offset)                                            \
-       .byte 0x0f;                     /* DW_CFA_def_cfa_expression */ \
-       .uleb128 1f-0f;                 /*   length */                  \
-0:     .byte 0x74;                     /*     DW_OP_breg4 */           \
-       .sleb128 offset;                /*      offset */               \
-       .byte 0x06;                     /*     DW_OP_deref */           \
-1:
-
-#define do_expr(regno, offset)                                         \
-       .byte 0x10;                     /* DW_CFA_expression */         \
-       .uleb128 regno;                 /*   regno */                   \
-       .uleb128 1f-0f;                 /*   length */                  \
-0:     .byte 0x74;                     /*     DW_OP_breg4 */           \
-       .sleb128 offset;                /*       offset */              \
-1:
-
-       do_cfa_expr(SIGCONTEXT_esp+4)
-       do_expr(0, SIGCONTEXT_eax+4)
-       do_expr(1, SIGCONTEXT_ecx+4)
-       do_expr(2, SIGCONTEXT_edx+4)
-       do_expr(3, SIGCONTEXT_ebx+4)
-       do_expr(5, SIGCONTEXT_ebp+4)
-       do_expr(6, SIGCONTEXT_esi+4)
-       do_expr(7, SIGCONTEXT_edi+4)
-       do_expr(8, SIGCONTEXT_eip+4)
-
-       .byte 0x42      /* DW_CFA_advance_loc 2 -- nop; popl eax. */
-
-       do_cfa_expr(SIGCONTEXT_esp)
-       do_expr(0, SIGCONTEXT_eax)
-       do_expr(1, SIGCONTEXT_ecx)
-       do_expr(2, SIGCONTEXT_edx)
-       do_expr(3, SIGCONTEXT_ebx)
-       do_expr(5, SIGCONTEXT_ebp)
-       do_expr(6, SIGCONTEXT_esi)
-       do_expr(7, SIGCONTEXT_edi)
-       do_expr(8, SIGCONTEXT_eip)
-
-       .align 4
-.LENDFDEDLSI1:
-
-       .long .LENDFDEDLSI2-.LSTARTFDEDLSI2 /* Length FDE */
-.LSTARTFDEDLSI2:
-       .long .LSTARTFDEDLSI2-.LSTARTFRAMEDLSI1 /* CIE pointer */
-       /* HACK: See above wrt unwind library assumptions.  */
-       .long .LSTART_rt_sigreturn-1-.  /* PC-relative start address */
-       .long .LEND_rt_sigreturn-.LSTART_rt_sigreturn+1
-       .uleb128 0                      /* Augmentation */
-       /* What follows are the instructions for the table generation.
-          We record the locations of each register saved.  This is
-          slightly less complicated than the above, since we don't
-          modify the stack pointer in the process.  */
-
-       do_cfa_expr(RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_esp)
-       do_expr(0, RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_eax)
-       do_expr(1, RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_ecx)
-       do_expr(2, RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_edx)
-       do_expr(3, RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_ebx)
-       do_expr(5, RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_ebp)
-       do_expr(6, RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_esi)
-       do_expr(7, RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_edi)
-       do_expr(8, RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_eip)
-
-       .align 4
-.LENDFDEDLSI2:
-       .previous
diff --git a/arch/i386/kernel/vsyscall-sigreturn_32.S b/arch/i386/kernel/vsyscall-sigreturn_32.S
new file mode 100644 (file)
index 0000000..a92262f
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+ * Common code for the sigreturn entry points on the vsyscall page.
+ * 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.
+ */
+
+#include <asm/unistd.h>
+#include <asm/asm-offsets.h>
+
+
+/* XXX
+   Should these be named "_sigtramp" or something?
+*/
+
+       .text
+       .org __kernel_vsyscall+32,0x90
+       .globl __kernel_sigreturn
+       .type __kernel_sigreturn,@function
+__kernel_sigreturn:
+.LSTART_sigreturn:
+       popl %eax               /* XXX does this mean it needs unwind info? */
+       movl $__NR_sigreturn, %eax
+       int $0x80
+.LEND_sigreturn:
+       .size __kernel_sigreturn,.-.LSTART_sigreturn
+
+       .balign 32
+       .globl __kernel_rt_sigreturn
+       .type __kernel_rt_sigreturn,@function
+__kernel_rt_sigreturn:
+.LSTART_rt_sigreturn:
+       movl $__NR_rt_sigreturn, %eax
+       int $0x80
+.LEND_rt_sigreturn:
+       .size __kernel_rt_sigreturn,.-.LSTART_rt_sigreturn
+       .balign 32
+       .previous
+
+       .section .eh_frame,"a",@progbits
+.LSTARTFRAMEDLSI1:
+       .long .LENDCIEDLSI1-.LSTARTCIEDLSI1
+.LSTARTCIEDLSI1:
+       .long 0                 /* CIE ID */
+       .byte 1                 /* Version number */
+       .string "zRS"           /* NUL-terminated augmentation string */
+       .uleb128 1              /* Code alignment factor */
+       .sleb128 -4             /* Data alignment factor */
+       .byte 8                 /* Return address register column */
+       .uleb128 1              /* Augmentation value length */
+       .byte 0x1b              /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
+       .byte 0                 /* DW_CFA_nop */
+       .align 4
+.LENDCIEDLSI1:
+       .long .LENDFDEDLSI1-.LSTARTFDEDLSI1 /* Length FDE */
+.LSTARTFDEDLSI1:
+       .long .LSTARTFDEDLSI1-.LSTARTFRAMEDLSI1 /* CIE pointer */
+       /* HACK: The dwarf2 unwind routines will subtract 1 from the
+          return address to get an address in the middle of the
+          presumed call instruction.  Since we didn't get here via
+          a call, we need to include the nop before the real start
+          to make up for it.  */
+       .long .LSTART_sigreturn-1-.     /* PC-relative start address */
+       .long .LEND_sigreturn-.LSTART_sigreturn+1
+       .uleb128 0                      /* Augmentation */
+       /* What follows are the instructions for the table generation.
+          We record the locations of each register saved.  This is
+          complicated by the fact that the "CFA" is always assumed to
+          be the value of the stack pointer in the caller.  This means
+          that we must define the CFA of this body of code to be the
+          saved value of the stack pointer in the sigcontext.  Which
+          also means that there is no fixed relation to the other 
+          saved registers, which means that we must use DW_CFA_expression
+          to compute their addresses.  It also means that when we 
+          adjust the stack with the popl, we have to do it all over again.  */
+
+#define do_cfa_expr(offset)                                            \
+       .byte 0x0f;                     /* DW_CFA_def_cfa_expression */ \
+       .uleb128 1f-0f;                 /*   length */                  \
+0:     .byte 0x74;                     /*     DW_OP_breg4 */           \
+       .sleb128 offset;                /*      offset */               \
+       .byte 0x06;                     /*     DW_OP_deref */           \
+1:
+
+#define do_expr(regno, offset)                                         \
+       .byte 0x10;                     /* DW_CFA_expression */         \
+       .uleb128 regno;                 /*   regno */                   \
+       .uleb128 1f-0f;                 /*   length */                  \
+0:     .byte 0x74;                     /*     DW_OP_breg4 */           \
+       .sleb128 offset;                /*       offset */              \
+1:
+
+       do_cfa_expr(SIGCONTEXT_esp+4)
+       do_expr(0, SIGCONTEXT_eax+4)
+       do_expr(1, SIGCONTEXT_ecx+4)
+       do_expr(2, SIGCONTEXT_edx+4)
+       do_expr(3, SIGCONTEXT_ebx+4)
+       do_expr(5, SIGCONTEXT_ebp+4)
+       do_expr(6, SIGCONTEXT_esi+4)
+       do_expr(7, SIGCONTEXT_edi+4)
+       do_expr(8, SIGCONTEXT_eip+4)
+
+       .byte 0x42      /* DW_CFA_advance_loc 2 -- nop; popl eax. */
+
+       do_cfa_expr(SIGCONTEXT_esp)
+       do_expr(0, SIGCONTEXT_eax)
+       do_expr(1, SIGCONTEXT_ecx)
+       do_expr(2, SIGCONTEXT_edx)
+       do_expr(3, SIGCONTEXT_ebx)
+       do_expr(5, SIGCONTEXT_ebp)
+       do_expr(6, SIGCONTEXT_esi)
+       do_expr(7, SIGCONTEXT_edi)
+       do_expr(8, SIGCONTEXT_eip)
+
+       .align 4
+.LENDFDEDLSI1:
+
+       .long .LENDFDEDLSI2-.LSTARTFDEDLSI2 /* Length FDE */
+.LSTARTFDEDLSI2:
+       .long .LSTARTFDEDLSI2-.LSTARTFRAMEDLSI1 /* CIE pointer */
+       /* HACK: See above wrt unwind library assumptions.  */
+       .long .LSTART_rt_sigreturn-1-.  /* PC-relative start address */
+       .long .LEND_rt_sigreturn-.LSTART_rt_sigreturn+1
+       .uleb128 0                      /* Augmentation */
+       /* What follows are the instructions for the table generation.
+          We record the locations of each register saved.  This is
+          slightly less complicated than the above, since we don't
+          modify the stack pointer in the process.  */
+
+       do_cfa_expr(RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_esp)
+       do_expr(0, RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_eax)
+       do_expr(1, RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_ecx)
+       do_expr(2, RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_edx)
+       do_expr(3, RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_ebx)
+       do_expr(5, RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_ebp)
+       do_expr(6, RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_esi)
+       do_expr(7, RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_edi)
+       do_expr(8, RT_SIGFRAME_sigcontext-4 + SIGCONTEXT_eip)
+
+       .align 4
+.LENDFDEDLSI2:
+       .previous
index 1a36d26e15eb0c6d370832ee166dd0fba3700f59..ed879bf42995aa6a51ad955c2feff15d7644b28f 100644 (file)
@@ -119,4 +119,4 @@ SYSENTER_RETURN:
 /*
  * Get the common code for the sigreturn entry points.
  */
-#include "vsyscall-sigreturn.S"
+#include "vsyscall-sigreturn_32.S"