xref: /openbmc/linux/arch/x86/include/asm/vdso.h (revision b34e08d5)
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