[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: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>

authored by Benjamin Herrenschmidt and committed by Paul Mackerras 5d66da3d d3ed6583

+17 -3
+2
arch/powerpc/kernel/vdso32/cacheflush.S
··· 35 subf r8,r6,r4 /* compute length */ 36 add r8,r8,r5 /* ensure we get enough */ 37 srwi. r8,r8,7 /* compute line count */ 38 beqlr /* nothing to do? */ 39 mtctr r8 40 mr r3,r6 ··· 59 */ 60 V_FUNCTION_BEGIN(__kernel_sync_dicache_p5) 61 .cfi_startproc 62 sync 63 isync 64 li r3,0
··· 35 subf r8,r6,r4 /* compute length */ 36 add r8,r8,r5 /* ensure we get enough */ 37 srwi. r8,r8,7 /* compute line count */ 38 + crclr cr0*4+so 39 beqlr /* nothing to do? */ 40 mtctr r8 41 mr r3,r6 ··· 58 */ 59 V_FUNCTION_BEGIN(__kernel_sync_dicache_p5) 60 .cfi_startproc 61 + crclr cr0*4+so 62 sync 63 isync 64 li r3,0
+2 -1
arch/powerpc/kernel/vdso32/datapage.S
··· 54 .cfi_startproc 55 mflr r12 56 .cfi_register lr,r12 57 - 58 mr r4,r3 59 bl __get_datapage@local 60 mtlr r12 ··· 62 beqlr 63 li r0,__NR_syscalls 64 stw r0,0(r4) 65 blr 66 .cfi_endproc 67 V_FUNCTION_END(__kernel_get_syscall_map) ··· 80 lwz r4,(CFG_TB_TICKS_PER_SEC + 4)(r3) 81 lwz r3,CFG_TB_TICKS_PER_SEC(r3) 82 mtlr r12 83 blr 84 .cfi_endproc 85 V_FUNCTION_END(__kernel_get_tbfreq)
··· 54 .cfi_startproc 55 mflr r12 56 .cfi_register lr,r12 57 mr r4,r3 58 bl __get_datapage@local 59 mtlr r12 ··· 63 beqlr 64 li r0,__NR_syscalls 65 stw r0,0(r4) 66 + crclr cr0*4+so 67 blr 68 .cfi_endproc 69 V_FUNCTION_END(__kernel_get_syscall_map) ··· 80 lwz r4,(CFG_TB_TICKS_PER_SEC + 4)(r3) 81 lwz r3,CFG_TB_TICKS_PER_SEC(r3) 82 mtlr r12 83 + crclr cr0*4+so 84 blr 85 .cfi_endproc 86 V_FUNCTION_END(__kernel_get_tbfreq)
+4
arch/powerpc/kernel/vdso32/gettimeofday.S
··· 59 stw r5,TZONE_TZ_DSTTIME(r11) 60 61 1: mtlr r12 62 li r3,0 63 blr 64 ··· 118 mulli r5,r5,1000 119 stw r5,TSPC32_TV_NSEC(r11) 120 mtlr r12 121 li r3,0 122 blr 123 ··· 187 stw r4,TSPC32_TV_NSEC(r11) 188 189 mtlr r12 190 li r3,0 191 blr 192 ··· 222 223 li r3,0 224 cmpli cr0,r4,0 225 beqlr 226 lis r5,CLOCK_REALTIME_RES@h 227 ori r5,r5,CLOCK_REALTIME_RES@l
··· 59 stw r5,TZONE_TZ_DSTTIME(r11) 60 61 1: mtlr r12 62 + crclr cr0*4+so 63 li r3,0 64 blr 65 ··· 117 mulli r5,r5,1000 118 stw r5,TSPC32_TV_NSEC(r11) 119 mtlr r12 120 + crclr cr0*4+so 121 li r3,0 122 blr 123 ··· 185 stw r4,TSPC32_TV_NSEC(r11) 186 187 mtlr r12 188 + crclr cr0*4+so 189 li r3,0 190 blr 191 ··· 219 220 li r3,0 221 cmpli cr0,r4,0 222 + crclr cr0*4+so 223 beqlr 224 lis r5,CLOCK_REALTIME_RES@h 225 ori r5,r5,CLOCK_REALTIME_RES@l
+2
arch/powerpc/kernel/vdso64/cacheflush.S
··· 35 subf r8,r6,r4 /* compute length */ 36 add r8,r8,r5 /* ensure we get enough */ 37 srwi. r8,r8,7 /* compute line count */ 38 beqlr /* nothing to do? */ 39 mtctr r8 40 mr r3,r6 ··· 59 */ 60 V_FUNCTION_BEGIN(__kernel_sync_dicache_p5) 61 .cfi_startproc 62 sync 63 isync 64 li r3,0
··· 35 subf r8,r6,r4 /* compute length */ 36 add r8,r8,r5 /* ensure we get enough */ 37 srwi. r8,r8,7 /* compute line count */ 38 + crclr cr0*4+so 39 beqlr /* nothing to do? */ 40 mtctr r8 41 mr r3,r6 ··· 58 */ 59 V_FUNCTION_BEGIN(__kernel_sync_dicache_p5) 60 .cfi_startproc 61 + crclr cr0*4+so 62 sync 63 isync 64 li r3,0
+2 -1
arch/powerpc/kernel/vdso64/datapage.S
··· 54 .cfi_startproc 55 mflr r12 56 .cfi_register lr,r12 57 - 58 mr r4,r3 59 bl V_LOCAL_FUNC(__get_datapage) 60 mtlr r12 61 addi r3,r3,CFG_SYSCALL_MAP64 62 cmpli cr0,r4,0 63 beqlr 64 li r0,__NR_syscalls 65 stw r0,0(r4) ··· 80 bl V_LOCAL_FUNC(__get_datapage) 81 ld r3,CFG_TB_TICKS_PER_SEC(r3) 82 mtlr r12 83 blr 84 .cfi_endproc 85 V_FUNCTION_END(__kernel_get_tbfreq)
··· 54 .cfi_startproc 55 mflr r12 56 .cfi_register lr,r12 57 mr r4,r3 58 bl V_LOCAL_FUNC(__get_datapage) 59 mtlr r12 60 addi r3,r3,CFG_SYSCALL_MAP64 61 cmpli cr0,r4,0 62 + crclr cr0*4+so 63 beqlr 64 li r0,__NR_syscalls 65 stw r0,0(r4) ··· 80 bl V_LOCAL_FUNC(__get_datapage) 81 ld r3,CFG_TB_TICKS_PER_SEC(r3) 82 mtlr r12 83 + crclr cr0*4+so 84 blr 85 .cfi_endproc 86 V_FUNCTION_END(__kernel_get_tbfreq)
+4
arch/powerpc/kernel/vdso64/gettimeofday.S
··· 52 stw r4,TZONE_TZ_MINWEST(r10) 53 stw r5,TZONE_TZ_DSTTIME(r10) 54 1: mtlr r12 55 li r3,0 /* always success */ 56 blr 57 .cfi_endproc ··· 100 std r0,TSPC64_TV_NSEC(r11) /* store nsec in tp */ 101 102 mtlr r12 103 li r3,0 104 blr 105 ··· 161 std r7,TSPC64_TV_NSEC(r11) 162 163 mtlr r12 164 li r3,0 165 blr 166 ··· 196 197 li r3,0 198 cmpli cr0,r4,0 199 beqlr 200 lis r5,CLOCK_REALTIME_RES@h 201 ori r5,r5,CLOCK_REALTIME_RES@l
··· 52 stw r4,TZONE_TZ_MINWEST(r10) 53 stw r5,TZONE_TZ_DSTTIME(r10) 54 1: mtlr r12 55 + crclr cr0*4+so 56 li r3,0 /* always success */ 57 blr 58 .cfi_endproc ··· 99 std r0,TSPC64_TV_NSEC(r11) /* store nsec in tp */ 100 101 mtlr r12 102 + crclr cr0*4+so 103 li r3,0 104 blr 105 ··· 159 std r7,TSPC64_TV_NSEC(r11) 160 161 mtlr r12 162 + crclr cr0*4+so 163 li r3,0 164 blr 165 ··· 193 194 li r3,0 195 cmpli cr0,r4,0 196 + crclr cr0*4+so 197 beqlr 198 lis r5,CLOCK_REALTIME_RES@h 199 ori r5,r5,CLOCK_REALTIME_RES@l
+1 -1
include/asm-powerpc/vdso.h
··· 11 #define VDSO32_MBASE VDSO32_LBASE 12 #define VDSO64_MBASE VDSO64_LBASE 13 14 - #define VDSO_VERSION_STRING LINUX_2.6.12 15 16 /* Define if 64 bits VDSO has procedure descriptors */ 17 #undef VDS64_HAS_DESCRIPTORS
··· 11 #define VDSO32_MBASE VDSO32_LBASE 12 #define VDSO64_MBASE VDSO64_LBASE 13 14 + #define VDSO_VERSION_STRING LINUX_2.6.15 15 16 /* Define if 64 bits VDSO has procedure descriptors */ 17 #undef VDS64_HAS_DESCRIPTORS