71 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * Macro to call vDSO functions4 *5 * Copyright (C) 2024 Christophe Leroy <christophe.leroy@csgroup.eu>, CS GROUP France6 */7#ifndef __VDSO_CALL_H__8#define __VDSO_CALL_H__9 10#ifdef __powerpc__11 12#define LOADARGS_1(fn, __arg1) do { \13 _r0 = fn; \14 _r3 = (long)__arg1; \15} while (0)16 17#define LOADARGS_2(fn, __arg1, __arg2) do { \18 _r0 = fn; \19 _r3 = (long)__arg1; \20 _r4 = (long)__arg2; \21} while (0)22 23#define LOADARGS_3(fn, __arg1, __arg2, __arg3) do { \24 _r0 = fn; \25 _r3 = (long)__arg1; \26 _r4 = (long)__arg2; \27 _r5 = (long)__arg3; \28} while (0)29 30#define LOADARGS_5(fn, __arg1, __arg2, __arg3, __arg4, __arg5) do { \31 _r0 = fn; \32 _r3 = (long)__arg1; \33 _r4 = (long)__arg2; \34 _r5 = (long)__arg3; \35 _r6 = (long)__arg4; \36 _r7 = (long)__arg5; \37} while (0)38 39#define VDSO_CALL(fn, nr, args...) ({ \40 register void *_r0 asm ("r0"); \41 register long _r3 asm ("r3"); \42 register long _r4 asm ("r4"); \43 register long _r5 asm ("r5"); \44 register long _r6 asm ("r6"); \45 register long _r7 asm ("r7"); \46 register long _r8 asm ("r8"); \47 register long _rval asm ("r3"); \48 \49 LOADARGS_##nr(fn, args); \50 \51 asm volatile( \52 " mtctr %0\n" \53 " bctrl\n" \54 " bns+ 1f\n" \55 " neg 3, 3\n" \56 "1:" \57 : "+r" (_r0), "=r" (_r3), "+r" (_r4), "+r" (_r5), \58 "+r" (_r6), "+r" (_r7), "+r" (_r8) \59 : "r" (_rval) \60 : "r9", "r10", "r11", "r12", "cr0", "cr1", "cr5", \61 "cr6", "cr7", "xer", "lr", "ctr", "memory" \62 ); \63 _rval; \64})65 66#else67#define VDSO_CALL(fn, nr, args...) fn(args)68#endif69 70#endif71