getrandom.S 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * Userland implementation of getrandom() for processes
  4. * for use in the vDSO
  5. *
  6. * Copyright (C) 2024 Christophe Leroy <christophe.leroy@csgroup.eu>, CS GROUP France
  7. */
  8. #include <asm/processor.h>
  9. #include <asm/ppc_asm.h>
  10. #include <asm/vdso.h>
  11. #include <asm/vdso_datapage.h>
  12. #include <asm/asm-offsets.h>
  13. #include <asm/unistd.h>
  14. /*
  15. * The macro sets two stack frames, one for the caller and one for the callee
  16. * because there are no requirement for the caller to set a stack frame when
  17. * calling VDSO so it may have omitted to set one, especially on PPC64
  18. */
  19. .macro cvdso_call funct
  20. .cfi_startproc
  21. PPC_STLU r1, -PPC_MIN_STKFRM(r1)
  22. .cfi_adjust_cfa_offset PPC_MIN_STKFRM
  23. mflr r0
  24. PPC_STLU r1, -PPC_MIN_STKFRM(r1)
  25. .cfi_adjust_cfa_offset PPC_MIN_STKFRM
  26. PPC_STL r0, PPC_MIN_STKFRM + PPC_LR_STKOFF(r1)
  27. .cfi_rel_offset lr, PPC_MIN_STKFRM + PPC_LR_STKOFF
  28. #ifdef __powerpc64__
  29. PPC_STL r2, PPC_MIN_STKFRM + STK_GOT(r1)
  30. .cfi_rel_offset r2, PPC_MIN_STKFRM + STK_GOT
  31. #endif
  32. get_realdatapage r8, r11
  33. addi r8, r8, VDSO_RNG_DATA_OFFSET
  34. bl CFUNC(DOTSYM(\funct))
  35. PPC_LL r0, PPC_MIN_STKFRM + PPC_LR_STKOFF(r1)
  36. #ifdef __powerpc64__
  37. PPC_LL r2, PPC_MIN_STKFRM + STK_GOT(r1)
  38. .cfi_restore r2
  39. #endif
  40. cmpwi r3, 0
  41. mtlr r0
  42. addi r1, r1, 2 * PPC_MIN_STKFRM
  43. .cfi_restore lr
  44. .cfi_def_cfa_offset 0
  45. crclr so
  46. bgelr+
  47. crset so
  48. neg r3, r3
  49. blr
  50. .cfi_endproc
  51. .endm
  52. .text
  53. V_FUNCTION_BEGIN(__kernel_getrandom)
  54. cvdso_call __c_kernel_getrandom
  55. V_FUNCTION_END(__kernel_getrandom)