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:
parent
5b93049337
commit
7f3646aa16
@ -3,8 +3,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
# files to link into the vdso
|
# files to link into the vdso
|
||||||
# vdso-start.o has to be first
|
vobjs-y := vdso-note.o vclock_gettime.o vgetcpu.o vvar.o
|
||||||
vobjs-y := vdso-start.o vdso-note.o vclock_gettime.o vgetcpu.o vvar.o
|
|
||||||
|
|
||||||
# files to link into kernel
|
# files to link into kernel
|
||||||
obj-y := vma.o vdso.o vdso-syms.o
|
obj-y := vma.o vdso.o vdso-syms.o
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
.globl vdso_kernel_start
|
|
||||||
vdso_kernel_start:
|
|
@ -11,23 +11,20 @@
|
|||||||
#include <asm/vsyscall.h>
|
#include <asm/vsyscall.h>
|
||||||
#include <asm/vgtod.h>
|
#include <asm/vgtod.h>
|
||||||
#include <asm/proto.h>
|
#include <asm/proto.h>
|
||||||
#include "voffset.h"
|
#include <asm/vdso.h>
|
||||||
|
|
||||||
|
#include "vextern.h" /* Just for VMAGIC. */
|
||||||
|
#undef VEXTERN
|
||||||
|
|
||||||
int vdso_enabled = 1;
|
int vdso_enabled = 1;
|
||||||
|
|
||||||
#define VEXTERN(x) extern typeof(__ ## x) *vdso_ ## x;
|
extern char vdso_start[], vdso_end[];
|
||||||
#include "vextern.h"
|
|
||||||
#undef VEXTERN
|
|
||||||
|
|
||||||
extern char vdso_kernel_start[], vdso_start[], vdso_end[];
|
|
||||||
extern unsigned short vdso_sync_cpuid;
|
extern unsigned short vdso_sync_cpuid;
|
||||||
|
|
||||||
struct page **vdso_pages;
|
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) {
|
if (*(void **)p != (void *)VMAGIC) {
|
||||||
printk("VDSO: variable %s broken\n", name);
|
printk("VDSO: variable %s broken\n", name);
|
||||||
vdso_enabled = 0;
|
vdso_enabled = 0;
|
||||||
@ -62,9 +59,8 @@ static int __init init_vdso_vars(void)
|
|||||||
vdso_enabled = 0;
|
vdso_enabled = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define V(x) *(typeof(x) *) var_ref(vbase, (char *)RELOC_HIDE(&x, 0), #x)
|
|
||||||
#define VEXTERN(x) \
|
#define VEXTERN(x) \
|
||||||
V(vdso_ ## x) = &__ ## x;
|
*(typeof(__ ## x) **) var_ref(VDSO64_SYMBOL(vbase, x), #x) = &__ ## x;
|
||||||
#include "vextern.h"
|
#include "vextern.h"
|
||||||
#undef VEXTERN
|
#undef VEXTERN
|
||||||
return 0;
|
return 0;
|
||||||
|
14
include/asm-x86/vdso.h
Normal file
14
include/asm-x86/vdso.h
Normal 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 */
|
Loading…
x
Reference in New Issue
Block a user