Merge to Fedora kernel-2.6.18-1.2224_FC5 patched with stable patch-2.6.18.1-vs2.0...
[linux-2.6.git] / include / asm-i386 / elf.h
index ffef1f3..f3de7f3 100644 (file)
@@ -7,10 +7,7 @@
 
 #include <asm/ptrace.h>
 #include <asm/user.h>
-#include <asm/processor.h>
-#include <asm/system.h>                /* for savesegment */
 #include <asm/auxvec.h>
-#include <asm/desc.h>
 
 #include <linux/utsname.h>
 
@@ -48,6 +45,12 @@ typedef struct user_fxsr_struct elf_fpxregset_t;
 #define ELF_DATA       ELFDATA2LSB
 #define ELF_ARCH       EM_386
 
+#ifdef __KERNEL__
+
+#include <asm/processor.h>
+#include <asm/system.h>                /* for savesegment */
+#include <asm/desc.h>
+
 /* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program starts %edx
    contains a pointer to a function which might be registered using `atexit'.
    This provides a mean for the dynamic linker to call DT_FINI functions for
@@ -111,7 +114,6 @@ typedef struct user_fxsr_struct elf_fpxregset_t;
 
 #define ELF_PLATFORM  (vx_new_uts(machine))
 
-#ifdef __KERNEL__
 #define SET_PERSONALITY(ex, ibcs2) do { } while (0)
 
 /*
@@ -130,31 +132,44 @@ extern int dump_task_extended_fpu (struct task_struct *, struct user_fxsr_struct
 #define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs)
 #define ELF_CORE_COPY_XFPREGS(tsk, elf_xfpregs) dump_task_extended_fpu(tsk, elf_xfpregs)
 
+#define VDSO_HIGH_BASE         (__fix_to_virt(FIX_VDSO))
+#define VDSO_BASE              ((unsigned long)current->mm->context.vdso)
+
+#ifdef CONFIG_COMPAT_VDSO
+# define VDSO_COMPAT_BASE      VDSO_HIGH_BASE
+# define VDSO_PRELINK          VDSO_HIGH_BASE
+#else
+# define VDSO_COMPAT_BASE      VDSO_BASE
+# define VDSO_PRELINK          0
+#endif
+
+#define VDSO_COMPAT_SYM(x) \
+               (VDSO_COMPAT_BASE + (unsigned long)(x) - VDSO_PRELINK)
+
+#define VDSO_SYM(x) \
+               (VDSO_BASE + (unsigned long)(x) - VDSO_PRELINK)
+
+#define VDSO_HIGH_EHDR         ((const struct elfhdr *) VDSO_HIGH_BASE)
+#define VDSO_EHDR              ((const struct elfhdr *) VDSO_COMPAT_BASE)
+
 extern void __kernel_vsyscall;
-#define VSYSCALL_BASE  ((unsigned long)current->mm->context.vdso)
-#define VSYSCALL_EHDR  ((const struct elfhdr *) VSYSCALL_BASE)
-#define VSYSCALL_OFFSET        ((unsigned long) &__kernel_vsyscall)
-#define VSYSCALL_ENTRY (VSYSCALL_BASE + VSYSCALL_OFFSET)
-
-/* kernel-internal fixmap address: */
-#define __VSYSCALL_BASE        (__fix_to_virt(FIX_VSYSCALL))
-#define __VSYSCALL_EHDR        ((const struct elfhdr *) __VSYSCALL_BASE)
-
-#define ARCH_DLINFO                                                    \
-do {                                                                   \
-       if (VSYSCALL_BASE) {                                            \
-               NEW_AUX_ENT(AT_SYSINFO, VSYSCALL_ENTRY);                \
-               NEW_AUX_ENT(AT_SYSINFO_EHDR, VSYSCALL_BASE);            \
-       }                                                               \
-} while (0)
+
+#define VDSO_ENTRY             VDSO_SYM(&__kernel_vsyscall)
 
 #define ARCH_HAS_SETUP_ADDITIONAL_PAGES
 struct linux_binprm;
 extern int arch_setup_additional_pages(struct linux_binprm *bprm,
-       int executable_stack, unsigned long start_code,
-       unsigned long interp_map_address);
+                                       int executable_stack, unsigned long start_code,
+                                       unsigned long interp_map_address);
+
+extern unsigned int vdso_enabled;
+
+#define ARCH_DLINFO                                            \
+do if (vdso_enabled) {                                         \
+               NEW_AUX_ENT(AT_SYSINFO, VDSO_ENTRY);            \
+               NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_COMPAT_BASE); \
+} while (0)
 
-#if 0  /* Disabled for exec-shield, where a normal vma holds the vDSO.  */
 /*
  * These macros parameterize elf_core_dump in fs/binfmt_elf.c to write out
  * extra segments containing the vsyscall DSO contents.  Dumping its
@@ -163,15 +178,15 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm,
  * Dumping its extra ELF program headers includes all the other information
  * a debugger needs to easily find how the vsyscall DSO was being used.
  */
-#define ELF_CORE_EXTRA_PHDRS           (__VSYSCALL_EHDR->e_phnum)
+#define ELF_CORE_EXTRA_PHDRS           (VDSO_HIGH_EHDR->e_phnum)
 #define ELF_CORE_WRITE_EXTRA_PHDRS                                           \
 do {                                                                         \
        const struct elf_phdr *const vsyscall_phdrs =                         \
-               (const struct elf_phdr *) (__VSYSCALL_BASE                    \
-                                          + __VSYSCALL_EHDR->e_phoff);       \
+               (const struct elf_phdr *) (VDSO_HIGH_BASE                     \
+                                          + VDSO_HIGH_EHDR->e_phoff);    \
        int i;                                                                \
        Elf32_Off ofs = 0;                                                    \
-       for (i = 0; i < __VSYSCALL_EHDR->e_phnum; ++i) {                      \
+       for (i = 0; i < VDSO_HIGH_EHDR->e_phnum; ++i) {               \
                struct elf_phdr phdr = vsyscall_phdrs[i];                     \
                if (phdr.p_type == PT_LOAD) {                                 \
                        BUG_ON(ofs != 0);                                     \
@@ -189,23 +204,19 @@ do {                                                                            \
 #define ELF_CORE_WRITE_EXTRA_DATA                                            \
 do {                                                                         \
        const struct elf_phdr *const vsyscall_phdrs =                         \
-               (const struct elf_phdr *) (__VSYSCALL_BASE                    \
-                                          + __VSYSCALL_EHDR->e_phoff);       \
+               (const struct elf_phdr *) (VDSO_HIGH_BASE                     \
+                                          + VDSO_HIGH_EHDR->e_phoff);    \
        int i;                                                                \
-       for (i = 0; i < __VSYSCALL_EHDR->e_phnum; ++i) {                      \
+       for (i = 0; i < VDSO_HIGH_EHDR->e_phnum; ++i) {               \
                if (vsyscall_phdrs[i].p_type == PT_LOAD)                      \
                        DUMP_WRITE((void *) vsyscall_phdrs[i].p_vaddr,        \
                                   PAGE_ALIGN(vsyscall_phdrs[i].p_memsz));    \
        }                                                                     \
 } while (0)
-#endif
 
 #endif
 
 #define __HAVE_ARCH_RANDOMIZE_BRK
 extern void randomize_brk(unsigned long old_brk);
 
-#define __HAVE_ARCH_VSYSCALL
-extern void map_vsyscall(void);
-
 #endif