diff mbox series

[9/9] vdso: Modify getrandom to include the correct namespace

Message ID 20240903151437.1002990-10-vincenzo.frascino@arm.com (mailing list archive)
State New
Headers show
Series vdso: Use only headers from the vdso/ namespace | expand

Commit Message

Vincenzo Frascino Sept. 3, 2024, 3:14 p.m. UTC
The VDSO implementation includes headers from outside of the
vdso/ namespace.

Modify getrandom to take advantage of the refactoring done in the
previous patches and to include only the vdso/ namespace.

Cc: Andy Lutomirski <luto@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
---
 lib/vdso/getrandom.c | 22 ++++++++--------------
 1 file changed, 8 insertions(+), 14 deletions(-)

Comments

Christophe Leroy Sept. 4, 2024, 5:26 p.m. UTC | #1
Le 03/09/2024 à 17:14, Vincenzo Frascino a écrit :
> The VDSO implementation includes headers from outside of the
> vdso/ namespace.
> 
> Modify getrandom to take advantage of the refactoring done in the
> previous patches and to include only the vdso/ namespace.
> 
> Cc: Andy Lutomirski <luto@kernel.org>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Jason A. Donenfeld <Jason@zx2c4.com>
> Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
> ---
>   lib/vdso/getrandom.c | 22 ++++++++--------------
>   1 file changed, 8 insertions(+), 14 deletions(-)
> 
> diff --git a/lib/vdso/getrandom.c b/lib/vdso/getrandom.c
> index 938ca539aaa6..9c26b738e4a1 100644
> --- a/lib/vdso/getrandom.c
> +++ b/lib/vdso/getrandom.c
> @@ -3,19 +3,13 @@
>    * Copyright (C) 2022-2024 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
>    */
>   
> -#include <linux/array_size.h>
> -#include <linux/minmax.h>
>   #include <vdso/datapage.h>
>   #include <vdso/getrandom.h>
>   #include <vdso/unaligned.h>
> -#include <asm/vdso/getrandom.h>
> -#include <uapi/linux/mman.h>
> -#include <uapi/linux/random.h>

Now build fails on powerpc because struct vgetrandom_opaque_params is 
unknown.

x86 get it by chance via the following header inclusion chain:

In file included from ./include/linux/random.h:10,
                  from ./include/linux/nodemask.h:98,
                  from ./include/linux/mmzone.h:18,
                  from ./include/linux/gfp.h:7,
                  from ./include/linux/xarray.h:16,
                  from ./include/linux/radix-tree.h:21,
                  from ./include/linux/idr.h:15,
                  from ./include/linux/kernfs.h:12,
                  from ./include/linux/sysfs.h:16,
                  from ./include/linux/kobject.h:20,
                  from ./include/linux/of.h:18,
                  from ./include/linux/clocksource.h:19,
                  from ./include/clocksource/hyperv_timer.h:16,
                  from ./arch/x86/include/asm/vdso/gettimeofday.h:21,
                  from ./include/vdso/datapage.h:164,
                  from 
arch/x86/entry/vdso/../../../../lib/vdso/getrandom.c:7,
                  from arch/x86/entry/vdso/vgetrandom.c:7:




> -
> -#undef PAGE_SIZE
> -#undef PAGE_MASK
> -#define PAGE_SIZE (1UL << CONFIG_PAGE_SHIFT)
> -#define PAGE_MASK (~(PAGE_SIZE - 1))
> +#include <vdso/mman.h>
> +#include <vdso/page.h>
> +#include <vdso/array_size.h>
> +#include <vdso/minmax.h>
>   
>   #define MEMCPY_AND_ZERO_SRC(type, dst, src, len) do {				\
>   	while (len >= sizeof(type)) {						\
> @@ -68,7 +62,7 @@ static __always_inline ssize_t
>   __cvdso_getrandom_data(const struct vdso_rng_data *rng_info, void *buffer, size_t len,
>   		       unsigned int flags, void *opaque_state, size_t opaque_len)
>   {
> -	ssize_t ret = min_t(size_t, INT_MAX & PAGE_MASK /* = MAX_RW_COUNT */, len);
> +	ssize_t ret = min_t(size_t, INT_MAX & VDSO_PAGE_MASK /* = MAX_RW_COUNT */, len);
>   	struct vgetrandom_state *state = opaque_state;
>   	size_t batch_len, nblocks, orig_len = len;
>   	bool in_use, have_retried = false;
> @@ -79,15 +73,15 @@ __cvdso_getrandom_data(const struct vdso_rng_data *rng_info, void *buffer, size_
>   	if (unlikely(opaque_len == ~0UL && !buffer && !len && !flags)) {
>   		struct vgetrandom_opaque_params *params = opaque_state;
>   		params->size_of_opaque_state = sizeof(*state);
> -		params->mmap_prot = PROT_READ | PROT_WRITE;
> -		params->mmap_flags = MAP_DROPPABLE | MAP_ANONYMOUS;
> +		params->mmap_prot = VDSO_MMAP_PROT;
> +		params->mmap_flags = VDSO_MMAP_FLAGS;
>   		for (size_t i = 0; i < ARRAY_SIZE(params->reserved); ++i)
>   			params->reserved[i] = 0;
>   		return 0;
>   	}
>   
>   	/* The state must not straddle a page, since pages can be zeroed at any time. */
> -	if (unlikely(((unsigned long)opaque_state & ~PAGE_MASK) + sizeof(*state) > PAGE_SIZE))
> +	if (unlikely(((unsigned long)opaque_state & ~VDSO_PAGE_MASK) + sizeof(*state) > VDSO_PAGE_SIZE))
>   		return -EFAULT;
>   
>   	/* Handle unexpected flags by falling back to the kernel. */
Vincenzo Frascino Sept. 6, 2024, 11:52 a.m. UTC | #2
On 04/09/2024 18:26, Christophe Leroy wrote:
> 
> 
> Le 03/09/2024 à 17:14, Vincenzo Frascino a écrit :
...

> 
> Now build fails on powerpc because struct vgetrandom_opaque_params is unknown.
> 
> x86 get it by chance via the following header inclusion chain:
> 
> In file included from ./include/linux/random.h:10,
>                  from ./include/linux/nodemask.h:98,
>                  from ./include/linux/mmzone.h:18,
>                  from ./include/linux/gfp.h:7,
>                  from ./include/linux/xarray.h:16,
>                  from ./include/linux/radix-tree.h:21,
>                  from ./include/linux/idr.h:15,
>                  from ./include/linux/kernfs.h:12,
>                  from ./include/linux/sysfs.h:16,
>                  from ./include/linux/kobject.h:20,
>                  from ./include/linux/of.h:18,
>                  from ./include/linux/clocksource.h:19,
>                  from ./include/clocksource/hyperv_timer.h:16,
>                  from ./arch/x86/include/asm/vdso/gettimeofday.h:21,
>                  from ./include/vdso/datapage.h:164,
>                  from arch/x86/entry/vdso/../../../../lib/vdso/getrandom.c:7,
>                  from arch/x86/entry/vdso/vgetrandom.c:7:
> 
> 
> 
> 

This tells me very little ;)

Can you please provide more details? e.g. What is the error you are getting? How
do I reproduce it?

I am happy to include the required change as part of this series.

Overall, the reason why I am doing this exercise it to sanitize the headers for
all the architectures so that in future we do not have issues. It is good we
find problems now.
Christophe Leroy Sept. 6, 2024, 12:04 p.m. UTC | #3
Le 06/09/2024 à 13:52, Vincenzo Frascino a écrit :
> 
> 
> On 04/09/2024 18:26, Christophe Leroy wrote:
>>
>>
>> Le 03/09/2024 à 17:14, Vincenzo Frascino a écrit :
> ...
> 
>>
>> Now build fails on powerpc because struct vgetrandom_opaque_params is unknown.
>>
>> x86 get it by chance via the following header inclusion chain:
>>
>> In file included from ./include/linux/random.h:10,
>>                   from ./include/linux/nodemask.h:98,
>>                   from ./include/linux/mmzone.h:18,
>>                   from ./include/linux/gfp.h:7,
>>                   from ./include/linux/xarray.h:16,
>>                   from ./include/linux/radix-tree.h:21,
>>                   from ./include/linux/idr.h:15,
>>                   from ./include/linux/kernfs.h:12,
>>                   from ./include/linux/sysfs.h:16,
>>                   from ./include/linux/kobject.h:20,
>>                   from ./include/linux/of.h:18,
>>                   from ./include/linux/clocksource.h:19,
>>                   from ./include/clocksource/hyperv_timer.h:16,
>>                   from ./arch/x86/include/asm/vdso/gettimeofday.h:21,
>>                   from ./include/vdso/datapage.h:164,
>>                   from arch/x86/entry/vdso/../../../../lib/vdso/getrandom.c:7,
>>                   from arch/x86/entry/vdso/vgetrandom.c:7:
>>
>>
>>
>>
> 
> This tells me very little ;)
> 
> Can you please provide more details? e.g. What is the error you are getting? How
> do I reproduce it?
> 
> I am happy to include the required change as part of this series.
> 
> Overall, the reason why I am doing this exercise it to sanitize the headers for
> all the architectures so that in future we do not have issues. It is good we
> find problems now.
> 

More details:

$ make ARCH=powerpc CROSS_COMPILE=ppc-linux- mpc885_ads_defconfig

$ LANG= make ARCH=powerpc CROSS_COMPILE=ppc-linux- vmlinux
   SYNC    include/config/auto.conf
   SYSHDR  arch/powerpc/include/generated/uapi/asm/unistd_32.h
   SYSHDR  arch/powerpc/include/generated/uapi/asm/unistd_64.h
   SYSTBL  arch/powerpc/include/generated/asm/syscall_table_32.h
   SYSTBL  arch/powerpc/include/generated/asm/syscall_table_64.h
   SYSTBL  arch/powerpc/include/generated/asm/syscall_table_spu.h
   HOSTCC  scripts/dtc/dtc.o
   HOSTCC  scripts/dtc/flattree.o
   HOSTCC  scripts/dtc/fstree.o
   HOSTCC  scripts/dtc/data.o
   HOSTCC  scripts/dtc/livetree.o
   HOSTCC  scripts/dtc/treesource.o
   HOSTCC  scripts/dtc/srcpos.o
   HOSTCC  scripts/dtc/checks.o
   HOSTCC  scripts/dtc/util.o
   LEX     scripts/dtc/dtc-lexer.lex.c
   YACC    scripts/dtc/dtc-parser.tab.[ch]
   HOSTCC  scripts/dtc/dtc-lexer.lex.o
   HOSTCC  scripts/dtc/dtc-parser.tab.o
   HOSTLD  scripts/dtc/dtc
   HOSTCC  scripts/dtc/libfdt/fdt.o
   HOSTCC  scripts/dtc/libfdt/fdt_ro.o
   HOSTCC  scripts/dtc/libfdt/fdt_wip.o
   HOSTCC  scripts/dtc/libfdt/fdt_sw.o
   HOSTCC  scripts/dtc/libfdt/fdt_rw.o
   HOSTCC  scripts/dtc/libfdt/fdt_strerror.o
   HOSTCC  scripts/dtc/libfdt/fdt_empty_tree.o
   HOSTCC  scripts/dtc/libfdt/fdt_addresses.o
   HOSTCC  scripts/dtc/libfdt/fdt_overlay.o
   HOSTCC  scripts/dtc/fdtoverlay.o
   HOSTLD  scripts/dtc/fdtoverlay
   HOSTCC  scripts/kallsyms
   HOSTCC  scripts/sorttable
   CC      scripts/mod/empty.o
   HOSTCC  scripts/mod/mk_elfconfig
   MKELF   scripts/mod/elfconfig.h
   HOSTCC  scripts/mod/modpost.o
   CC      scripts/mod/devicetable-offsets.s
   HOSTCC  scripts/mod/file2alias.o
   HOSTCC  scripts/mod/sumversion.o
   HOSTCC  scripts/mod/symsearch.o
   HOSTLD  scripts/mod/modpost
   CC      kernel/bounds.s
   CC      arch/powerpc/kernel/asm-offsets.s
   CALL    scripts/checksyscalls.sh
   CHKSHA1 include/linux/atomic/atomic-arch-fallback.h
   CHKSHA1 include/linux/atomic/atomic-instrumented.h
   CHKSHA1 include/linux/atomic/atomic-long.h
   LDS     arch/powerpc/kernel/vdso/vdso32.lds
   VDSO32A arch/powerpc/kernel/vdso/sigtramp32-32.o
   VDSO32A arch/powerpc/kernel/vdso/gettimeofday-32.o
   VDSO32A arch/powerpc/kernel/vdso/datapage-32.o
   VDSO32A arch/powerpc/kernel/vdso/cacheflush-32.o
   VDSO32A arch/powerpc/kernel/vdso/note-32.o
   VDSO32A arch/powerpc/kernel/vdso/getcpu-32.o
   VDSO32A arch/powerpc/kernel/vdso/getrandom-32.o
   VDSO32A arch/powerpc/kernel/vdso/vgetrandom-chacha-32.o
   VDSO32C arch/powerpc/kernel/vdso/vgettimeofday-32.o
   VDSO32C arch/powerpc/kernel/vdso/vgetrandom-32.o
In file included from <command-line>:
/home/chleroy/linux-powerpc/lib/vdso/getrandom.c: In function 
'__cvdso_getrandom_data':
/home/chleroy/linux-powerpc/lib/vdso/getrandom.c:75:23: error: invalid 
use of undefined type 'struct vgetrandom_opaque_params'
    75 |                 params->size_of_opaque_state = sizeof(*state);
       |                       ^~
/home/chleroy/linux-powerpc/lib/vdso/getrandom.c:76:23: error: invalid 
use of undefined type 'struct vgetrandom_opaque_params'
    76 |                 params->mmap_prot = VDSO_MMAP_PROT;
       |                       ^~
/home/chleroy/linux-powerpc/lib/vdso/getrandom.c:77:23: error: invalid 
use of undefined type 'struct vgetrandom_opaque_params'
    77 |                 params->mmap_flags = VDSO_MMAP_FLAGS;
       |                       ^~
In file included from ./include/linux/array_size.h:5,
                  from ./include/linux/kernel.h:16,
                  from ./arch/powerpc/include/asm/page.h:11,
                  from ./arch/powerpc/include/asm/vdso/page.h:8,
                  from ./include/vdso/page.h:5,
                  from /home/chleroy/linux-powerpc/lib/vdso/getrandom.c:10:
/home/chleroy/linux-powerpc/lib/vdso/getrandom.c:78:57: error: invalid 
use of undefined type 'struct vgetrandom_opaque_params'
    78 |                 for (size_t i = 0; i < 
ARRAY_SIZE(params->reserved); ++i)
       |                                                         ^~
./include/vdso/array_size.h:11:33: note: in definition of macro 'ARRAY_SIZE'
    11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + 
__must_be_array(arr))
       |                                 ^~~
/home/chleroy/linux-powerpc/lib/vdso/getrandom.c:78:57: error: invalid 
use of undefined type 'struct vgetrandom_opaque_params'
    78 |                 for (size_t i = 0; i < 
ARRAY_SIZE(params->reserved); ++i)
       |                                                         ^~
./include/vdso/array_size.h:11:48: note: in definition of macro 'ARRAY_SIZE'
    11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + 
__must_be_array(arr))
       |                                                ^~~
In file included from ./include/linux/container_of.h:5,
                  from ./include/linux/kernel.h:22:
/home/chleroy/linux-powerpc/lib/vdso/getrandom.c:78:57: error: invalid 
use of undefined type 'struct vgetrandom_opaque_params'
    78 |                 for (size_t i = 0; i < 
ARRAY_SIZE(params->reserved); ++i)
       |                                                         ^~
./include/linux/build_bug.h:16:62: note: in definition of macro 
'BUILD_BUG_ON_ZERO'
    16 | #define BUILD_BUG_ON_ZERO(e) ((int)(sizeof(struct { 
int:(-!!(e)); })))
       |                                                              ^
./include/linux/compiler.h:243:51: note: in expansion of macro '__same_type'
   243 | #define __must_be_array(a) 
BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
       |                                                   ^~~~~~~~~~~
./include/vdso/array_size.h:11:59: note: in expansion of macro 
'__must_be_array'
    11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + 
__must_be_array(arr))
       | 
^~~~~~~~~~~~~~~
/home/chleroy/linux-powerpc/lib/vdso/getrandom.c:78:40: note: in 
expansion of macro 'ARRAY_SIZE'
    78 |                 for (size_t i = 0; i < 
ARRAY_SIZE(params->reserved); ++i)
       |                                        ^~~~~~~~~~
/home/chleroy/linux-powerpc/lib/vdso/getrandom.c:78:57: error: invalid 
use of undefined type 'struct vgetrandom_opaque_params'
    78 |                 for (size_t i = 0; i < 
ARRAY_SIZE(params->reserved); ++i)
       |                                                         ^~
./include/linux/build_bug.h:16:62: note: in definition of macro 
'BUILD_BUG_ON_ZERO'
    16 | #define BUILD_BUG_ON_ZERO(e) ((int)(sizeof(struct { 
int:(-!!(e)); })))
       |                                                              ^
./include/linux/compiler.h:243:51: note: in expansion of macro '__same_type'
   243 | #define __must_be_array(a) 
BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
       |                                                   ^~~~~~~~~~~
./include/vdso/array_size.h:11:59: note: in expansion of macro 
'__must_be_array'
    11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + 
__must_be_array(arr))
       | 
^~~~~~~~~~~~~~~
/home/chleroy/linux-powerpc/lib/vdso/getrandom.c:78:40: note: in 
expansion of macro 'ARRAY_SIZE'
    78 |                 for (size_t i = 0; i < 
ARRAY_SIZE(params->reserved); ++i)
       |                                        ^~~~~~~~~~
./include/linux/build_bug.h:16:51: error: bit-field '<anonymous>' width 
not an integer constant
    16 | #define BUILD_BUG_ON_ZERO(e) ((int)(sizeof(struct { 
int:(-!!(e)); })))
       |                                                   ^
./include/linux/compiler.h:243:33: note: in expansion of macro 
'BUILD_BUG_ON_ZERO'
   243 | #define __must_be_array(a) 
BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
       |                                 ^~~~~~~~~~~~~~~~~
./include/vdso/array_size.h:11:59: note: in expansion of macro 
'__must_be_array'
    11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + 
__must_be_array(arr))
       | 
^~~~~~~~~~~~~~~
/home/chleroy/linux-powerpc/lib/vdso/getrandom.c:78:40: note: in 
expansion of macro 'ARRAY_SIZE'
    78 |                 for (size_t i = 0; i < 
ARRAY_SIZE(params->reserved); ++i)
       |                                        ^~~~~~~~~~
/home/chleroy/linux-powerpc/lib/vdso/getrandom.c:79:31: error: invalid 
use of undefined type 'struct vgetrandom_opaque_params'
    79 |                         params->reserved[i] = 0;
       |                               ^~
In file included from ./include/vdso/datapage.h:7,
                  from /home/chleroy/linux-powerpc/lib/vdso/getrandom.c:6:
/home/chleroy/linux-powerpc/lib/vdso/getrandom.c:88:32: error: 
'GRND_NONBLOCK' undeclared (first use in this function); did you mean 
'MAP_NONBLOCK'?
    88 |         if (unlikely(flags & ~(GRND_NONBLOCK | GRND_RANDOM | 
GRND_INSECURE)))
       |                                ^~~~~~~~~~~~~
./include/linux/compiler.h:77:45: note: in definition of macro 'unlikely'
    77 | # define unlikely(x)    __builtin_expect(!!(x), 0)
       |                                             ^
/home/chleroy/linux-powerpc/lib/vdso/getrandom.c:88:32: note: each 
undeclared identifier is reported only once for each function it appears in
    88 |         if (unlikely(flags & ~(GRND_NONBLOCK | GRND_RANDOM | 
GRND_INSECURE)))
       |                                ^~~~~~~~~~~~~
./include/linux/compiler.h:77:45: note: in definition of macro 'unlikely'
    77 | # define unlikely(x)    __builtin_expect(!!(x), 0)
       |                                             ^
/home/chleroy/linux-powerpc/lib/vdso/getrandom.c:88:48: error: 
'GRND_RANDOM' undeclared (first use in this function)
    88 |         if (unlikely(flags & ~(GRND_NONBLOCK | GRND_RANDOM | 
GRND_INSECURE)))
       |                                                ^~~~~~~~~~~
./include/linux/compiler.h:77:45: note: in definition of macro 'unlikely'
    77 | # define unlikely(x)    __builtin_expect(!!(x), 0)
       |                                             ^
/home/chleroy/linux-powerpc/lib/vdso/getrandom.c:88:62: error: 
'GRND_INSECURE' undeclared (first use in this function)
    88 |         if (unlikely(flags & ~(GRND_NONBLOCK | GRND_RANDOM | 
GRND_INSECURE)))
       | 
^~~~~~~~~~~~~
./include/linux/compiler.h:77:45: note: in definition of macro 'unlikely'
    77 | # define unlikely(x)    __builtin_expect(!!(x), 0)
       |                                             ^
make[2]: *** [arch/powerpc/kernel/vdso/Makefile:87: 
arch/powerpc/kernel/vdso/vgetrandom-32.o] Error 1
make[1]: *** [arch/powerpc/Makefile:388: vdso_prepare] Error 2
make: *** [Makefile:227: __sub-make] Error 2



FWIW, here are the changes I added on top of your series:

diff --git a/arch/powerpc/include/asm/vdso/getrandom.h 
b/arch/powerpc/include/asm/vdso/getrandom.h
index 501d6bb14e8a..4af9efdbe296 100644
--- a/arch/powerpc/include/asm/vdso/getrandom.h
+++ b/arch/powerpc/include/asm/vdso/getrandom.h
@@ -5,6 +5,8 @@
  #ifndef _ASM_POWERPC_VDSO_GETRANDOM_H
  #define _ASM_POWERPC_VDSO_GETRANDOM_H

+#include <vdso/datapage.h>
+
  #ifndef __ASSEMBLY__

  static __always_inline int do_syscall_3(const unsigned long _r0, const 
unsigned long _r3,
diff --git a/arch/powerpc/include/asm/vdso/mman.h 
b/arch/powerpc/include/asm/vdso/mman.h
new file mode 100644
index 000000000000..4c936c9d11ab
--- /dev/null
+++ b/arch/powerpc/include/asm/vdso/mman.h
@@ -0,0 +1,15 @@
+
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __ASM_VDSO_MMAN_H
+#define __ASM_VDSO_MMAN_H
+
+#ifndef __ASSEMBLY__
+
+#include <uapi/linux/mman.h>
+
+#define VDSO_MMAP_PROT	PROT_READ | PROT_WRITE
+#define VDSO_MMAP_FLAGS	MAP_DROPPABLE | MAP_ANONYMOUS
+
+#endif /* !__ASSEMBLY__ */
+
+#endif /* __ASM_VDSO_MMAN_H */
diff --git a/arch/powerpc/include/asm/vdso/page.h 
b/arch/powerpc/include/asm/vdso/page.h
new file mode 100644
index 000000000000..c41fd44aca5b
--- /dev/null
+++ b/arch/powerpc/include/asm/vdso/page.h
@@ -0,0 +1,15 @@
+
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __ASM_VDSO_PAGE_H
+#define __ASM_VDSO_PAGE_H
+
+#ifndef __ASSEMBLY__
+
+#include <asm/page.h>
+
+#define VDSO_PAGE_MASK	PAGE_MASK
+#define VDSO_PAGE_SIZE	PAGE_SIZE
+
+#endif /* !__ASSEMBLY__ */
+
+#endif /* __ASM_VDSO_PAGE_H */


Christophe
Vincenzo Frascino Sept. 6, 2024, 12:40 p.m. UTC | #4
On 06/09/2024 13:04, Christophe Leroy wrote:
> 
> 
> Le 06/09/2024 à 13:52, Vincenzo Frascino a écrit :
>>
>>
>> On 04/09/2024 18:26, Christophe Leroy wrote:
>>>
>>>
>>> Le 03/09/2024 à 17:14, Vincenzo Frascino a écrit :
>> ...
>>

...

> 
> More details:
> 
> $ make ARCH=powerpc CROSS_COMPILE=ppc-linux- mpc885_ads_defconfig
> 
> $ LANG= make ARCH=powerpc CROSS_COMPILE=ppc-linux- vmlinux
>   SYNC    include/config/auto.conf
>   SYSHDR  arch/powerpc/include/generated/uapi/asm/unistd_32.h
>   SYSHDR  arch/powerpc/include/generated/uapi/asm/unistd_64.h
>   SYSTBL  arch/powerpc/include/generated/asm/syscall_table_32.h
>   SYSTBL  arch/powerpc/include/generated/asm/syscall_table_64.h
>   SYSTBL  arch/powerpc/include/generated/asm/syscall_table_spu.h

Thank you Christophe, is upstream code sufficient to reproduce the issue? Or do
I need specific patches?

> 
> 
> Christophe
>
Christophe Leroy Sept. 6, 2024, 12:49 p.m. UTC | #5
Le 06/09/2024 à 14:40, Vincenzo Frascino a écrit :
> 
> 
> On 06/09/2024 13:04, Christophe Leroy wrote:
>>
>>
>> Le 06/09/2024 à 13:52, Vincenzo Frascino a écrit :
>>>
>>>
>>> On 04/09/2024 18:26, Christophe Leroy wrote:
>>>>
>>>>
>>>> Le 03/09/2024 à 17:14, Vincenzo Frascino a écrit :
>>> ...
>>>
> 
> ...
> 
>>
>> More details:
>>
>> $ make ARCH=powerpc CROSS_COMPILE=ppc-linux- mpc885_ads_defconfig
>>
>> $ LANG= make ARCH=powerpc CROSS_COMPILE=ppc-linux- vmlinux
>>    SYNC    include/config/auto.conf
>>    SYSHDR  arch/powerpc/include/generated/uapi/asm/unistd_32.h
>>    SYSHDR  arch/powerpc/include/generated/uapi/asm/unistd_64.h
>>    SYSTBL  arch/powerpc/include/generated/asm/syscall_table_32.h
>>    SYSTBL  arch/powerpc/include/generated/asm/syscall_table_64.h
>>    SYSTBL  arch/powerpc/include/generated/asm/syscall_table_spu.h
> 
> Thank you Christophe, is upstream code sufficient to reproduce the issue? Or do
> I need specific patches?
> 

You need random git tree plus the patch "[PATCH] powerpc patches for 
Vincenzo's series" I have just sent to you.

Christophe
Vincenzo Frascino Sept. 6, 2024, 12:51 p.m. UTC | #6
On 06/09/2024 13:49, Christophe Leroy wrote:
> 
> 
> Le 06/09/2024 à 14:40, Vincenzo Frascino a écrit :
>>
>>
>> On 06/09/2024 13:04, Christophe Leroy wrote:
>>>
>>>
>>> Le 06/09/2024 à 13:52, Vincenzo Frascino a écrit :
>>>>
>>>>
>>>> On 04/09/2024 18:26, Christophe Leroy wrote:
>>>>>
>>>>>
>>>>> Le 03/09/2024 à 17:14, Vincenzo Frascino a écrit :
>>>> ...
>>>>
>>
>> ...
>>
>>>
>>> More details:
>>>
>>> $ make ARCH=powerpc CROSS_COMPILE=ppc-linux- mpc885_ads_defconfig
>>>
>>> $ LANG= make ARCH=powerpc CROSS_COMPILE=ppc-linux- vmlinux
>>>    SYNC    include/config/auto.conf
>>>    SYSHDR  arch/powerpc/include/generated/uapi/asm/unistd_32.h
>>>    SYSHDR  arch/powerpc/include/generated/uapi/asm/unistd_64.h
>>>    SYSTBL  arch/powerpc/include/generated/asm/syscall_table_32.h
>>>    SYSTBL  arch/powerpc/include/generated/asm/syscall_table_64.h
>>>    SYSTBL  arch/powerpc/include/generated/asm/syscall_table_spu.h
>>
>> Thank you Christophe, is upstream code sufficient to reproduce the issue? Or do
>> I need specific patches?
>>
> 
> You need random git tree plus the patch "[PATCH] powerpc patches for Vincenzo's
> series" I have just sent to you.
>

Thank you!

> Christophe
diff mbox series

Patch

diff --git a/lib/vdso/getrandom.c b/lib/vdso/getrandom.c
index 938ca539aaa6..9c26b738e4a1 100644
--- a/lib/vdso/getrandom.c
+++ b/lib/vdso/getrandom.c
@@ -3,19 +3,13 @@ 
  * Copyright (C) 2022-2024 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
  */
 
-#include <linux/array_size.h>
-#include <linux/minmax.h>
 #include <vdso/datapage.h>
 #include <vdso/getrandom.h>
 #include <vdso/unaligned.h>
-#include <asm/vdso/getrandom.h>
-#include <uapi/linux/mman.h>
-#include <uapi/linux/random.h>
-
-#undef PAGE_SIZE
-#undef PAGE_MASK
-#define PAGE_SIZE (1UL << CONFIG_PAGE_SHIFT)
-#define PAGE_MASK (~(PAGE_SIZE - 1))
+#include <vdso/mman.h>
+#include <vdso/page.h>
+#include <vdso/array_size.h>
+#include <vdso/minmax.h>
 
 #define MEMCPY_AND_ZERO_SRC(type, dst, src, len) do {				\
 	while (len >= sizeof(type)) {						\
@@ -68,7 +62,7 @@  static __always_inline ssize_t
 __cvdso_getrandom_data(const struct vdso_rng_data *rng_info, void *buffer, size_t len,
 		       unsigned int flags, void *opaque_state, size_t opaque_len)
 {
-	ssize_t ret = min_t(size_t, INT_MAX & PAGE_MASK /* = MAX_RW_COUNT */, len);
+	ssize_t ret = min_t(size_t, INT_MAX & VDSO_PAGE_MASK /* = MAX_RW_COUNT */, len);
 	struct vgetrandom_state *state = opaque_state;
 	size_t batch_len, nblocks, orig_len = len;
 	bool in_use, have_retried = false;
@@ -79,15 +73,15 @@  __cvdso_getrandom_data(const struct vdso_rng_data *rng_info, void *buffer, size_
 	if (unlikely(opaque_len == ~0UL && !buffer && !len && !flags)) {
 		struct vgetrandom_opaque_params *params = opaque_state;
 		params->size_of_opaque_state = sizeof(*state);
-		params->mmap_prot = PROT_READ | PROT_WRITE;
-		params->mmap_flags = MAP_DROPPABLE | MAP_ANONYMOUS;
+		params->mmap_prot = VDSO_MMAP_PROT;
+		params->mmap_flags = VDSO_MMAP_FLAGS;
 		for (size_t i = 0; i < ARRAY_SIZE(params->reserved); ++i)
 			params->reserved[i] = 0;
 		return 0;
 	}
 
 	/* The state must not straddle a page, since pages can be zeroed at any time. */
-	if (unlikely(((unsigned long)opaque_state & ~PAGE_MASK) + sizeof(*state) > PAGE_SIZE))
+	if (unlikely(((unsigned long)opaque_state & ~VDSO_PAGE_MASK) + sizeof(*state) > VDSO_PAGE_SIZE))
 		return -EFAULT;
 
 	/* Handle unexpected flags by falling back to the kernel. */