Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: vDSO: Fix -Wunitialized in powerpc VDSO_CALL() wrapper

The _rval register variable is meant to be an output operand of the asm
statement but is instead used as input operand.
clang 20.1 notices this and triggers -Wuninitialized warnings:

tools/testing/selftests/timers/auxclock.c:154:10: error: variable '_rval' is uninitialized when used here [-Werror,-Wuninitialized]
154 | return VDSO_CALL(self->vdso_clock_gettime64, 2, clockid, ts);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/testing/selftests/timers/../vDSO/vdso_call.h:59:10: note: expanded from macro 'VDSO_CALL'
59 | : "r" (_rval) \
| ^~~~~
tools/testing/selftests/timers/auxclock.c:154:10: note: variable '_rval' is declared here
tools/testing/selftests/timers/../vDSO/vdso_call.h:47:2: note: expanded from macro 'VDSO_CALL'
47 | register long _rval asm ("r3"); \
| ^

It seems the list of input and output operands have been switched around.
However as the argument registers are not always initialized they can not
be marked as pure inputs as that would trigger -Wuninitialized warnings.
Adding _rval as another input and output operand does also not work as it
would collide with the existing _r3 variable.

Instead reuse _r3 for both the argument and the return value.

Fixes: 6eda706a535c ("selftests: vDSO: fix the way vDSO functions are called for powerpc")
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Link: https://lore.kernel.org/all/20250812-vdso-tests-fixes-v2-1-90f499dd35f8@linutronix.de
Closes: https://lore.kernel.org/oe-kbuild-all/202506180223.BOOk5jDK-lkp@intel.com/

authored by

Thomas Weißschuh and committed by
Thomas Gleixner
9f15e0f9 437054b1

+3 -4
+3 -4
tools/testing/selftests/vDSO/vdso_call.h
··· 44 44 register long _r6 asm ("r6"); \ 45 45 register long _r7 asm ("r7"); \ 46 46 register long _r8 asm ("r8"); \ 47 - register long _rval asm ("r3"); \ 48 47 \ 49 48 LOADARGS_##nr(fn, args); \ 50 49 \ ··· 53 54 " bns+ 1f\n" \ 54 55 " neg 3, 3\n" \ 55 56 "1:" \ 56 - : "+r" (_r0), "=r" (_r3), "+r" (_r4), "+r" (_r5), \ 57 + : "+r" (_r0), "+r" (_r3), "+r" (_r4), "+r" (_r5), \ 57 58 "+r" (_r6), "+r" (_r7), "+r" (_r8) \ 58 - : "r" (_rval) \ 59 + : \ 59 60 : "r9", "r10", "r11", "r12", "cr0", "cr1", "cr5", \ 60 61 "cr6", "cr7", "xer", "lr", "ctr", "memory" \ 61 62 ); \ 62 - _rval; \ 63 + _r3; \ 63 64 }) 64 65 65 66 #else