Commit d22a001b authored by Mark Salter's avatar Mark Salter Committed by Linus Torvalds

mn10300: fix kernel build failures when using gcc-4.x

Fix some build failures when using gcc-4.x for MN10300.

Firstly, __get_user() fails to build because the pointer points to a const and
__gu_val ends up being read-only:

In file included from include/linux/mempolicy.h:62,
                 from init/main.c:50:
include/linux/pagemap.h: In function 'fault_in_pages_readable':
include/linux/pagemap.h:394: error: read-only variable '__gu_val' used as 'asm' output
include/linux/pagemap.h:394: error: read-only variable '__gu_val' used as 'asm' output
include/linux/pagemap.h:394: error: read-only variable '__gu_val' used as 'asm' output
include/linux/pagemap.h:400: error: read-only variable '__gu_val' used as 'asm' output
include/linux/pagemap.h:400: error: read-only variable '__gu_val' used as 'asm' output
include/linux/pagemap.h:400: error: read-only variable '__gu_val' used as 'asm' output
make[1]: *** [init/main.o] Error 1

Secondly, gcc-4 doesn't allow casts of lvalues:

  UPD     include/linux/compile.h
arch/mn10300/kernel/rtc.c: In function 'calibrate_clock':
arch/mn10300/kernel/rtc.c:170: error: lvalue required as left operand of assignment
arch/mn10300/kernel/rtc.c:172: error: lvalue required as left operand of assignment
make[1]: *** [arch/mn10300/kernel/rtc.o] Error 1

These are seen with gcc 4.2.1.
Signed-off-by: default avatarMark Salter <msalter@redhat.com>
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 933d35f0
...@@ -129,42 +129,47 @@ extern int fixup_exception(struct pt_regs *regs); ...@@ -129,42 +129,47 @@ extern int fixup_exception(struct pt_regs *regs);
struct __large_struct { unsigned long buf[100]; }; struct __large_struct { unsigned long buf[100]; };
#define __m(x) (*(struct __large_struct *)(x)) #define __m(x) (*(struct __large_struct *)(x))
#define __get_user_nocheck(x, ptr, size) \ #define __get_user_nocheck(x, ptr, size) \
({ \ ({ \
__typeof(*(ptr)) __gu_val; \ unsigned long __gu_addr; \
unsigned long __gu_addr; \ int __gu_err; \
int __gu_err; \ __gu_addr = (unsigned long) (ptr); \
__gu_addr = (unsigned long) (ptr); \ switch (size) { \
switch (size) { \ case 1: { \
case 1: __get_user_asm("bu"); break; \ unsigned char __gu_val; \
case 2: __get_user_asm("hu"); break; \ __get_user_asm("bu"); \
case 4: __get_user_asm("" ); break; \ (x) = *(__force __typeof__(*(ptr))*) &__gu_val; \
default: __get_user_unknown(); break; \ break; \
} \ } \
x = (__typeof__(*(ptr))) __gu_val; \ case 2: { \
__gu_err; \ unsigned short __gu_val; \
__get_user_asm("hu"); \
(x) = *(__force __typeof__(*(ptr))*) &__gu_val; \
break; \
} \
case 4: { \
unsigned int __gu_val; \
__get_user_asm(""); \
(x) = *(__force __typeof__(*(ptr))*) &__gu_val; \
break; \
} \
default: \
__get_user_unknown(); \
break; \
} \
__gu_err; \
}) })
#define __get_user_check(x, ptr, size) \ #define __get_user_check(x, ptr, size) \
({ \ ({ \
__typeof__(*(ptr)) __gu_val; \ int _e; \
unsigned long __gu_addr; \ if (likely(__access_ok((unsigned long) (ptr), (size)))) \
int __gu_err; \ _e = __get_user_nocheck((x), (ptr), (size)); \
__gu_addr = (unsigned long) (ptr); \ else { \
if (likely(__access_ok(__gu_addr,size))) { \ _e = -EFAULT; \
switch (size) { \ (x) = (__typeof__(x))0; \
case 1: __get_user_asm("bu"); break; \ } \
case 2: __get_user_asm("hu"); break; \ _e; \
case 4: __get_user_asm("" ); break; \
default: __get_user_unknown(); break; \
} \
} \
else { \
__gu_err = -EFAULT; \
__gu_val = 0; \
} \
x = (__typeof__(*(ptr))) __gu_val; \
__gu_err; \
}) })
#define __get_user_asm(INSN) \ #define __get_user_asm(INSN) \
......
...@@ -20,9 +20,9 @@ extern unsigned long mn10300_ioclk; /* IOCLK (crystal speed) in HZ */ ...@@ -20,9 +20,9 @@ extern unsigned long mn10300_ioclk; /* IOCLK (crystal speed) in HZ */
extern unsigned long mn10300_iobclk; extern unsigned long mn10300_iobclk;
extern unsigned long mn10300_tsc_per_HZ; extern unsigned long mn10300_tsc_per_HZ;
#define MN10300_IOCLK ((unsigned long)mn10300_ioclk) #define MN10300_IOCLK mn10300_ioclk
/* If this processors has a another clock, uncomment the below. */ /* If this processors has a another clock, uncomment the below. */
/* #define MN10300_IOBCLK ((unsigned long)mn10300_iobclk) */ /* #define MN10300_IOBCLK mn10300_iobclk */
#else /* !CONFIG_MN10300_RTC */ #else /* !CONFIG_MN10300_RTC */
...@@ -35,7 +35,7 @@ extern unsigned long mn10300_tsc_per_HZ; ...@@ -35,7 +35,7 @@ extern unsigned long mn10300_tsc_per_HZ;
#define MN10300_TSCCLK MN10300_IOCLK #define MN10300_TSCCLK MN10300_IOCLK
#ifdef CONFIG_MN10300_RTC #ifdef CONFIG_MN10300_RTC
#define MN10300_TSC_PER_HZ ((unsigned long)mn10300_tsc_per_HZ) #define MN10300_TSC_PER_HZ mn10300_tsc_per_HZ
#else /* !CONFIG_MN10300_RTC */ #else /* !CONFIG_MN10300_RTC */
#define MN10300_TSC_PER_HZ (MN10300_TSCCLK/HZ) #define MN10300_TSC_PER_HZ (MN10300_TSCCLK/HZ)
#endif /* !CONFIG_MN10300_RTC */ #endif /* !CONFIG_MN10300_RTC */
......
...@@ -20,9 +20,9 @@ extern unsigned long mn10300_ioclk; /* IOCLK (crystal speed) in HZ */ ...@@ -20,9 +20,9 @@ extern unsigned long mn10300_ioclk; /* IOCLK (crystal speed) in HZ */
extern unsigned long mn10300_iobclk; extern unsigned long mn10300_iobclk;
extern unsigned long mn10300_tsc_per_HZ; extern unsigned long mn10300_tsc_per_HZ;
#define MN10300_IOCLK ((unsigned long)mn10300_ioclk) #define MN10300_IOCLK mn10300_ioclk
/* If this processors has a another clock, uncomment the below. */ /* If this processors has a another clock, uncomment the below. */
/* #define MN10300_IOBCLK ((unsigned long)mn10300_iobclk) */ /* #define MN10300_IOBCLK mn10300_iobclk */
#else /* !CONFIG_MN10300_RTC */ #else /* !CONFIG_MN10300_RTC */
...@@ -35,7 +35,7 @@ extern unsigned long mn10300_tsc_per_HZ; ...@@ -35,7 +35,7 @@ extern unsigned long mn10300_tsc_per_HZ;
#define MN10300_TSCCLK MN10300_IOCLK #define MN10300_TSCCLK MN10300_IOCLK
#ifdef CONFIG_MN10300_RTC #ifdef CONFIG_MN10300_RTC
#define MN10300_TSC_PER_HZ ((unsigned long)mn10300_tsc_per_HZ) #define MN10300_TSC_PER_HZ mn10300_tsc_per_HZ
#else /* !CONFIG_MN10300_RTC */ #else /* !CONFIG_MN10300_RTC */
#define MN10300_TSC_PER_HZ (MN10300_TSCCLK/HZ) #define MN10300_TSC_PER_HZ (MN10300_TSCCLK/HZ)
#endif /* !CONFIG_MN10300_RTC */ #endif /* !CONFIG_MN10300_RTC */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment