]> Git Repo - J-linux.git/blob - arch/powerpc/kernel/vdso/getrandom.S
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / arch / powerpc / kernel / vdso / getrandom.S
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 <[email protected]>, 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 /*
16  * The macro sets two stack frames, one for the caller and one for the callee
17  * because there are no requirement for the caller to set a stack frame when
18  * calling VDSO so it may have omitted to set one, especially on PPC64
19  */
20
21 .macro cvdso_call funct
22   .cfi_startproc
23         PPC_STLU        r1, -PPC_MIN_STKFRM(r1)
24   .cfi_adjust_cfa_offset PPC_MIN_STKFRM
25         mflr            r0
26         PPC_STLU        r1, -PPC_MIN_STKFRM(r1)
27   .cfi_adjust_cfa_offset PPC_MIN_STKFRM
28         PPC_STL         r0, PPC_MIN_STKFRM + PPC_LR_STKOFF(r1)
29   .cfi_rel_offset lr, PPC_MIN_STKFRM + PPC_LR_STKOFF
30 #ifdef __powerpc64__
31         PPC_STL         r2, PPC_MIN_STKFRM + STK_GOT(r1)
32   .cfi_rel_offset r2, PPC_MIN_STKFRM + STK_GOT
33 #endif
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
53         .text
54 V_FUNCTION_BEGIN(__kernel_getrandom)
55         cvdso_call __c_kernel_getrandom
56 V_FUNCTION_END(__kernel_getrandom)
This page took 0.047363 seconds and 4 git commands to generate.