Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+39 −34
Original line number Diff line number Diff line
@@ -131,40 +131,45 @@ struct __large_struct { unsigned long buf[100]; };

#define __get_user_nocheck(x, ptr, size)				\
({									\
	__typeof(*(ptr)) __gu_val;		\
	unsigned long __gu_addr;					\
	int __gu_err;							\
	__gu_addr = (unsigned long) (ptr);				\
	switch (size) {							\
	case 1:  __get_user_asm("bu"); break;	\
	case 2:  __get_user_asm("hu"); break;	\
	case 4:  __get_user_asm(""  ); break;	\
	default: __get_user_unknown(); break;	\
	case 1: {							\
		unsigned char __gu_val;					\
		__get_user_asm("bu");					\
		(x) = *(__force __typeof__(*(ptr))*) &__gu_val;		\
		break;							\
	}								\
	case 2: {							\
		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;							\
	}								\
	x = (__typeof__(*(ptr))) __gu_val;	\
	__gu_err;							\
})

#define __get_user_check(x, ptr, size)					\
({									\
	__typeof__(*(ptr)) __gu_val;			\
	unsigned long __gu_addr;			\
	int __gu_err;					\
	__gu_addr = (unsigned long) (ptr);		\
	if (likely(__access_ok(__gu_addr,size))) {	\
		switch (size) {				\
		case 1:  __get_user_asm("bu"); break;	\
		case 2:  __get_user_asm("hu"); break;	\
		case 4:  __get_user_asm(""  ); break;	\
		default: __get_user_unknown(); break;	\
		}					\
	}						\
	int _e;								\
	if (likely(__access_ok((unsigned long) (ptr), (size))))		\
		_e = __get_user_nocheck((x), (ptr), (size));		\
	else {								\
		__gu_err = -EFAULT;			\
		__gu_val = 0;				\
		_e = -EFAULT;						\
		(x) = (__typeof__(x))0;					\
	}								\
	x = (__typeof__(*(ptr))) __gu_val;		\
	__gu_err;					\
	_e;								\
})

#define __get_user_asm(INSN)					\
+3 −3
Original line number Diff line number Diff line
@@ -20,9 +20,9 @@ extern unsigned long mn10300_ioclk; /* IOCLK (crystal speed) in HZ */
extern unsigned long mn10300_iobclk;
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. */
/* #define MN10300_IOBCLK	((unsigned long)mn10300_iobclk) */
/* #define MN10300_IOBCLK	mn10300_iobclk */

#else /* !CONFIG_MN10300_RTC */

@@ -35,7 +35,7 @@ extern unsigned long mn10300_tsc_per_HZ;
#define MN10300_TSCCLK		MN10300_IOCLK

#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 */
#define MN10300_TSC_PER_HZ	(MN10300_TSCCLK/HZ)
#endif /* !CONFIG_MN10300_RTC */
+3 −3
Original line number Diff line number Diff line
@@ -20,9 +20,9 @@ extern unsigned long mn10300_ioclk; /* IOCLK (crystal speed) in HZ */
extern unsigned long mn10300_iobclk;
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. */
/* #define MN10300_IOBCLK	((unsigned long)mn10300_iobclk) */
/* #define MN10300_IOBCLK	mn10300_iobclk */

#else /* !CONFIG_MN10300_RTC */

@@ -35,7 +35,7 @@ extern unsigned long mn10300_tsc_per_HZ;
#define MN10300_TSCCLK		MN10300_IOCLK

#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 */
#define MN10300_TSC_PER_HZ	(MN10300_TSCCLK/HZ)
#endif /* !CONFIG_MN10300_RTC */