mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
![Benjamin Herrenschmidt](/assets/img/avatar_default.png)
The vDSO functions should have the same calling convention as a syscall. Unfortunately, they currently don't set the cr0.so bit which is used to indicate an error. This patch makes them clear this bit unconditionally since all functions currently succeed. The syscall fallback done by some of them will eventually override this if the syscall fails. This also changes the symbol version of all vdso exports to make sure glibc can differenciate between old and fixed calls for existing ones like __kernel_gettimeofday. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
83 lines
1.6 KiB
C
83 lines
1.6 KiB
C
#ifndef __PPC64_VDSO_H__
|
|
#define __PPC64_VDSO_H__
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
/* Default link addresses for the vDSOs */
|
|
#define VDSO32_LBASE 0x100000
|
|
#define VDSO64_LBASE 0x100000
|
|
|
|
/* Default map addresses */
|
|
#define VDSO32_MBASE VDSO32_LBASE
|
|
#define VDSO64_MBASE VDSO64_LBASE
|
|
|
|
#define VDSO_VERSION_STRING LINUX_2.6.15
|
|
|
|
/* Define if 64 bits VDSO has procedure descriptors */
|
|
#undef VDS64_HAS_DESCRIPTORS
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
extern unsigned int vdso64_pages;
|
|
extern unsigned int vdso32_pages;
|
|
|
|
/* Offsets relative to thread->vdso_base */
|
|
extern unsigned long vdso64_rt_sigtramp;
|
|
extern unsigned long vdso32_sigtramp;
|
|
extern unsigned long vdso32_rt_sigtramp;
|
|
|
|
extern void vdso_init(void);
|
|
|
|
#else /* __ASSEMBLY__ */
|
|
|
|
#ifdef __VDSO64__
|
|
#ifdef VDS64_HAS_DESCRIPTORS
|
|
#define V_FUNCTION_BEGIN(name) \
|
|
.globl name; \
|
|
.section ".opd","a"; \
|
|
.align 3; \
|
|
name: \
|
|
.quad .name,.TOC.@tocbase,0; \
|
|
.previous; \
|
|
.globl .name; \
|
|
.type .name,@function; \
|
|
.name: \
|
|
|
|
#define V_FUNCTION_END(name) \
|
|
.size .name,.-.name;
|
|
|
|
#define V_LOCAL_FUNC(name) (.name)
|
|
|
|
#else /* VDS64_HAS_DESCRIPTORS */
|
|
|
|
#define V_FUNCTION_BEGIN(name) \
|
|
.globl name; \
|
|
name: \
|
|
|
|
#define V_FUNCTION_END(name) \
|
|
.size name,.-name;
|
|
|
|
#define V_LOCAL_FUNC(name) (name)
|
|
|
|
#endif /* VDS64_HAS_DESCRIPTORS */
|
|
#endif /* __VDSO64__ */
|
|
|
|
#ifdef __VDSO32__
|
|
|
|
#define V_FUNCTION_BEGIN(name) \
|
|
.globl name; \
|
|
.type name,@function; \
|
|
name: \
|
|
|
|
#define V_FUNCTION_END(name) \
|
|
.size name,.-name;
|
|
|
|
#define V_LOCAL_FUNC(name) (name)
|
|
|
|
#endif /* __VDSO32__ */
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
#endif /* __PPC64_VDSO_H__ */
|