1 #ifndef _ASM_X86_VDSO_H 2 #define _ASM_X86_VDSO_H 3 4 #include <asm/page_types.h> 5 #include <linux/linkage.h> 6 7 #ifdef __ASSEMBLER__ 8 9 #define DEFINE_VDSO_IMAGE(symname, filename) \ 10 __PAGE_ALIGNED_DATA ; \ 11 .globl symname##_start, symname##_end ; \ 12 .align PAGE_SIZE ; \ 13 symname##_start: ; \ 14 .incbin filename ; \ 15 symname##_end: ; \ 16 .align PAGE_SIZE /* extra data here leaks to userspace. */ ; \ 17 \ 18 .previous ; \ 19 \ 20 .globl symname##_pages ; \ 21 .bss ; \ 22 .align 8 ; \ 23 .type symname##_pages, @object ; \ 24 symname##_pages: ; \ 25 .zero (symname##_end - symname##_start + PAGE_SIZE - 1) / PAGE_SIZE * (BITS_PER_LONG / 8) ; \ 26 .size symname##_pages, .-symname##_pages 27 28 #else 29 30 #define DECLARE_VDSO_IMAGE(symname) \ 31 extern char symname##_start[], symname##_end[]; \ 32 extern struct page *symname##_pages[] 33 34 #if defined CONFIG_X86_32 || defined CONFIG_COMPAT 35 36 #include <asm/vdso32.h> 37 38 DECLARE_VDSO_IMAGE(vdso32_int80); 39 #ifdef CONFIG_COMPAT 40 DECLARE_VDSO_IMAGE(vdso32_syscall); 41 #endif 42 DECLARE_VDSO_IMAGE(vdso32_sysenter); 43 44 /* 45 * Given a pointer to the vDSO image, find the pointer to VDSO32_name 46 * as that symbol is defined in the vDSO sources or linker script. 47 */ 48 #define VDSO32_SYMBOL(base, name) \ 49 ({ \ 50 extern const char VDSO32_##name[]; \ 51 (void __user *)(VDSO32_##name + (unsigned long)(base)); \ 52 }) 53 #endif 54 55 /* 56 * These symbols are defined with the addresses in the vsyscall page. 57 * See vsyscall-sigreturn.S. 58 */ 59 extern void __user __kernel_sigreturn; 60 extern void __user __kernel_rt_sigreturn; 61 62 void __init patch_vdso32(void *vdso, size_t len); 63 64 #endif /* __ASSEMBLER__ */ 65 66 #endif /* _ASM_X86_VDSO_H */ 67