Commit 5d66da3d authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt Committed by Paul Mackerras

[PATCH] powerpc: Make the vDSO functions set error code (#2)

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: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent d3ed6583
...@@ -35,6 +35,7 @@ V_FUNCTION_BEGIN(__kernel_sync_dicache) ...@@ -35,6 +35,7 @@ V_FUNCTION_BEGIN(__kernel_sync_dicache)
subf r8,r6,r4 /* compute length */ subf r8,r6,r4 /* compute length */
add r8,r8,r5 /* ensure we get enough */ add r8,r8,r5 /* ensure we get enough */
srwi. r8,r8,7 /* compute line count */ srwi. r8,r8,7 /* compute line count */
crclr cr0*4+so
beqlr /* nothing to do? */ beqlr /* nothing to do? */
mtctr r8 mtctr r8
mr r3,r6 mr r3,r6
...@@ -58,6 +59,7 @@ V_FUNCTION_END(__kernel_sync_dicache) ...@@ -58,6 +59,7 @@ V_FUNCTION_END(__kernel_sync_dicache)
*/ */
V_FUNCTION_BEGIN(__kernel_sync_dicache_p5) V_FUNCTION_BEGIN(__kernel_sync_dicache_p5)
.cfi_startproc .cfi_startproc
crclr cr0*4+so
sync sync
isync isync
li r3,0 li r3,0
......
...@@ -54,7 +54,6 @@ V_FUNCTION_BEGIN(__kernel_get_syscall_map) ...@@ -54,7 +54,6 @@ V_FUNCTION_BEGIN(__kernel_get_syscall_map)
.cfi_startproc .cfi_startproc
mflr r12 mflr r12
.cfi_register lr,r12 .cfi_register lr,r12
mr r4,r3 mr r4,r3
bl __get_datapage@local bl __get_datapage@local
mtlr r12 mtlr r12
...@@ -63,6 +62,7 @@ V_FUNCTION_BEGIN(__kernel_get_syscall_map) ...@@ -63,6 +62,7 @@ V_FUNCTION_BEGIN(__kernel_get_syscall_map)
beqlr beqlr
li r0,__NR_syscalls li r0,__NR_syscalls
stw r0,0(r4) stw r0,0(r4)
crclr cr0*4+so
blr blr
.cfi_endproc .cfi_endproc
V_FUNCTION_END(__kernel_get_syscall_map) V_FUNCTION_END(__kernel_get_syscall_map)
...@@ -80,6 +80,7 @@ V_FUNCTION_BEGIN(__kernel_get_tbfreq) ...@@ -80,6 +80,7 @@ V_FUNCTION_BEGIN(__kernel_get_tbfreq)
lwz r4,(CFG_TB_TICKS_PER_SEC + 4)(r3) lwz r4,(CFG_TB_TICKS_PER_SEC + 4)(r3)
lwz r3,CFG_TB_TICKS_PER_SEC(r3) lwz r3,CFG_TB_TICKS_PER_SEC(r3)
mtlr r12 mtlr r12
crclr cr0*4+so
blr blr
.cfi_endproc .cfi_endproc
V_FUNCTION_END(__kernel_get_tbfreq) V_FUNCTION_END(__kernel_get_tbfreq)
...@@ -59,6 +59,7 @@ V_FUNCTION_BEGIN(__kernel_gettimeofday) ...@@ -59,6 +59,7 @@ V_FUNCTION_BEGIN(__kernel_gettimeofday)
stw r5,TZONE_TZ_DSTTIME(r11) stw r5,TZONE_TZ_DSTTIME(r11)
1: mtlr r12 1: mtlr r12
crclr cr0*4+so
li r3,0 li r3,0
blr blr
...@@ -117,6 +118,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime) ...@@ -117,6 +118,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
mulli r5,r5,1000 mulli r5,r5,1000
stw r5,TSPC32_TV_NSEC(r11) stw r5,TSPC32_TV_NSEC(r11)
mtlr r12 mtlr r12
crclr cr0*4+so
li r3,0 li r3,0
blr blr
...@@ -185,6 +187,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime) ...@@ -185,6 +187,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
stw r4,TSPC32_TV_NSEC(r11) stw r4,TSPC32_TV_NSEC(r11)
mtlr r12 mtlr r12
crclr cr0*4+so
li r3,0 li r3,0
blr blr
...@@ -219,6 +222,7 @@ V_FUNCTION_BEGIN(__kernel_clock_getres) ...@@ -219,6 +222,7 @@ V_FUNCTION_BEGIN(__kernel_clock_getres)
li r3,0 li r3,0
cmpli cr0,r4,0 cmpli cr0,r4,0
crclr cr0*4+so
beqlr beqlr
lis r5,CLOCK_REALTIME_RES@h lis r5,CLOCK_REALTIME_RES@h
ori r5,r5,CLOCK_REALTIME_RES@l ori r5,r5,CLOCK_REALTIME_RES@l
......
...@@ -35,6 +35,7 @@ V_FUNCTION_BEGIN(__kernel_sync_dicache) ...@@ -35,6 +35,7 @@ V_FUNCTION_BEGIN(__kernel_sync_dicache)
subf r8,r6,r4 /* compute length */ subf r8,r6,r4 /* compute length */
add r8,r8,r5 /* ensure we get enough */ add r8,r8,r5 /* ensure we get enough */
srwi. r8,r8,7 /* compute line count */ srwi. r8,r8,7 /* compute line count */
crclr cr0*4+so
beqlr /* nothing to do? */ beqlr /* nothing to do? */
mtctr r8 mtctr r8
mr r3,r6 mr r3,r6
...@@ -58,6 +59,7 @@ V_FUNCTION_END(__kernel_sync_dicache) ...@@ -58,6 +59,7 @@ V_FUNCTION_END(__kernel_sync_dicache)
*/ */
V_FUNCTION_BEGIN(__kernel_sync_dicache_p5) V_FUNCTION_BEGIN(__kernel_sync_dicache_p5)
.cfi_startproc .cfi_startproc
crclr cr0*4+so
sync sync
isync isync
li r3,0 li r3,0
......
...@@ -54,12 +54,12 @@ V_FUNCTION_BEGIN(__kernel_get_syscall_map) ...@@ -54,12 +54,12 @@ V_FUNCTION_BEGIN(__kernel_get_syscall_map)
.cfi_startproc .cfi_startproc
mflr r12 mflr r12
.cfi_register lr,r12 .cfi_register lr,r12
mr r4,r3 mr r4,r3
bl V_LOCAL_FUNC(__get_datapage) bl V_LOCAL_FUNC(__get_datapage)
mtlr r12 mtlr r12
addi r3,r3,CFG_SYSCALL_MAP64 addi r3,r3,CFG_SYSCALL_MAP64
cmpli cr0,r4,0 cmpli cr0,r4,0
crclr cr0*4+so
beqlr beqlr
li r0,__NR_syscalls li r0,__NR_syscalls
stw r0,0(r4) stw r0,0(r4)
...@@ -80,6 +80,7 @@ V_FUNCTION_BEGIN(__kernel_get_tbfreq) ...@@ -80,6 +80,7 @@ V_FUNCTION_BEGIN(__kernel_get_tbfreq)
bl V_LOCAL_FUNC(__get_datapage) bl V_LOCAL_FUNC(__get_datapage)
ld r3,CFG_TB_TICKS_PER_SEC(r3) ld r3,CFG_TB_TICKS_PER_SEC(r3)
mtlr r12 mtlr r12
crclr cr0*4+so
blr blr
.cfi_endproc .cfi_endproc
V_FUNCTION_END(__kernel_get_tbfreq) V_FUNCTION_END(__kernel_get_tbfreq)
...@@ -52,6 +52,7 @@ V_FUNCTION_BEGIN(__kernel_gettimeofday) ...@@ -52,6 +52,7 @@ V_FUNCTION_BEGIN(__kernel_gettimeofday)
stw r4,TZONE_TZ_MINWEST(r10) stw r4,TZONE_TZ_MINWEST(r10)
stw r5,TZONE_TZ_DSTTIME(r10) stw r5,TZONE_TZ_DSTTIME(r10)
1: mtlr r12 1: mtlr r12
crclr cr0*4+so
li r3,0 /* always success */ li r3,0 /* always success */
blr blr
.cfi_endproc .cfi_endproc
...@@ -99,6 +100,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime) ...@@ -99,6 +100,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
std r0,TSPC64_TV_NSEC(r11) /* store nsec in tp */ std r0,TSPC64_TV_NSEC(r11) /* store nsec in tp */
mtlr r12 mtlr r12
crclr cr0*4+so
li r3,0 li r3,0
blr blr
...@@ -159,6 +161,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime) ...@@ -159,6 +161,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
std r7,TSPC64_TV_NSEC(r11) std r7,TSPC64_TV_NSEC(r11)
mtlr r12 mtlr r12
crclr cr0*4+so
li r3,0 li r3,0
blr blr
...@@ -193,6 +196,7 @@ V_FUNCTION_BEGIN(__kernel_clock_getres) ...@@ -193,6 +196,7 @@ V_FUNCTION_BEGIN(__kernel_clock_getres)
li r3,0 li r3,0
cmpli cr0,r4,0 cmpli cr0,r4,0
crclr cr0*4+so
beqlr beqlr
lis r5,CLOCK_REALTIME_RES@h lis r5,CLOCK_REALTIME_RES@h
ori r5,r5,CLOCK_REALTIME_RES@l ori r5,r5,CLOCK_REALTIME_RES@l
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
#define VDSO32_MBASE VDSO32_LBASE #define VDSO32_MBASE VDSO32_LBASE
#define VDSO64_MBASE VDSO64_LBASE #define VDSO64_MBASE VDSO64_LBASE
#define VDSO_VERSION_STRING LINUX_2.6.12 #define VDSO_VERSION_STRING LINUX_2.6.15
/* Define if 64 bits VDSO has procedure descriptors */ /* Define if 64 bits VDSO has procedure descriptors */
#undef VDS64_HAS_DESCRIPTORS #undef VDS64_HAS_DESCRIPTORS
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment