vdso_call.h 1.6 KB

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