Re: [PATCH] x86_32: add support for 64 bit __get_user() v2

From: kbuild test robot
Date: Wed Mar 09 2016 - 14:43:10 EST


Hi Benjamin,

[auto build test WARNING on tip/x86/core]
[also build test WARNING on v4.5-rc7 next-20160309]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url: https://github.com/0day-ci/linux/commits/Benjamin-LaHaise/x86_32-add-support-for-64-bit-__get_user-v2/20160310-033507
config: i386-tinyconfig (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=i386

All warnings (new ones prefixed by >>):

In file included from arch/x86/include/asm/sections.h:5:0,
from arch/x86/include/asm/hw_irq.h:26,
from include/linux/irq.h:418,
from arch/x86/include/asm/hardirq.h:5,
from include/linux/hardirq.h:8,
from include/linux/memcontrol.h:24,
from include/linux/tracehook.h:53,
from arch/x86/kernel/ptrace.c:14:
arch/x86/kernel/ptrace.c: In function 'genregs_set':
>> arch/x86/kernel/ptrace.c:530:28: warning: operation on 'u' may be undefined [-Wsequence-point]
ret = __get_user(word, u++);
^
arch/x86/include/asm/uaccess.h:451:51: note: in definition of macro '__m'
#define __m(x) (*(struct __large_struct __user *)(x))
^
>> arch/x86/include/asm/uaccess.h:378:3: note: in expansion of macro '__get_user_asm_u64'
__get_user_asm_u64(x, ptr, retval, errret); \
^
>> arch/x86/include/asm/uaccess.h:443:2: note: in expansion of macro '__get_user_size'
__get_user_size(__gu_val, (ptr), (size), __gu_err, -EFAULT); \
^
>> arch/x86/include/asm/uaccess.h:512:2: note: in expansion of macro '__get_user_nocheck'
__get_user_nocheck((x), (ptr), sizeof(*(ptr)))
^
>> arch/x86/kernel/ptrace.c:530:10: note: in expansion of macro '__get_user'
ret = __get_user(word, u++);
^
--
In file included from lib/bitmap.c:17:0:
lib/bitmap.c: In function '__bitmap_parse':
>> lib/bitmap.c:377:27: warning: operation on 'ubuf' may be undefined [-Wsequence-point]
if (__get_user(c, ubuf++))
^
arch/x86/include/asm/uaccess.h:451:51: note: in definition of macro '__m'
#define __m(x) (*(struct __large_struct __user *)(x))
^
>> arch/x86/include/asm/uaccess.h:378:3: note: in expansion of macro '__get_user_asm_u64'
__get_user_asm_u64(x, ptr, retval, errret); \
^
>> arch/x86/include/asm/uaccess.h:443:2: note: in expansion of macro '__get_user_size'
__get_user_size(__gu_val, (ptr), (size), __gu_err, -EFAULT); \
^
>> arch/x86/include/asm/uaccess.h:512:2: note: in expansion of macro '__get_user_nocheck'
__get_user_nocheck((x), (ptr), sizeof(*(ptr)))
^
>> lib/bitmap.c:377:9: note: in expansion of macro '__get_user'
if (__get_user(c, ubuf++))
^
lib/bitmap.c: In function '__bitmap_parselist':
lib/bitmap.c:525:27: warning: operation on 'ubuf' may be undefined [-Wsequence-point]
if (__get_user(c, ubuf++))
^
arch/x86/include/asm/uaccess.h:451:51: note: in definition of macro '__m'
#define __m(x) (*(struct __large_struct __user *)(x))
^
>> arch/x86/include/asm/uaccess.h:378:3: note: in expansion of macro '__get_user_asm_u64'
__get_user_asm_u64(x, ptr, retval, errret); \
^
>> arch/x86/include/asm/uaccess.h:443:2: note: in expansion of macro '__get_user_size'
__get_user_size(__gu_val, (ptr), (size), __gu_err, -EFAULT); \
^
>> arch/x86/include/asm/uaccess.h:512:2: note: in expansion of macro '__get_user_nocheck'
__get_user_nocheck((x), (ptr), sizeof(*(ptr)))
^
lib/bitmap.c:525:9: note: in expansion of macro '__get_user'
if (__get_user(c, ubuf++))
^

vim +/__get_user_asm_u64 +378 arch/x86/include/asm/uaccess.h

3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 372 __get_user_asm(x, ptr, retval, "w", "w", "=r", errret); \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 373 break; \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 374 case 4: \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 375 __get_user_asm(x, ptr, retval, "l", "k", "=r", errret); \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 376 break; \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 377 case 8: \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 @378 __get_user_asm_u64(x, ptr, retval, errret); \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 379 break; \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 380 default: \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 381 (x) = __get_user_bad(); \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 382 } \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 383 } while (0)
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 384
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 385 #define __get_user_asm(x, addr, err, itype, rtype, ltype, errret) \
11f1a4b9 arch/x86/include/asm/uaccess.h Linus Torvalds 2015-12-17 386 asm volatile("\n" \
63bcff2a arch/x86/include/asm/uaccess.h H. Peter Anvin 2012-09-21 387 "1: mov"itype" %2,%"rtype"1\n" \
11f1a4b9 arch/x86/include/asm/uaccess.h Linus Torvalds 2015-12-17 388 "2:\n" \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 389 ".section .fixup,\"ax\"\n" \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 390 "3: mov %3,%0\n" \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 391 " xor"itype" %"rtype"1,%"rtype"1\n" \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 392 " jmp 2b\n" \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 393 ".previous\n" \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 394 _ASM_EXTABLE(1b, 3b) \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 395 : "=r" (err), ltype(x) \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 396 : "m" (__m(addr)), "i" (errret), "0" (err))
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 397
11f1a4b9 arch/x86/include/asm/uaccess.h Linus Torvalds 2015-12-17 398 /*
11f1a4b9 arch/x86/include/asm/uaccess.h Linus Torvalds 2015-12-17 399 * This doesn't do __uaccess_begin/end - the exception handling
11f1a4b9 arch/x86/include/asm/uaccess.h Linus Torvalds 2015-12-17 400 * around it must do that.
11f1a4b9 arch/x86/include/asm/uaccess.h Linus Torvalds 2015-12-17 401 */
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 402 #define __get_user_size_ex(x, ptr, size) \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 403 do { \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 404 __chk_user_ptr(ptr); \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 405 switch (size) { \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 406 case 1: \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 407 __get_user_asm_ex(x, ptr, "b", "b", "=q"); \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 408 break; \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 409 case 2: \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 410 __get_user_asm_ex(x, ptr, "w", "w", "=r"); \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 411 break; \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 412 case 4: \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 413 __get_user_asm_ex(x, ptr, "l", "k", "=r"); \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 414 break; \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 415 case 8: \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 416 __get_user_asm_ex_u64(x, ptr); \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 417 break; \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 418 default: \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 419 (x) = __get_user_bad(); \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 420 } \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 421 } while (0)
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 422
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 423 #define __get_user_asm_ex(x, addr, itype, rtype, ltype) \
5e88353d arch/x86/include/asm/uaccess.h H. Peter Anvin 2012-09-21 424 asm volatile("1: mov"itype" %1,%"rtype"0\n" \
5e88353d arch/x86/include/asm/uaccess.h H. Peter Anvin 2012-09-21 425 "2:\n" \
535c0c34 arch/x86/include/asm/uaccess.h H. Peter Anvin 2012-04-20 426 _ASM_EXTABLE_EX(1b, 2b) \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 427 : ltype(x) : "m" (__m(addr)))
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 428
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 429 #define __put_user_nocheck(x, ptr, size) \
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 430 ({ \
16855f87 arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2008-12-08 431 int __pu_err; \
11f1a4b9 arch/x86/include/asm/uaccess.h Linus Torvalds 2015-12-17 432 __uaccess_begin(); \
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 433 __put_user_size((x), (ptr), (size), __pu_err, -EFAULT); \
11f1a4b9 arch/x86/include/asm/uaccess.h Linus Torvalds 2015-12-17 434 __uaccess_end(); \
a76cf66e arch/x86/include/asm/uaccess.h Andy Lutomirski 2015-10-05 435 __builtin_expect(__pu_err, 0); \
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 436 })
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 437
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 438 #define __get_user_nocheck(x, ptr, size) \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 439 ({ \
16855f87 arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2008-12-08 440 int __gu_err; \
7dd119d0 arch/x86/include/asm/uaccess.h Benjamin LaHaise 2016-03-09 441 __inttype(*(ptr)) __gu_val; \
11f1a4b9 arch/x86/include/asm/uaccess.h Linus Torvalds 2015-12-17 442 __uaccess_begin(); \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 @443 __get_user_size(__gu_val, (ptr), (size), __gu_err, -EFAULT); \
11f1a4b9 arch/x86/include/asm/uaccess.h Linus Torvalds 2015-12-17 444 __uaccess_end(); \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 445 (x) = (__force __typeof__(*(ptr)))__gu_val; \
a76cf66e arch/x86/include/asm/uaccess.h Andy Lutomirski 2015-10-05 446 __builtin_expect(__gu_err, 0); \
3f168221 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 447 })
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 448
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 449 /* FIXME: this hack is definitely wrong -AK */
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 450 struct __large_struct { unsigned long buf[100]; };
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 @451 #define __m(x) (*(struct __large_struct __user *)(x))
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 452
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 453 /*
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 454 * Tell gcc we read from memory instead of writing: this is because
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 455 * we do not write to any memory gcc knows about, so there are no
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 456 * aliasing issues.
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 457 */
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 458 #define __put_user_asm(x, addr, err, itype, rtype, ltype, errret) \
11f1a4b9 arch/x86/include/asm/uaccess.h Linus Torvalds 2015-12-17 459 asm volatile("\n" \
63bcff2a arch/x86/include/asm/uaccess.h H. Peter Anvin 2012-09-21 460 "1: mov"itype" %"rtype"1,%2\n" \
11f1a4b9 arch/x86/include/asm/uaccess.h Linus Torvalds 2015-12-17 461 "2:\n" \
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 462 ".section .fixup,\"ax\"\n" \
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 463 "3: mov %3,%0\n" \
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 464 " jmp 2b\n" \
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 465 ".previous\n" \
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 466 _ASM_EXTABLE(1b, 3b) \
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 467 : "=r"(err) \
dc70ddf4 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 468 : ltype(x), "m" (__m(addr)), "i" (errret), "0" (err))
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 469
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 470 #define __put_user_asm_ex(x, addr, itype, rtype, ltype) \
5e88353d arch/x86/include/asm/uaccess.h H. Peter Anvin 2012-09-21 471 asm volatile("1: mov"itype" %"rtype"0,%1\n" \
5e88353d arch/x86/include/asm/uaccess.h H. Peter Anvin 2012-09-21 472 "2:\n" \
535c0c34 arch/x86/include/asm/uaccess.h H. Peter Anvin 2012-04-20 473 _ASM_EXTABLE_EX(1b, 2b) \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 474 : : ltype(x), "m" (__m(addr)))
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 475
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 476 /*
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 477 * uaccess_try and catch
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 478 */
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 479 #define uaccess_try do { \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 480 current_thread_info()->uaccess_err = 0; \
11f1a4b9 arch/x86/include/asm/uaccess.h Linus Torvalds 2015-12-17 481 __uaccess_begin(); \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 482 barrier();
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 483
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 484 #define uaccess_catch(err) \
11f1a4b9 arch/x86/include/asm/uaccess.h Linus Torvalds 2015-12-17 485 __uaccess_end(); \
4fc34901 arch/x86/include/asm/uaccess.h Andy Lutomirski 2011-11-07 486 (err) |= (current_thread_info()->uaccess_err ? -EFAULT : 0); \
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 487 } while (0)
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 488
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 489 /**
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 490 * __get_user: - Get a simple variable from user space, with less checking.
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 491 * @x: Variable to store result.
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 492 * @ptr: Source address, in user space.
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 493 *
b3c395ef arch/x86/include/asm/uaccess.h David Hildenbrand 2015-05-11 494 * Context: User context only. This function may sleep if pagefaults are
b3c395ef arch/x86/include/asm/uaccess.h David Hildenbrand 2015-05-11 495 * enabled.
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 496 *
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 497 * This macro copies a single simple variable from user space to kernel
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 498 * space. It supports simple types like char and int, but not larger
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 499 * data types like structures or arrays.
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 500 *
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 501 * @ptr must have pointer-to-simple-variable type, and the result of
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 502 * dereferencing @ptr must be assignable to @x without a cast.
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 503 *
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 504 * Caller must check the pointer with access_ok() before calling this
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 505 * function.
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 506 *
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 507 * Returns zero on success, or -EFAULT on error.
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 508 * On error, the variable @x is set to zero.
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 509 */
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 510
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 511 #define __get_user(x, ptr) \
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 @512 __get_user_nocheck((x), (ptr), sizeof(*(ptr)))
fe40c0af arch/x86/include/asm/uaccess.h Hiroshi Shimamoto 2009-01-23 513
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 514 /**
8cb834e9 include/asm-x86/uaccess.h Glauber Costa 2008-06-25 515 * __put_user: - Write a simple value into user space, with less checking.

:::::: The code at line 378 was first introduced by commit
:::::: 3f168221167ca7a844fde3bf58e1c7ca0bf9741e x86: merge __get_user_asm and its users.

:::::: TO: Glauber Costa <gcosta@xxxxxxxxxx>
:::::: CC: Ingo Molnar <mingo@xxxxxxx>

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation

Attachment: .config.gz
Description: Binary data