Add the necessary symbolic link and tell Makefile to build
vdso_test_random for powerpc.

In makefile, don't use $(uname_M) which is wrong when cross-building
for powerpc on an x86_64.

Implement the required VDSO_CALL macro to correctly handle errors.

Signed-off-by: Christophe Leroy <christophe.le...@csgroup.eu>
---
 tools/arch/powerpc/vdso                  |  1 +
 tools/testing/selftests/vDSO/Makefile    |  6 ++++
 tools/testing/selftests/vDSO/vdso_call.h | 40 ++++++++++++++++++++++++
 3 files changed, 47 insertions(+)
 create mode 120000 tools/arch/powerpc/vdso

diff --git a/tools/arch/powerpc/vdso b/tools/arch/powerpc/vdso
new file mode 120000
index 000000000000..d31004bf8f55
--- /dev/null
+++ b/tools/arch/powerpc/vdso
@@ -0,0 +1 @@
+../../../arch/powerpc/kernel/vdso/
\ No newline at end of file
diff --git a/tools/testing/selftests/vDSO/Makefile 
b/tools/testing/selftests/vDSO/Makefile
index 10ffdda3f2fa..7e7c9fd200d3 100644
--- a/tools/testing/selftests/vDSO/Makefile
+++ b/tools/testing/selftests/vDSO/Makefile
@@ -17,6 +17,12 @@ ifneq ($(SODIUM),)
 TEST_GEN_PROGS += vdso_test_chacha
 endif
 endif
+ifeq ($(ARCH),powerpc)
+TEST_GEN_PROGS += vdso_test_getrandom
+ifneq ($(SODIUM),)
+TEST_GEN_PROGS += vdso_test_chacha
+endif
+endif
 
 CFLAGS := -std=gnu99
 
diff --git a/tools/testing/selftests/vDSO/vdso_call.h 
b/tools/testing/selftests/vDSO/vdso_call.h
index ca5db2220925..2a33c25756dc 100644
--- a/tools/testing/selftests/vDSO/vdso_call.h
+++ b/tools/testing/selftests/vDSO/vdso_call.h
@@ -7,6 +7,46 @@
 #ifndef __VDSO_CALL_H__
 #define __VDSO_CALL_H__
 
+#ifdef __powerpc__
+
+#define LOADARGS_5(fn, __arg1, __arg2, __arg3, __arg4, __arg5) do {    \
+       _r0 = fn;                                                       \
+       _r3 = (long)__arg1;                                             \
+       _r4 = (long)__arg2;                                             \
+       _r5 = (long)__arg3;                                             \
+       _r6 = (long)__arg4;                                             \
+       _r7 = (long)__arg5;                                             \
+} while (0)
+
+#define VDSO_CALL(fn, nr, args...) ({                                  \
+       register void *_r0 asm ("r0");                                  \
+       register long _r3 asm ("r3");                                   \
+       register long _r4 asm ("r4");                                   \
+       register long _r5 asm ("r5");                                   \
+       register long _r6 asm ("r6");                                   \
+       register long _r7 asm ("r7");                                   \
+       register long _r8 asm ("r8");                                   \
+       register long _rval asm ("r3");                                 \
+                                                                       \
+       LOADARGS_##nr(fn, args);                                        \
+                                                                       \
+       asm volatile(                                                   \
+               "       mtctr %0\n"                                     \
+               "       bctrl\n"                                        \
+               "       bns+    1f\n"                                   \
+               "       neg     3, 3\n"                                 \
+               "1:"                                                    \
+               : "+r" (_r0), "=r" (_r3), "+r" (_r4), "+r" (_r5),       \
+                 "+r" (_r6), "+r" (_r7), "+r" (_r8)                    \
+               : "r" (_rval)                                           \
+               : "r9", "r10", "r11", "r12", "cr0", "cr1", "cr5",       \
+                 "cr6", "cr7", "xer", "lr", "ctr", "memory"            \
+       );                                                              \
+       _rval;                                                          \
+})
+
+#else
 #define VDSO_CALL(fn, nr, args...)     fn(args)
+#endif
 
 #endif
-- 
2.44.0


Reply via email to