From: Andrew Morton include/linux/pagemap.h: In function 'fault_in_pages_readable': include/linux/pagemap.h:244: error: read-only variable '__gu_val' used as 'asm' output include/linux/pagemap.h:244: error: read-only variable '__gu_val' used as 'asm' output include/linux/pagemap.h:244: error: read-only variable '__gu_val' used as 'asm' output include/linux/pagemap.h:244: warning: passing argument 1 of '__constant_copy_from_user' discards qualifiers from pointer target type The problem is the typeof(). It maintains the constness, so we end up using a const variable as an asm output and gcc-4.1.0 barfs. Fix that up by creating separate temporaries. Might cause an increase in stack usage, depending upon how dumb the compiler is being. (gcc-4.1.0 fails later: {standard input}:804: Error: operands mismatch -- statement `bfset -(%a0){%d0,#1}' ignored distcc[13414] ERROR: compile kernel/signal.c on g5/128 failed ) Cc: Roman Zippel Cc: Geert Uytterhoeven Signed-off-by: Andrew Morton --- include/asm-m68k/uaccess.h | 59 ++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 25 deletions(-) diff -puN include/asm-m68k/uaccess.h~m68k-get_user-build-fix include/asm-m68k/uaccess.h --- devel/include/asm-m68k/uaccess.h~m68k-get_user-build-fix 2006-06-03 12:28:20.000000000 -0700 +++ devel-akpm/include/asm-m68k/uaccess.h 2006-06-03 12:33:40.000000000 -0700 @@ -88,31 +88,40 @@ __asm__ __volatile__ \ : "=d"(err) \ : "m"(*(ptr)), "r"(x), "i"(-EFAULT), "0"(0)) -#define get_user(x, ptr) \ -({ \ - int __gu_err; \ - typeof(*(ptr)) __gu_val; \ - __chk_user_ptr(ptr); \ - switch (sizeof(*(ptr))) { \ - case 1: \ - __get_user_asm(__gu_err, __gu_val, ptr, b, "=d"); \ - break; \ - case 2: \ - __get_user_asm(__gu_err, __gu_val, ptr, w, "=r"); \ - break; \ - case 4: \ - __get_user_asm(__gu_err, __gu_val, ptr, l, "=r"); \ - break; \ - case 8: \ - __gu_err = __constant_copy_from_user(&__gu_val, ptr, 8); \ - break; \ - default: \ - __gu_val = (typeof(*(ptr)))0; \ - __gu_err = __get_user_bad(); \ - break; \ - } \ - (x) = __gu_val; \ - __gu_err; \ +#define get_user(x, ptr) \ +({ \ + int __gu_err; \ + __chk_user_ptr(ptr); \ + switch (sizeof(*(ptr))) { \ + case 1: { \ + u8 v; \ + __get_user_asm(__gu_err, v, ptr, b, "=d"); \ + (x) = v; \ + } \ + break; \ + case 2: { \ + u16 v; \ + __get_user_asm(__gu_err, v, ptr, w, "=r"); \ + (x) = v; \ + } \ + break; \ + case 4: { \ + u32 v; \ + __get_user_asm(__gu_err, v, ptr, l, "=r"); \ + (x) = v; \ + } \ + break; \ + case 8: { \ + u64 v; \ + __gu_err = __constant_copy_from_user(&v, ptr, 8); \ + (x) = v; \ + } \ + break; \ + default: \ + __gu_err = __get_user_bad(); \ + break; \ + } \ + __gu_err; \ }) #define __get_user(x, ptr) get_user(x, ptr) _