Skip to content

Commit

Permalink
x86 vDSO: use vdso-syms.lds
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Roland McGrath authored and Ingo Molnar committed Jan 30, 2008
1 parent 5b93049 commit 7f3646a
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 15 deletions.
3 changes: 1 addition & 2 deletions arch/x86/vdso/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 0 additions & 2 deletions arch/x86/vdso/vdso-start.S

This file was deleted.

18 changes: 7 additions & 11 deletions arch/x86/vdso/vma.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,20 @@
#include <asm/vsyscall.h>
#include <asm/vgtod.h>
#include <asm/proto.h>
#include "voffset.h"
#include <asm/vdso.h>

int vdso_enabled = 1;

#define VEXTERN(x) extern typeof(__ ## x) *vdso_ ## x;
#include "vextern.h"
#include "vextern.h" /* Just for VMAGIC. */
#undef VEXTERN

extern char vdso_kernel_start[], vdso_start[], vdso_end[];
int vdso_enabled = 1;

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;
Expand Down Expand Up @@ -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;
Expand Down
14 changes: 14 additions & 0 deletions include/asm-x86/vdso.h
Original file line number Diff line number Diff line change
@@ -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 */

0 comments on commit 7f3646a

Please sign in to comment.