x86 vDSO: use vdso-syms.lds

This patch changes the kernel's references to addresses in the vDSO image
to be based on the symbols defined by vdso-syms.lds instead of the old
vdso-syms.o symbols.  This is all wrapped up in a macro defined by the new
asm-x86/vdso.h header; that's the only place in the kernel source that has
to know the details of the scheme for getting vDSO symbol values.

Signed-off-by: Roland McGrath <roland@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
Roland McGrath 2008-01-30 13:30:41 +01:00 committed by Ingo Molnar
parent 5b93049337
commit 7f3646aa16
4 changed files with 22 additions and 15 deletions

View file

@ -3,8 +3,7 @@
#
# files to link into the vdso
# vdso-start.o has to be first
vobjs-y := vdso-start.o vdso-note.o vclock_gettime.o vgetcpu.o vvar.o
vobjs-y := vdso-note.o vclock_gettime.o vgetcpu.o vvar.o
# files to link into kernel
obj-y := vma.o vdso.o vdso-syms.o

View file

@ -1,2 +0,0 @@
.globl vdso_kernel_start
vdso_kernel_start:

View file

@ -11,23 +11,20 @@
#include <asm/vsyscall.h>
#include <asm/vgtod.h>
#include <asm/proto.h>
#include "voffset.h"
#include <asm/vdso.h>
#include "vextern.h" /* Just for VMAGIC. */
#undef VEXTERN
int vdso_enabled = 1;
#define VEXTERN(x) extern typeof(__ ## x) *vdso_ ## x;
#include "vextern.h"
#undef VEXTERN
extern char vdso_kernel_start[], vdso_start[], vdso_end[];
extern char vdso_start[], vdso_end[];
extern unsigned short vdso_sync_cpuid;
struct page **vdso_pages;
static inline void *var_ref(void *vbase, char *var, char *name)
static inline void *var_ref(void *p, char *name)
{
unsigned offset = var - &vdso_kernel_start[0] + VDSO_TEXT_OFFSET;
void *p = vbase + offset;
if (*(void **)p != (void *)VMAGIC) {
printk("VDSO: variable %s broken\n", name);
vdso_enabled = 0;
@ -62,9 +59,8 @@ static int __init init_vdso_vars(void)
vdso_enabled = 0;
}
#define V(x) *(typeof(x) *) var_ref(vbase, (char *)RELOC_HIDE(&x, 0), #x)
#define VEXTERN(x) \
V(vdso_ ## x) = &__ ## x;
*(typeof(__ ## x) **) var_ref(VDSO64_SYMBOL(vbase, x), #x) = &__ ## x;
#include "vextern.h"
#undef VEXTERN
return 0;

14
include/asm-x86/vdso.h Normal file
View file

@ -0,0 +1,14 @@
#ifndef _ASM_X86_VDSO_H
#define _ASM_X86_VDSO_H 1
extern const char VDSO64_PRELINK[];
/*
* Given a pointer to the vDSO image, find the pointer to VDSO64_name
* as that symbol is defined in the vDSO sources or linker script.
*/
#define VDSO64_SYMBOL(base, name) ({ \
extern const char VDSO64_##name[]; \
(void *) (VDSO64_##name - VDSO64_PRELINK + (unsigned long) (base)); })
#endif /* asm-x86/vdso.h */