mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-11 08:18:47 +00:00
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
|
||||
# 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
|
||||
|
@ -1,2 +0,0 @@
|
||||
.globl vdso_kernel_start
|
||||
vdso_kernel_start:
|
@ -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
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