Re: [PATCH] usercopy: Don't test 64-bit get/put_user() on 32-bit powerpc

From: Kees Cook
Date: Tue Feb 21 2017 - 14:23:40 EST


On Sat, Feb 18, 2017 at 1:33 AM, Michael Ellerman <mpe@xxxxxxxxxxxxxx> wrote:
> Add PPC32 to the opt-out list, otherwise it breaks the build.
>
> Signed-off-by: Michael Ellerman <mpe@xxxxxxxxxxxxxx>
> ---
> lib/test_user_copy.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/lib/test_user_copy.c b/lib/test_user_copy.c
> index 4a79f2c1cd6e..6f335a3d4ae2 100644
> --- a/lib/test_user_copy.c
> +++ b/lib/test_user_copy.c
> @@ -37,6 +37,7 @@
> !defined(CONFIG_MICROBLAZE) && \
> !defined(CONFIG_MN10300) && \
> !defined(CONFIG_NIOS2) && \
> + !defined(CONFIG_PPC32) && \
> !defined(CONFIG_SUPERH))
> # define TEST_U64
> #endif

I'm fine to add this, but I'm curious why it fails? ppc uaccess.h has:

#define get_user(x, ptr) \
__get_user_check((x), (ptr), sizeof(*(ptr)))

#define __get_user_check(x, ptr, size) \
({ \
...
__get_user_size(__gu_val, __gu_addr, (size), __gu_err); \

#define __get_user_size(x, ptr, size, retval) \
do { \
...
case 8: __get_user_asm2(x, ptr, retval); break; \

#ifdef __powerpc64__
#define __get_user_asm2(x, addr, err) \
__get_user_asm(x, addr, err, "ld")
#else /* __powerpc64__ */
#define __get_user_asm2(x, addr, err) \
__asm__ __volatile__( \
...

It looks like __get_user_asm2() was explicitly designed for handling
64-bit get_user()?

-Kees

--
Kees Cook
Pixel Security