mirror of
https://github.com/torvalds/linux.git
synced 2024-11-17 17:41:44 +00:00
2aae950b21
This implements new vDSO for x86-64. The concept is similar to the existing vDSOs on i386 and PPC. x86-64 has had static vsyscalls before, but these are not flexible enough anymore. A vDSO is a ELF shared library supplied by the kernel that is mapped into user address space. The vDSO mapping is randomized for each process for security reasons. Doing this was needed for clock_gettime, because clock_gettime always needs a syscall fallback and having one at a fixed address would have made buffer overflow exploits too easy to write. The vdso can be disabled with vdso=0 It currently includes a new gettimeofday implemention and optimized clock_gettime(). The gettimeofday implementation is slightly faster than the one in the old vsyscall. clock_gettime is significantly faster than the syscall for CLOCK_MONOTONIC and CLOCK_REALTIME. The new calls are generally faster than the old vsyscall. Advantages over the old x86-64 vsyscalls: - Extensible - Randomized - Cleaner - Easier to virtualize (the old static address range previously causes overhead e.g. for Xen because it has to create special page tables for it) Weak points: - glibc support still to be written The VM interface is partly based on Ingo Molnar's i386 version. Includes compile fix from Joachim Deguara Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
45 lines
1.4 KiB
C
45 lines
1.4 KiB
C
#ifndef _ASM_X86_64_VSYSCALL_H_
|
|
#define _ASM_X86_64_VSYSCALL_H_
|
|
|
|
enum vsyscall_num {
|
|
__NR_vgettimeofday,
|
|
__NR_vtime,
|
|
__NR_vgetcpu,
|
|
};
|
|
|
|
#define VSYSCALL_START (-10UL << 20)
|
|
#define VSYSCALL_SIZE 1024
|
|
#define VSYSCALL_END (-2UL << 20)
|
|
#define VSYSCALL_MAPPED_PAGES 1
|
|
#define VSYSCALL_ADDR(vsyscall_nr) (VSYSCALL_START+VSYSCALL_SIZE*(vsyscall_nr))
|
|
|
|
#ifdef __KERNEL__
|
|
#include <linux/seqlock.h>
|
|
|
|
#define __section_vgetcpu_mode __attribute__ ((unused, __section__ (".vgetcpu_mode"), aligned(16)))
|
|
#define __section_jiffies __attribute__ ((unused, __section__ (".jiffies"), aligned(16)))
|
|
|
|
/* Definitions for CONFIG_GENERIC_TIME definitions */
|
|
#define __section_vsyscall_gtod_data __attribute__ \
|
|
((unused, __section__ (".vsyscall_gtod_data"),aligned(16)))
|
|
#define __section_vsyscall_clock __attribute__ \
|
|
((unused, __section__ (".vsyscall_clock"),aligned(16)))
|
|
#define __vsyscall_fn __attribute__ ((unused,__section__(".vsyscall_fn")))
|
|
|
|
#define VGETCPU_RDTSCP 1
|
|
#define VGETCPU_LSL 2
|
|
|
|
#define hpet_readl(a) readl((const void __iomem *)fix_to_virt(FIX_HPET_BASE) + a)
|
|
#define hpet_writel(d,a) writel(d, (void __iomem *)fix_to_virt(FIX_HPET_BASE) + a)
|
|
|
|
extern int __vgetcpu_mode;
|
|
extern volatile unsigned long __jiffies;
|
|
|
|
/* kernel space (writeable) */
|
|
extern int vgetcpu_mode;
|
|
extern struct timezone sys_tz;
|
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
#endif /* _ASM_X86_64_VSYSCALL_H_ */
|