|
@@ -16,6 +16,7 @@
|
|
#include <asm/vdso.h>
|
|
#include <asm/vdso.h>
|
|
#include <asm/page.h>
|
|
#include <asm/page.h>
|
|
|
|
|
|
|
|
+#if defined(CONFIG_X86_64)
|
|
unsigned int __read_mostly vdso_enabled = 1;
|
|
unsigned int __read_mostly vdso_enabled = 1;
|
|
|
|
|
|
extern char vdso_start[], vdso_end[];
|
|
extern char vdso_start[], vdso_end[];
|
|
@@ -28,8 +29,12 @@ static unsigned vdso_size;
|
|
extern char vdsox32_start[], vdsox32_end[];
|
|
extern char vdsox32_start[], vdsox32_end[];
|
|
extern struct page *vdsox32_pages[];
|
|
extern struct page *vdsox32_pages[];
|
|
static unsigned vdsox32_size;
|
|
static unsigned vdsox32_size;
|
|
|
|
+#endif
|
|
|
|
+#endif
|
|
|
|
|
|
-static void __init patch_vdsox32(void *vdso, size_t len)
|
|
|
|
|
|
+#if defined(CONFIG_X86_32) || defined(CONFIG_X86_X32_ABI) || \
|
|
|
|
+ defined(CONFIG_COMPAT)
|
|
|
|
+void __init patch_vdso32(void *vdso, size_t len)
|
|
{
|
|
{
|
|
Elf32_Ehdr *hdr = vdso;
|
|
Elf32_Ehdr *hdr = vdso;
|
|
Elf32_Shdr *sechdrs, *alt_sec = 0;
|
|
Elf32_Shdr *sechdrs, *alt_sec = 0;
|
|
@@ -52,7 +57,7 @@ static void __init patch_vdsox32(void *vdso, size_t len)
|
|
}
|
|
}
|
|
|
|
|
|
/* If we get here, it's probably a bug. */
|
|
/* If we get here, it's probably a bug. */
|
|
- pr_warning("patch_vdsox32: .altinstructions not found\n");
|
|
|
|
|
|
+ pr_warning("patch_vdso32: .altinstructions not found\n");
|
|
return; /* nothing to patch */
|
|
return; /* nothing to patch */
|
|
|
|
|
|
found:
|
|
found:
|
|
@@ -61,6 +66,7 @@ found:
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+#if defined(CONFIG_X86_64)
|
|
static void __init patch_vdso64(void *vdso, size_t len)
|
|
static void __init patch_vdso64(void *vdso, size_t len)
|
|
{
|
|
{
|
|
Elf64_Ehdr *hdr = vdso;
|
|
Elf64_Ehdr *hdr = vdso;
|
|
@@ -104,7 +110,7 @@ static int __init init_vdso(void)
|
|
vdso_pages[i] = virt_to_page(vdso_start + i*PAGE_SIZE);
|
|
vdso_pages[i] = virt_to_page(vdso_start + i*PAGE_SIZE);
|
|
|
|
|
|
#ifdef CONFIG_X86_X32_ABI
|
|
#ifdef CONFIG_X86_X32_ABI
|
|
- patch_vdsox32(vdsox32_start, vdsox32_end - vdsox32_start);
|
|
|
|
|
|
+ patch_vdso32(vdsox32_start, vdsox32_end - vdsox32_start);
|
|
npages = (vdsox32_end - vdsox32_start + PAGE_SIZE - 1) / PAGE_SIZE;
|
|
npages = (vdsox32_end - vdsox32_start + PAGE_SIZE - 1) / PAGE_SIZE;
|
|
vdsox32_size = npages << PAGE_SHIFT;
|
|
vdsox32_size = npages << PAGE_SHIFT;
|
|
for (i = 0; i < npages; i++)
|
|
for (i = 0; i < npages; i++)
|
|
@@ -204,3 +210,4 @@ static __init int vdso_setup(char *s)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
__setup("vdso=", vdso_setup);
|
|
__setup("vdso=", vdso_setup);
|
|
|
|
+#endif
|