Skip to content

Commit

Permalink
selftests: vdso: Add support for vdso_test_random for powerpc
Browse files Browse the repository at this point in the history
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.leroy@csgroup.eu>
  • Loading branch information
chleroy committed Aug 21, 2024
1 parent bd05c8f commit 7a61237
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 0 deletions.
1 change: 1 addition & 0 deletions tools/arch/powerpc/vdso
6 changes: 6 additions & 0 deletions tools/testing/selftests/vDSO/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
40 changes: 40 additions & 0 deletions tools/testing/selftests/vDSO/vdso_call.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 7a61237

Please sign in to comment.