Skip to contentSkip to conversation

x86-64 build problem with tip

PATCH In review Jeremy Fitzhardinge 5 participants 14 messages May 14, 2008 – May 27, 2008 2 messages not in the archive

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

I'm getting this when I build for x86-64 with

jeremy@cosworth:~/hg/xen/paravirt/linux-x86_64$ gcc -v
Reading specs from /usr/lib/gcc/x86_64-linux/3.4.4/specs
Configured with: ../src/configure -v --enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr --libexecdir=/usr/lib --with-gxx-include-dir=/usr/include/c++/3.4 --enable-shared --with-system-zlib --enable-nls --without-included-gettext --program-suffix=-3.4 --enable-__cxa_atexit --enable-libstdcxx-allocator=mt --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-gc=boehm --enable-java-awt=gtk --disable-werror x86_64-linux
Thread model: posix
gcc version 3.4.4 20050314 (prerelease) (Debian 3.4.3-13)

CC kernel/sched.o
/home/jeremy/hg/xen/paravirt/linux/kernel/sched_trace.h: In function `wait_task_inactive':
/home/jeremy/hg/xen/paravirt/linux/kernel/sched_trace.h:5: warning: asm operand 1 probably doesn't match constraints /home/jeremy/hg/xen/paravirt/linux/kernel/sched_trace.h:5: error: impossible constraint in `asm' /home/jeremy/hg/xen/paravirt/linux/kernel/sched_trace.h:5: warning: 'value' might be used uninitialized in this function /home/jeremy/hg/xen/paravirt/linux/kernel/sched.c: At top level:
/home/jeremy/hg/xen/paravirt/linux/kernel/sched_fair.c:1167: warning: 'wakeup_preempt_entity' defined but not used make[3]: *** [kernel/sched.o] Error 1

Turning CONFIG_MARKER off avoids the problem.

J

#1 lore raw

PATCH 1/1 Fix immediate asm constraint for gcc 3 x86_64

Quoted 15 lines · * Jeremy Fitzhardinge ([email protected]) wrote:

I'm getting this when I build for x86-64 with

jeremy@cosworth:~/hg/xen/paravirt/linux-x86_64$ gcc -v
Reading specs from /usr/lib/gcc/x86_64-linux/3.4.4/specs
Configured with: ../src/configure -v 
--enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr 
--libexecdir=/usr/lib --with-gxx-include-dir=/usr/include/c++/3.4 
--enable-shared --with-system-zlib --enable-nls --without-included-gettext 
--program-suffix=-3.4 --enable-__cxa_atexit --enable-libstdcxx-allocator=mt 
--enable-clocale=gnu --enable-libstdcxx-debug --enable-java-gc=boehm 
--enable-java-awt=gtk --disable-werror x86_64-linux
Thread model: posix
gcc version 3.4.4 20050314 (prerelease) (Debian 3.4.3-13)
Quoted 15 lines

CC kernel/sched.o
/home/jeremy/hg/xen/paravirt/linux/kernel/sched_trace.h: In function `wait_task_inactive':
/home/jeremy/hg/xen/paravirt/linux/kernel/sched_trace.h:5: warning: asm operand 1 probably doesn't match constraints /home/jeremy/hg/xen/paravirt/linux/kernel/sched_trace.h:5: error:
impossible constraint in `asm' /home/jeremy/hg/xen/paravirt/linux/kernel/sched_trace.h:5: warning: 'value' might be used uninitialized in this function /home/jeremy/hg/xen/paravirt/linux/kernel/sched.c: At top level:
/home/jeremy/hg/xen/paravirt/linux/kernel/sched_fair.c:1167: warning:
'wakeup_preempt_entity' defined but not used
make[3]: *** [kernel/sched.o] Error 1

It seems that include/asm-x86/immediate.h in sched-devel.git causes this. gcc-3.4 does not seem to like the "i" (&name##__imv) constraint. I have seen no such problem with gcc-4.1. This is weird. It seems that relaxing the constraint helps fixing this, but it's not clear whether fixing the code or gcc-3.4 is the correct solution... here is the fix :

Fix immediate asm constraint for gcc 3 x86_64

make CC=gcc-3.4 HOSTCC=gcc-3.4 causes this problem with immediate values on x86_64 :

kernel/sched_trace.h: In function `wait_task_inactive':
kernel/sched_trace.h:5: warning: asm operand 1 probably doesn't match constraints kernel/sched_trace.h:5: error: impossible constraint in `asm' kernel/sched_trace.h:5: warning: 'value' might be used uninitialized in this function make[1]: *** [kernel/sched.o] Error 1
make: *** [kernel/] Error 2

gcc-4.1 does not have this problem.

Fix this by changing the "i" (&name##__imv) for a "g" (&name##__imv) constraint.

CC Jeremy Fitzhardinge <[email protected]>
CC Ingo Molnar <[email protected]>
CC "H. Peter Anvin" <[email protected]>
---
 include/asm-x86/immediate.h |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
include/asm-x86/immediate.h +4 -4
Index: linux-2.6-sched-devel/include/asm-x86/immediate.h
===================================================================
@@ -63,7 +63,7 @@
 				"mov $0,%0\n\t"				\
 				"3:\n\t"				\
 				: "=q" (value)				\
-				: "i" (&name##__imv),			\
+				: "g" (&name##__imv),			\
 				  "i" (sizeof(value)));			\
 			break;						\
 		case 2:							\
@@ -81,7 +81,7 @@
 				"mov $0,%0\n\t"				\
 				"3:\n\t"				\
 				: "=r" (value)				\
-				: "i" (&name##__imv),			\
+				: "g" (&name##__imv),			\
 				  "i" (sizeof(value)));			\
 			break;						\
 		case 8:							\
@@ -102,7 +102,7 @@
 				"mov $0xFEFEFEFE01010101,%0\n\t" 	\
 				"3:\n\t"				\
 				: "=r" (value)				\
-				: "i" (&name##__imv),			\
+				: "g" (&name##__imv),			\
 				  "i" (sizeof(value)));			\
 			break;						\
 		};							\
@@ -143,7 +143,7 @@
 			"mov $0,%0\n\t"					\
 			"3:\n\t"					\
 			: "=a" (value)					\
-			: "i" (&name##__imv),				\
+			: "g" (&name##__imv),				\
 			  "i" (sizeof(value)),				\
 			  "i" (sizeof(__typeof__(name##__imv))));	\
 		value;							\
Quoted 3 lines

Turning CONFIG_MARKER off avoids the problem.

J

Signature · 2 lines
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
#2 lore raw

Re: [PATCH] Fix immediate asm constraint for gcc 3 x86_64

Quoted 9 lines · Mathieu Desnoyers

It seems that include/asm-x86/immediate.h in sched-devel.git causes this. gcc-3.4 does not seem to like the "i" (&name##__imv) constraint. I have seen no such problem with gcc-4.1. This is weird. It seems that relaxing the constraint helps fixing this, but it's not clear whether fixing the code or gcc-3.4 is the correct solution... here is the fix :

Fix immediate asm constraint for gcc 3 x86_64

It might make it compile, but it's completely *wrong* for the purpose intended.

It permits gcc to present the address in a register, for example, so there is no guarantee that you end up with an immediate.

-hpa

#3 lore raw

Re: [PATCH] Fix immediate asm constraint for gcc 3 x86_64

Quoted 9 lines · * H. Peter Anvin ([email protected]) wrote:
Quoted 6 lines · Mathieu Desnoyers

It seems that include/asm-x86/immediate.h in sched-devel.git causes this. gcc-3.4 does not seem to like the "i" (&name##__imv) constraint. I have seen no such problem with gcc-4.1. This is weird. It seems that relaxing the constraint helps fixing this, but it's not clear whether fixing the code or gcc-3.4 is the correct solution... here is the fix :
Fix immediate asm constraint for gcc 3 x86_64

Quoted 7 lines

It might make it compile, but it's completely *wrong* for the purpose intended.

It permits gcc to present the address in a register, for example, so there is no guarantee that you end up with an immediate.

-hpa

Hrm, you are right. Let's see a simple toy case which generates the problem :

struct test_struct {
int a;
int b;
int c;
};

static struct test_struct testa;

int main()

{
        asm (
             ".quad %c0\n\t"
                :
                : "i" (&testa.c));
        return 0;
}

gcc 4.1 generates : .quad testa+8

and doesn't complain. However, gcc-3.4 stops with :

compudj@amd64:~/test$ gcc-3.4 -S -o oldgcc.S oldgcc.c
oldgcc.c: In function `main':
oldgcc.c:11: warning: asm operand 0 probably doesn't match constraints
oldgcc.c:11: error: impossible constraint in `asm'

It's understandable given that changing the "i" for a "g" constraint changes the assembly result for :

movl $testa, %eax
addq $8, %rax
#APP
.quad %rax

#NO_APP

Is there any way we could get a symbol assigned to &testa.c to make gcc 3 happy ?

Mathieu

Signature · 2 lines
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
#6 lore raw

PATCH 1/1 Fix Immediate Values x86_64 support old gcc

In reply to a message not in the archive

Does this fix make more sense ?

GCC < 4, on x86_64, does not accept symbol+offset operands for "i" constraints asm statements. Fallback on generic immediate values if this compiler is detected.

---
 arch/x86/Makefile           |    3 +++
 arch/x86/kernel/Makefile    |    4 +++-
 include/asm-x86/immediate.h |    5 +++++
 include/linux/immediate.h   |    4 +++-
 kernel/Makefile             |    4 +++-
 5 files changed, 17 insertions(+), 3 deletions(-)
arch/x86/Makefile +3 -0
Index: linux-2.6-sched-devel/arch/x86/Makefile
===================================================================
@@ -78,6 +78,9 @@
                 "$(CC)" -fstack-protector-all )
 
         KBUILD_CFLAGS += $(stackp-y)
+
+	export GCC_BROKEN_IMMEDIATE
+	GCC_BROKEN_IMMEDIATE := $(shell if [ $(call cc-version) -lt 0400 ] ; then echo "y"; fi)
 endif
 
 # Stackpointer is addressed different for 32 bit and 64 bit x86
include/asm-x86/immediate.h +5 -0
Index: linux-2.6-sched-devel/include/asm-x86/immediate.h
===================================================================
@@ -12,6 +12,10 @@
 
 #include <asm/asm.h>
 
+#if (defined(CONFIG_X86_64) && __GNUC__ < 4)	/* Detect broken x86_64 gcc */
+#undef CONFIG_IMMEDIATE
+#else
+
 struct __imv {
 	unsigned long var;	/* Pointer to the identifier variable of the
 				 * immediate value
@@ -166,4 +170,5 @@
 
 extern int arch_imv_update(struct __imv *imv, int early);
 
+#endif
 #endif /* _ASM_X86_IMMEDIATE_H */
include/linux/immediate.h +3 -1
Index: linux-2.6-sched-devel/include/linux/immediate.h
===================================================================
@@ -11,8 +11,10 @@
  */
 
 #ifdef CONFIG_IMMEDIATE
+#include <asm/immediate.h>	/* May undef CONFIG_IMMEDIATE */
+#endif
 
-#include <asm/immediate.h>
+#ifdef CONFIG_IMMEDIATE
 
 /**
  * imv_set - set immediate variable (with locking)
arch/x86/kernel/Makefile +3 -1
Index: linux-2.6-sched-devel/arch/x86/kernel/Makefile
===================================================================
@@ -75,7 +75,9 @@
 obj-$(CONFIG_KPROBES)		+= kprobes.o
 obj-$(CONFIG_MODULES)		+= module_$(BITS).o
 obj-$(CONFIG_ACPI_SRAT) 	+= srat_32.o
-obj-$(CONFIG_IMMEDIATE)		+= immediate.o
+ifneq ($(GCC_BROKEN_IMMEDIATE),y)
+	obj-$(CONFIG_IMMEDIATE)	+= immediate.o
+endif
 obj-$(CONFIG_EFI) 		+= efi.o efi_$(BITS).o efi_stub_$(BITS).o
 obj-$(CONFIG_DOUBLEFAULT) 	+= doublefault_32.o
 obj-$(CONFIG_KGDB)		+= kgdb.o
kernel/Makefile +3 -1
Index: linux-2.6-sched-devel/kernel/Makefile
===================================================================
@@ -75,7 +75,9 @@
 obj-$(CONFIG_SYSCTL) += utsname_sysctl.o
 obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o
 obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o
-obj-$(CONFIG_IMMEDIATE) += immediate.o
+ifneq ($(GCC_BROKEN_IMMEDIATE),y)
+	obj-$(CONFIG_IMMEDIATE) += immediate.o
+endif
 obj-$(CONFIG_MARKERS) += marker.o
 obj-$(CONFIG_LATENCYTOP) += latencytop.o
 obj-$(CONFIG_FTRACE) += trace/
Signature · 2 lines
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
#7 lore raw

Re: [PATCH] Fix Immediate Values x86_64 support old gcc

Hi Mathieu

Quoted 20 lines

Does this fix make more sense ?

GCC < 4, on x86_64, does not accept symbol+offset operands for "i" constraints asm statements. Fallback on generic immediate values if this compiler is detected.

---
 arch/x86/Makefile           |    3 +++
 arch/x86/kernel/Makefile    |    4 +++-
 include/asm-x86/immediate.h |    5 +++++
 include/linux/immediate.h   |    4 +++-
 kernel/Makefile             |    4 +++-
 5 files changed, 17 insertions(+), 3 deletions(-)

Index: linux-2.6-sched-devel/arch/x86/Makefile
===================================================================

arch/x86/Makefile line 83

Quoted 6 lines
arch/x86/Makefile +3 -0
@@ -78,6 +78,9 @@
                 "$(CC)" -fstack-protector-all )
 
         KBUILD_CFLAGS += $(stackp-y)
+
+	export GCC_BROKEN_IMMEDIATE
+	GCC_BROKEN_IMMEDIATE := $(shell if [ $(call cc-version) -lt 0400 ] ; then echo "y"; fi)

So here we introduce a global environment variable that tells us that gcc has "BROKEN_IMMEDIATE".
I have absolutely no clue what "BROKEN_IMMEDIATE" is so I guess others are in the same boat. Comment please!

Consider something like this (note: no negative logic involved):
export USE_IMMEDIATE := $(call cc-ifversion, -ge, 0400, $(CONFIG_IMMEDIATE))

Then the MAkefile fragment can be simplified as:

arch/x86/Makefile line 84

Quoted 2 lines
arch/x86/Makefile +1 -1
-obj-$(CONFIG_IMMEDIATE)              += immediate.o
+obj-$(USE_IMMEDIATE)                 += immediate.o

(Or find a better name than "USE_IMMEDIATE".

Quoted 8 lines
arch/x86/Makefile +0 -0
 endif
 

# Stackpointer is addressed different for 32 bit and 64 bit x86
Index: linux-2.6-sched-devel/include/asm-x86/immediate.h
===================================================================

include/asm-x86/immediate.h line 17

Quoted 6 lines
include/asm-x86/immediate.h +3 -0
@@ -12,6 +12,10 @@
 
 #include <asm/asm.h>
 
+#if (defined(CONFIG_X86_64) && __GNUC__ < 4)	/* Detect broken x86_64 gcc */
+#undef CONFIG_IMMEDIATE
+#else

And now in the source we use a direct check of the GNUC version. So this is a duplicate of GCC_BROKEN_IMMEDIATE and not sensible comments.
"I ask myself in what way is gcc broken?"
And you DO NOT fiddle with the CONFIG_* variables - this is just plain wrong.

include/linux/immediate.h line 15

Quoted 8 lines
include/linux/immediate.h +2 -0
@@ -11,8 +11,10 @@
  */
 
 #ifdef CONFIG_IMMEDIATE
+#include <asm/immediate.h>	/* May undef CONFIG_IMMEDIATE */
+#endif

So you need to find a better way for this.

Quoted 6 lines
include/linux/immediate.h +1 -1
-#include <asm/immediate.h>
+#ifdef CONFIG_IMMEDIATE
 
 /**
  * imv_set - set immediate variable (with locking)
#8 lore raw

Re: [PATCH] Fix Immediate Values x86_64 support old gcc

Quoted 23 lines · * Sam Ravnborg ([email protected]) wrote:

Hi Mathieu

Quoted 22 lines

Does this fix make more sense ?

GCC < 4, on x86_64, does not accept symbol+offset operands for "i" constraints asm statements. Fallback on generic immediate values if this compiler is detected.

---
 arch/x86/Makefile           |    3 +++
 arch/x86/kernel/Makefile    |    4 +++-
 include/asm-x86/immediate.h |    5 +++++
 include/linux/immediate.h   |    4 +++-
 kernel/Makefile             |    4 +++-
 5 files changed, 17 insertions(+), 3 deletions(-)

Index: linux-2.6-sched-devel/arch/x86/Makefile
===================================================================

arch/x86/Makefile +0 -0
@@ -78,6 +78,9 @@
                 "$(CC)" -fstack-protector-all )
 
Quoted 10 lines

arch/x86/Makefile line 83

Quoted 4 lines
arch/x86/Makefile +3 -0
         KBUILD_CFLAGS += $(stackp-y)
+
+	export GCC_BROKEN_IMMEDIATE
+	GCC_BROKEN_IMMEDIATE := $(shell if [ $(call cc-version) -lt 0400 ] ; then echo "y"; fi)

So here we introduce a global environment variable that tells us that gcc has "BROKEN_IMMEDIATE".
I have absolutely no clue what "BROKEN_IMMEDIATE" is so I guess others are in the same boat. Comment please!

Yes, I guess this worth being commented, you are right. I'll write something along the lines written in the patch header.

Quoted 3 lines

Consider something like this (note: no negative logic involved):
export USE_IMMEDIATE := $(call cc-ifversion, -ge, 0400, $(CONFIG_IMMEDIATE))

Hrm, if I do that, I would have to add USE_IMMEDIATE to each architecture's makefiles for which immediate values are supported, e.g.:

export USE_IMMEDIATE := $(CONFIG_IMMEDIATE)

The "BROKEN_IMMEDIATE" (negative) approach only needs to be defined on x86_64 where gcc 3.x does not support symbol+offset correctly.

Quoted 18 lines

Then the MAkefile fragment can be simplified as:

arch/x86/Makefile line 84

Quoted 2 lines
arch/x86/Makefile +1 -1
-obj-$(CONFIG_IMMEDIATE)              += immediate.o
+obj-$(USE_IMMEDIATE)                 += immediate.o

(Or find a better name than "USE_IMMEDIATE".

Quoted 11 lines
arch/x86/Makefile +0 -0
 endif
 

# Stackpointer is addressed different for 32 bit and 64 bit x86
Index: linux-2.6-sched-devel/include/asm-x86/immediate.h
===================================================================

include/asm-x86/immediate.h +0 -0
@@ -12,6 +12,10 @@
 
 #include <asm/asm.h>
 
Quoted 9 lines

include/asm-x86/immediate.h line 17

Quoted 3 lines
include/asm-x86/immediate.h +3 -0
+#if (defined(CONFIG_X86_64) && __GNUC__ < 4)	/* Detect broken x86_64 gcc */
+#undef CONFIG_IMMEDIATE
+#else

And now in the source we use a direct check of the GNUC version. So this is a duplicate of GCC_BROKEN_IMMEDIATE and not sensible comments.
"I ask myself in what way is gcc broken?"
And you DO NOT fiddle with the CONFIG_* variables - this is just plain wrong.

I could pass the USE_IMMEDIATE as a -D to the compiler flags. That would be cleaner.

Quoted 11 lines

include/linux/immediate.h line 15

Quoted 8 lines
include/linux/immediate.h +2 -0
@@ -11,8 +11,10 @@
  */
 
 #ifdef CONFIG_IMMEDIATE
+#include <asm/immediate.h>	/* May undef CONFIG_IMMEDIATE */
+#endif

So you need to find a better way for this.

I think USE_IMMEDIATE is the way to go then.

Thanks,

Mathieu

Quoted 8 lines
Quoted 7 lines
include/linux/immediate.h +1 -1
-#include <asm/immediate.h>
+#ifdef CONFIG_IMMEDIATE
 
 /**
  * imv_set - set immediate variable (with locking)
Signature · 2 lines
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
#9 lore raw

Re: [PATCH] Fix Immediate Values x86_64 support old gcc

Quoted 42 lines · Mathieu Desnoyers
Quoted 23 lines · * Sam Ravnborg ([email protected]) wrote:

Hi Mathieu

Quoted 22 lines

Does this fix make more sense ?

GCC < 4, on x86_64, does not accept symbol+offset operands for "i" constraints asm statements. Fallback on generic immediate values if this compiler is detected.

---
 arch/x86/Makefile           |    3 +++
 arch/x86/kernel/Makefile    |    4 +++-
 include/asm-x86/immediate.h |    5 +++++
 include/linux/immediate.h   |    4 +++-
 kernel/Makefile             |    4 +++-
 5 files changed, 17 insertions(+), 3 deletions(-)

Index: linux-2.6-sched-devel/arch/x86/Makefile
===================================================================

arch/x86/Makefile +0 -0
@@ -78,6 +78,9 @@
                 "$(CC)" -fstack-protector-all )
 
Quoted 10 lines

arch/x86/Makefile line 83

Quoted 4 lines
arch/x86/Makefile +3 -0
         KBUILD_CFLAGS += $(stackp-y)
+
+	export GCC_BROKEN_IMMEDIATE
+	GCC_BROKEN_IMMEDIATE := $(shell if [ $(call cc-version) -lt 0400 ] ; then echo "y"; fi)

So here we introduce a global environment variable that tells us that gcc has "BROKEN_IMMEDIATE".
I have absolutely no clue what "BROKEN_IMMEDIATE" is so I guess others are in the same boat. Comment please!

Yes, I guess this worth being commented, you are right. I'll write something along the lines written in the patch header.

Quoted 3 lines

Consider something like this (note: no negative logic involved):
export USE_IMMEDIATE := $(call cc-ifversion, -ge, 0400, $(CONFIG_IMMEDIATE))

Quoted 7 lines

Hrm, if I do that, I would have to add USE_IMMEDIATE to each architecture's makefiles for which immediate values are supported, e.g.:

export USE_IMMEDIATE := $(CONFIG_IMMEDIATE)

The "BROKEN_IMMEDIATE" (negative) approach only needs to be defined on x86_64 where gcc 3.x does not support symbol+offset correctly.

Same with USE_IMMEDIATE - as USE_IMMEDIATE is only used in a x86 Makefile. Or did I miss sothing?

Sam

#10 lore raw

Re: [PATCH] Fix Immediate Values x86_64 support old gcc (v2)

Quoted 3 lines · * Sam Ravnborg ([email protected]) wrote:

Same with USE_IMMEDIATE - as USE_IMMEDIATE is only used in a x86 Makefile. Or did I miss sothing?

Given that I want to change every use of CONFIG_IMMEDIATE into USE_IMMEDIATE, both in architecture specific and independant C files and also in arch spec. and indep. Makefiles, I will have to define USE_IMMEDIATE on other arch too.

Here is the updated patch. It applies on top of the sched-devel.git tree.

Fix Immediate Values x86_64 support old gcc

GCC < 4, on x86_64, does not accept symbol+offset operands for "i" constraints asm statements. Fallback on generic immediate values if this compiler is detected.

Changelog :
- USE_IMMEDIATE must now be used in lieue of CONFIG_IMMEDIATE in Makefiles and in C code.
- Every architecture implementing immediate values must declare USE_IMMEDIATE in their Makefile.

CC Sam Ravnborg <[email protected]>
CC "H. Peter Anvin" <[email protected]>
CC Jeremy Fitzhardinge <[email protected]>
CC Ingo Molnar <[email protected]>
CC David Miller <[email protected]>
CC Paul Mackerras [email protected]
---
 Makefile                     |    5 +++++
 arch/powerpc/Makefile        |    2 ++
 arch/powerpc/kernel/Makefile |    2 +-
 arch/x86/Makefile            |    5 +++++
 arch/x86/kernel/Makefile     |    2 +-
 arch/x86/kernel/traps_32.c   |    4 ++--
 include/linux/immediate.h    |    2 +-
 include/linux/module.h       |    4 ++--
 kernel/Makefile              |    2 +-
 kernel/module.c              |    8 ++++----
 10 files changed, 24 insertions(+), 12 deletions(-)
arch/x86/Makefile +5 -0
Index: linux-2.6-sched-devel/arch/x86/Makefile
===================================================================
@@ -43,6 +43,7 @@
 
         # temporary until string.h is fixed
         KBUILD_CFLAGS += -ffreestanding
+	export USE_IMMEDIATE := $(CONFIG_IMMEDIATE)
 else
         BITS := 64
         UTS_MACHINE := x86_64
@@ -78,6 +79,10 @@
                 "$(CC)" -fstack-protector-all )
 
         KBUILD_CFLAGS += $(stackp-y)
+
+	# x86_64 gcc 3.x has problems with passing symbol+offset in
+	# asm "i" constraint.
+	export USE_IMMEDIATE := $(call cc-ifversion, -ge, 0400, $(CONFIG_IMMEDIATE))
 endif
 
 # Stackpointer is addressed different for 32 bit and 64 bit x86
include/linux/immediate.h +1 -1
Index: linux-2.6-sched-devel/include/linux/immediate.h
===================================================================
@@ -10,7 +10,7 @@
  * See the file COPYING for more details.
  */
 
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 
 #include <asm/immediate.h>
 
arch/x86/kernel/Makefile +1 -1
Index: linux-2.6-sched-devel/arch/x86/kernel/Makefile
===================================================================
@@ -75,7 +75,7 @@
 obj-$(CONFIG_KPROBES)		+= kprobes.o
 obj-$(CONFIG_MODULES)		+= module_$(BITS).o
 obj-$(CONFIG_ACPI_SRAT) 	+= srat_32.o
-obj-$(CONFIG_IMMEDIATE)		+= immediate.o
+obj-$(USE_IMMEDIATE)		+= immediate.o
 obj-$(CONFIG_EFI) 		+= efi.o efi_$(BITS).o efi_stub_$(BITS).o
 obj-$(CONFIG_DOUBLEFAULT) 	+= doublefault_32.o
 obj-$(CONFIG_KGDB)		+= kgdb.o
kernel/Makefile +1 -1
Index: linux-2.6-sched-devel/kernel/Makefile
===================================================================
@@ -75,7 +75,7 @@
 obj-$(CONFIG_SYSCTL) += utsname_sysctl.o
 obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o
 obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o
-obj-$(CONFIG_IMMEDIATE) += immediate.o
+obj-$(USE_IMMEDIATE) += immediate.o
 obj-$(CONFIG_MARKERS) += marker.o
 obj-$(CONFIG_LATENCYTOP) += latencytop.o
 obj-$(CONFIG_FTRACE) += trace/
arch/powerpc/Makefile +2 -0
Index: linux-2.6-sched-devel/arch/powerpc/Makefile
===================================================================
@@ -98,6 +98,8 @@
 endif
 endif
 
+export USE_IMMEDIATE := $(CONFIG_IMMEDIATE)
+
 ifeq ($(CONFIG_TUNE_CELL),y)
 	KBUILD_CFLAGS += $(call cc-option,-mtune=cell)
 endif
Makefile +5 -0
Index: linux-2.6-sched-devel/Makefile
===================================================================
@@ -532,6 +532,11 @@
 KBUILD_CFLAGS	+= -pg
 endif
 
+# arch Makefile detects if the compiler permits use of immediate values
+ifdef USE_IMMEDIATE
+KBUILD_CFLAGS	+= -DUSE_IMMEDIATE
+endif
+
 # We trigger additional mismatches with less inlining
 ifdef CONFIG_DEBUG_SECTION_MISMATCH
 KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)
arch/powerpc/kernel/Makefile +1 -1
Index: linux-2.6-sched-devel/arch/powerpc/kernel/Makefile
===================================================================
@@ -45,7 +45,7 @@
 obj64-$(CONFIG_HIBERNATION)	+= swsusp_asm64.o
 obj-$(CONFIG_MODULES)		+= module_$(CONFIG_WORD_SIZE).o
 obj-$(CONFIG_44x)		+= cpu_setup_44x.o
-obj-$(CONFIG_IMMEDIATE)		+= immediate.o
+obj-$(USE_IMMEDIATE)		+= immediate.o
 
 ifeq ($(CONFIG_PPC_MERGE),y)
 
kernel/module.c +4 -4
Index: linux-2.6-sched-devel/kernel/module.c
===================================================================
@@ -2013,7 +2013,7 @@
 	mod->gpl_future_syms = (void *)sechdrs[gplfutureindex].sh_addr;
 	if (gplfuturecrcindex)
 		mod->gpl_future_crcs = (void *)sechdrs[gplfuturecrcindex].sh_addr;
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 	mod->immediate = (void *)sechdrs[immediateindex].sh_addr;
 	mod->num_immediate =
 		sechdrs[immediateindex].sh_size / sizeof(*mod->immediate);
@@ -2097,7 +2097,7 @@
 		marker_update_probe_range(mod->markers,
 			mod->markers + mod->num_markers);
 #endif
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 		/* Immediate values must be updated after markers */
 		imv_update_range(mod->immediate,
 			mod->immediate + mod->num_immediate);
@@ -2258,7 +2258,7 @@
 	/* Drop initial reference. */
 	module_put(mod);
 	unwind_remove_table(mod->unwind_info, 1);
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 	imv_unref(mod->immediate, mod->immediate + mod->num_immediate,
 		mod->module_init, mod->init_size);
 #endif
@@ -2657,7 +2657,7 @@
 }
 #endif
 
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 /**
  * _module_imv_update - update all immediate values in the kernel
  *
include/linux/module.h +2 -2
Index: linux-2.6-sched-devel/include/linux/module.h
===================================================================
@@ -339,7 +339,7 @@
 	/* The command line arguments (may be mangled).  People like
 	   keeping pointers to this stuff */
 	char *args;
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 	struct __imv *immediate;
 	unsigned int num_immediate;
 	unsigned long *immediate_cond_end;
@@ -563,7 +563,7 @@
 
 #endif /* CONFIG_MODULES */
 
-#if defined(CONFIG_MODULES) && defined(CONFIG_IMMEDIATE)
+#if defined(CONFIG_MODULES) && defined(USE_IMMEDIATE)
 extern void _module_imv_update(void);
 extern void module_imv_update(void);
 extern int is_imv_cond_end_module(unsigned long addr1, unsigned long addr2);
arch/x86/kernel/traps_32.c +2 -2
Index: linux-2.6-sched-devel/arch/x86/kernel/traps_32.c
===================================================================
@@ -595,7 +595,7 @@
 }
 
 DO_VM86_ERROR_INFO(0, SIGFPE,  "divide error", divide_error, FPE_INTDIV, regs->ip)
-#if !defined(CONFIG_KPROBES) && !defined(CONFIG_IMMEDIATE)
+#if !defined(CONFIG_KPROBES) && !defined(USE_IMMEDIATE)
 DO_VM86_ERROR(3, SIGTRAP, "int3", int3)
 #endif
 DO_VM86_ERROR(4, SIGSEGV, "overflow", overflow)
@@ -860,7 +860,7 @@
 	acpi_nmi_enable();
 }
 
-#if defined(CONFIG_KPROBES) || defined(CONFIG_IMMEDIATE)
+#if defined(CONFIG_KPROBES) || defined(USE_IMMEDIATE)
 void __kprobes do_int3(struct pt_regs *regs, long error_code)
 {
 	trace_hardirqs_fixup();
Signature · 2 lines
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
#11 lore raw

Re: [PATCH] Fix Immediate Values x86_64 support old gcc (v2)

Quoted 51 lines · Mathieu Desnoyers
Quoted 3 lines · * Sam Ravnborg ([email protected]) wrote:

Same with USE_IMMEDIATE - as USE_IMMEDIATE is only used in a x86 Makefile. Or did I miss sothing?

Given that I want to change every use of CONFIG_IMMEDIATE into USE_IMMEDIATE, both in architecture specific and independant C files and also in arch spec. and indep. Makefiles, I will have to define USE_IMMEDIATE on other arch too.

Here is the updated patch. It applies on top of the sched-devel.git tree.

Fix Immediate Values x86_64 support old gcc

GCC < 4, on x86_64, does not accept symbol+offset operands for "i" constraints asm statements. Fallback on generic immediate values if this compiler is detected.

Changelog :
- USE_IMMEDIATE must now be used in lieue of CONFIG_IMMEDIATE in Makefiles and in C code.
- Every architecture implementing immediate values must declare USE_IMMEDIATE in their Makefile.

CC Sam Ravnborg <[email protected]>
CC "H. Peter Anvin" <[email protected]>
CC Jeremy Fitzhardinge <[email protected]>
CC Ingo Molnar <[email protected]>
CC David Miller <[email protected]>
CC Paul Mackerras [email protected]
---
 Makefile                     |    5 +++++
 arch/powerpc/Makefile        |    2 ++
 arch/powerpc/kernel/Makefile |    2 +-
 arch/x86/Makefile            |    5 +++++
 arch/x86/kernel/Makefile     |    2 +-
 arch/x86/kernel/traps_32.c   |    4 ++--
 include/linux/immediate.h    |    2 +-
 include/linux/module.h       |    4 ++--
 kernel/Makefile              |    2 +-
 kernel/module.c              |    8 ++++----
 10 files changed, 24 insertions(+), 12 deletions(-)

Index: linux-2.6-sched-devel/arch/x86/Makefile
===================================================================

arch/x86/Makefile line 46

Quoted 4 lines
arch/x86/Makefile +1 -0
@@ -43,6 +43,7 @@
 
         # temporary until string.h is fixed
         KBUILD_CFLAGS += -ffreestanding
+	export USE_IMMEDIATE := $(CONFIG_IMMEDIATE)

tabs has a special sematic purpose in makefiles so do not use tabs for indent.

arch/x86/Makefile line 85

Quoted 11 lines
arch/x86/Makefile +4 -0
 else
         BITS := 64
         UTS_MACHINE := x86_64
@@ -78,6 +79,10 @@
                 "$(CC)" -fstack-protector-all )
 
         KBUILD_CFLAGS += $(stackp-y)
+
+	# x86_64 gcc 3.x has problems with passing symbol+offset in
+	# asm "i" constraint.
+	export USE_IMMEDIATE := $(call cc-ifversion, -ge, 0400, $(CONFIG_IMMEDIATE))

tabs -> spaces again.

Other than that I like this patch much better.

Thanks,
Sam

#12 lore raw

Re: [PATCH] Fix Immediate Values x86_64 support old gcc (v3)

GCC < 4, on x86_64, does not accept symbol+offset operands for "i" constraints asm statements. Fallback on generic immediate values if this compiler is detected.

Changelog :
- USE_IMMEDIATE must now be used in lieue of CONFIG_IMMEDIATE in Makefiles and in C code.
- Every architecture implementing immediate values must declare USE_IMMEDIATE in their Makefile.
- Tab -> spaces in Makefiles.

CC Sam Ravnborg <[email protected]>
CC "H. Peter Anvin" <[email protected]>
CC Jeremy Fitzhardinge <[email protected]>
CC Ingo Molnar <[email protected]>
CC David Miller <[email protected]>
CC Paul Mackerras <[email protected]>
---
 Makefile                     |    5 +++++
 arch/powerpc/Makefile        |    2 ++
 arch/powerpc/kernel/Makefile |    2 +-
 arch/x86/Makefile            |    5 +++++
 arch/x86/kernel/Makefile     |    2 +-
 arch/x86/kernel/traps_32.c   |    4 ++--
 include/linux/immediate.h    |    2 +-
 include/linux/module.h       |    4 ++--
 kernel/Makefile              |    2 +-
 kernel/module.c              |    8 ++++----
 10 files changed, 24 insertions(+), 12 deletions(-)
arch/x86/Makefile +5 -0
Index: linux-2.6-sched-devel/arch/x86/Makefile
===================================================================
@@ -43,6 +43,7 @@
 
         # temporary until string.h is fixed
         KBUILD_CFLAGS += -ffreestanding
+        export USE_IMMEDIATE := $(CONFIG_IMMEDIATE)
 else
         BITS := 64
         UTS_MACHINE := x86_64
@@ -78,6 +79,10 @@
                 "$(CC)" -fstack-protector-all )
 
         KBUILD_CFLAGS += $(stackp-y)
+
+        # x86_64 gcc 3.x has problems with passing symbol+offset in
+        # asm "i" constraint.
+        export USE_IMMEDIATE := $(call cc-ifversion, -ge, 0400, $(CONFIG_IMMEDIATE))
 endif
 
 # Stackpointer is addressed different for 32 bit and 64 bit x86
include/linux/immediate.h +1 -1
Index: linux-2.6-sched-devel/include/linux/immediate.h
===================================================================
@@ -10,7 +10,7 @@
  * See the file COPYING for more details.
  */
 
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 
 #include <asm/immediate.h>
 
arch/x86/kernel/Makefile +1 -1
Index: linux-2.6-sched-devel/arch/x86/kernel/Makefile
===================================================================
@@ -75,7 +75,7 @@
 obj-$(CONFIG_KPROBES)		+= kprobes.o
 obj-$(CONFIG_MODULES)		+= module_$(BITS).o
 obj-$(CONFIG_ACPI_SRAT) 	+= srat_32.o
-obj-$(CONFIG_IMMEDIATE)		+= immediate.o
+obj-$(USE_IMMEDIATE)		+= immediate.o
 obj-$(CONFIG_EFI) 		+= efi.o efi_$(BITS).o efi_stub_$(BITS).o
 obj-$(CONFIG_DOUBLEFAULT) 	+= doublefault_32.o
 obj-$(CONFIG_KGDB)		+= kgdb.o
kernel/Makefile +1 -1
Index: linux-2.6-sched-devel/kernel/Makefile
===================================================================
@@ -75,7 +75,7 @@
 obj-$(CONFIG_SYSCTL) += utsname_sysctl.o
 obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o
 obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o
-obj-$(CONFIG_IMMEDIATE) += immediate.o
+obj-$(USE_IMMEDIATE) += immediate.o
 obj-$(CONFIG_MARKERS) += marker.o
 obj-$(CONFIG_LATENCYTOP) += latencytop.o
 obj-$(CONFIG_FTRACE) += trace/
arch/powerpc/Makefile +2 -0
Index: linux-2.6-sched-devel/arch/powerpc/Makefile
===================================================================
@@ -98,6 +98,8 @@
 endif
 endif
 
+export USE_IMMEDIATE := $(CONFIG_IMMEDIATE)
+
 ifeq ($(CONFIG_TUNE_CELL),y)
 	KBUILD_CFLAGS += $(call cc-option,-mtune=cell)
 endif
Makefile +5 -0
Index: linux-2.6-sched-devel/Makefile
===================================================================
@@ -532,6 +532,11 @@
 KBUILD_CFLAGS	+= -pg
 endif
 
+# arch Makefile detects if the compiler permits use of immediate values
+ifdef USE_IMMEDIATE
+KBUILD_CFLAGS	+= -DUSE_IMMEDIATE
+endif
+
 # We trigger additional mismatches with less inlining
 ifdef CONFIG_DEBUG_SECTION_MISMATCH
 KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)
arch/powerpc/kernel/Makefile +1 -1
Index: linux-2.6-sched-devel/arch/powerpc/kernel/Makefile
===================================================================
@@ -45,7 +45,7 @@
 obj64-$(CONFIG_HIBERNATION)	+= swsusp_asm64.o
 obj-$(CONFIG_MODULES)		+= module_$(CONFIG_WORD_SIZE).o
 obj-$(CONFIG_44x)		+= cpu_setup_44x.o
-obj-$(CONFIG_IMMEDIATE)		+= immediate.o
+obj-$(USE_IMMEDIATE)		+= immediate.o
 
 ifeq ($(CONFIG_PPC_MERGE),y)
 
kernel/module.c +4 -4
Index: linux-2.6-sched-devel/kernel/module.c
===================================================================
@@ -2013,7 +2013,7 @@
 	mod->gpl_future_syms = (void *)sechdrs[gplfutureindex].sh_addr;
 	if (gplfuturecrcindex)
 		mod->gpl_future_crcs = (void *)sechdrs[gplfuturecrcindex].sh_addr;
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 	mod->immediate = (void *)sechdrs[immediateindex].sh_addr;
 	mod->num_immediate =
 		sechdrs[immediateindex].sh_size / sizeof(*mod->immediate);
@@ -2097,7 +2097,7 @@
 		marker_update_probe_range(mod->markers,
 			mod->markers + mod->num_markers);
 #endif
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 		/* Immediate values must be updated after markers */
 		imv_update_range(mod->immediate,
 			mod->immediate + mod->num_immediate);
@@ -2258,7 +2258,7 @@
 	/* Drop initial reference. */
 	module_put(mod);
 	unwind_remove_table(mod->unwind_info, 1);
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 	imv_unref(mod->immediate, mod->immediate + mod->num_immediate,
 		mod->module_init, mod->init_size);
 #endif
@@ -2657,7 +2657,7 @@
 }
 #endif
 
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 /**
  * _module_imv_update - update all immediate values in the kernel
  *
include/linux/module.h +2 -2
Index: linux-2.6-sched-devel/include/linux/module.h
===================================================================
@@ -339,7 +339,7 @@
 	/* The command line arguments (may be mangled).  People like
 	   keeping pointers to this stuff */
 	char *args;
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 	struct __imv *immediate;
 	unsigned int num_immediate;
 	unsigned long *immediate_cond_end;
@@ -563,7 +563,7 @@
 
 #endif /* CONFIG_MODULES */
 
-#if defined(CONFIG_MODULES) && defined(CONFIG_IMMEDIATE)
+#if defined(CONFIG_MODULES) && defined(USE_IMMEDIATE)
 extern void _module_imv_update(void);
 extern void module_imv_update(void);
 extern int is_imv_cond_end_module(unsigned long addr1, unsigned long addr2);
arch/x86/kernel/traps_32.c +2 -2
Index: linux-2.6-sched-devel/arch/x86/kernel/traps_32.c
===================================================================
@@ -595,7 +595,7 @@
 }
 
 DO_VM86_ERROR_INFO(0, SIGFPE,  "divide error", divide_error, FPE_INTDIV, regs->ip)
-#if !defined(CONFIG_KPROBES) && !defined(CONFIG_IMMEDIATE)
+#if !defined(CONFIG_KPROBES) && !defined(USE_IMMEDIATE)
 DO_VM86_ERROR(3, SIGTRAP, "int3", int3)
 #endif
 DO_VM86_ERROR(4, SIGSEGV, "overflow", overflow)
@@ -860,7 +860,7 @@
 	acpi_nmi_enable();
 }
 
-#if defined(CONFIG_KPROBES) || defined(CONFIG_IMMEDIATE)
+#if defined(CONFIG_KPROBES) || defined(USE_IMMEDIATE)
 void __kprobes do_int3(struct pt_regs *regs, long error_code)
 {
 	trace_hardirqs_fixup();
Signature · 2 lines
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
#13 lore raw

Re: [PATCH] Fix Immediate Values x86_64 support old gcc (v3)

Quoted 4 lines · * Mathieu Desnoyers ([email protected]) wrote:

GCC < 4, on x86_64, does not accept symbol+offset operands for "i" constraints asm statements. Fallback on generic immediate values if this compiler is detected.

Please replace the previous paragraph in the changelog by :

GCC < 4, on x86_64, does not accept symbol+offset operands for "i" constraints asm statements. Fallback on a memory read in lieue of immediate value if this compiler is detected.

As Peter pointed out, talking of "generic immediate value" is rather confusing.

Mathieu

Quoted 219 lines

Changelog :
- USE_IMMEDIATE must now be used in lieue of CONFIG_IMMEDIATE in Makefiles and in C code.
- Every architecture implementing immediate values must declare USE_IMMEDIATE in their Makefile.
- Tab -> spaces in Makefiles.

CC Sam Ravnborg <[email protected]>
CC "H. Peter Anvin" <[email protected]>
CC Jeremy Fitzhardinge <[email protected]>
CC Ingo Molnar <[email protected]>
CC David Miller <[email protected]>
CC Paul Mackerras <[email protected]>
---
 Makefile                     |    5 +++++
 arch/powerpc/Makefile        |    2 ++
 arch/powerpc/kernel/Makefile |    2 +-
 arch/x86/Makefile            |    5 +++++
 arch/x86/kernel/Makefile     |    2 +-
 arch/x86/kernel/traps_32.c   |    4 ++--
 include/linux/immediate.h    |    2 +-
 include/linux/module.h       |    4 ++--
 kernel/Makefile              |    2 +-
 kernel/module.c              |    8 ++++----
 10 files changed, 24 insertions(+), 12 deletions(-)

Index: linux-2.6-sched-devel/arch/x86/Makefile
===================================================================

arch/x86/Makefile +5 -0
@@ -43,6 +43,7 @@
 
         # temporary until string.h is fixed
         KBUILD_CFLAGS += -ffreestanding
+        export USE_IMMEDIATE := $(CONFIG_IMMEDIATE)
 else
         BITS := 64
         UTS_MACHINE := x86_64
@@ -78,6 +79,10 @@
                 "$(CC)" -fstack-protector-all )
 
         KBUILD_CFLAGS += $(stackp-y)
+
+        # x86_64 gcc 3.x has problems with passing symbol+offset in
+        # asm "i" constraint.
+        export USE_IMMEDIATE := $(call cc-ifversion, -ge, 0400, $(CONFIG_IMMEDIATE))
 endif
 
 # Stackpointer is addressed different for 32 bit and 64 bit x86

Index: linux-2.6-sched-devel/include/linux/immediate.h
===================================================================

include/linux/immediate.h +1 -1
@@ -10,7 +10,7 @@
  * See the file COPYING for more details.
  */
 
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 
 #include <asm/immediate.h>
 

Index: linux-2.6-sched-devel/arch/x86/kernel/Makefile
===================================================================

arch/x86/kernel/Makefile +1 -1
@@ -75,7 +75,7 @@
 obj-$(CONFIG_KPROBES)		+= kprobes.o
 obj-$(CONFIG_MODULES)		+= module_$(BITS).o
 obj-$(CONFIG_ACPI_SRAT) 	+= srat_32.o
-obj-$(CONFIG_IMMEDIATE)		+= immediate.o
+obj-$(USE_IMMEDIATE)		+= immediate.o
 obj-$(CONFIG_EFI) 		+= efi.o efi_$(BITS).o efi_stub_$(BITS).o
 obj-$(CONFIG_DOUBLEFAULT) 	+= doublefault_32.o
 obj-$(CONFIG_KGDB)		+= kgdb.o

Index: linux-2.6-sched-devel/kernel/Makefile
===================================================================

kernel/Makefile +1 -1
@@ -75,7 +75,7 @@
 obj-$(CONFIG_SYSCTL) += utsname_sysctl.o
 obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o
 obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o
-obj-$(CONFIG_IMMEDIATE) += immediate.o
+obj-$(USE_IMMEDIATE) += immediate.o
 obj-$(CONFIG_MARKERS) += marker.o
 obj-$(CONFIG_LATENCYTOP) += latencytop.o
 obj-$(CONFIG_FTRACE) += trace/

Index: linux-2.6-sched-devel/arch/powerpc/Makefile
===================================================================

arch/powerpc/Makefile +2 -0
@@ -98,6 +98,8 @@
 endif
 endif
 
+export USE_IMMEDIATE := $(CONFIG_IMMEDIATE)
+
 ifeq ($(CONFIG_TUNE_CELL),y)
 	KBUILD_CFLAGS += $(call cc-option,-mtune=cell)
 endif

Index: linux-2.6-sched-devel/Makefile
===================================================================

Makefile +5 -0
@@ -532,6 +532,11 @@
 KBUILD_CFLAGS	+= -pg
 endif
 
+# arch Makefile detects if the compiler permits use of immediate values
+ifdef USE_IMMEDIATE
+KBUILD_CFLAGS	+= -DUSE_IMMEDIATE
+endif
+
 # We trigger additional mismatches with less inlining
 ifdef CONFIG_DEBUG_SECTION_MISMATCH
 KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)

Index: linux-2.6-sched-devel/arch/powerpc/kernel/Makefile
===================================================================

arch/powerpc/kernel/Makefile +1 -1
@@ -45,7 +45,7 @@
 obj64-$(CONFIG_HIBERNATION)	+= swsusp_asm64.o
 obj-$(CONFIG_MODULES)		+= module_$(CONFIG_WORD_SIZE).o
 obj-$(CONFIG_44x)		+= cpu_setup_44x.o
-obj-$(CONFIG_IMMEDIATE)		+= immediate.o
+obj-$(USE_IMMEDIATE)		+= immediate.o
 
 ifeq ($(CONFIG_PPC_MERGE),y)
 

Index: linux-2.6-sched-devel/kernel/module.c
===================================================================

kernel/module.c +4 -4
@@ -2013,7 +2013,7 @@
 	mod->gpl_future_syms = (void *)sechdrs[gplfutureindex].sh_addr;
 	if (gplfuturecrcindex)
 		mod->gpl_future_crcs = (void *)sechdrs[gplfuturecrcindex].sh_addr;
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 	mod->immediate = (void *)sechdrs[immediateindex].sh_addr;
 	mod->num_immediate =
 		sechdrs[immediateindex].sh_size / sizeof(*mod->immediate);
@@ -2097,7 +2097,7 @@
 		marker_update_probe_range(mod->markers,
 			mod->markers + mod->num_markers);
 #endif
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 		/* Immediate values must be updated after markers */
 		imv_update_range(mod->immediate,
 			mod->immediate + mod->num_immediate);
@@ -2258,7 +2258,7 @@
 	/* Drop initial reference. */
 	module_put(mod);
 	unwind_remove_table(mod->unwind_info, 1);
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 	imv_unref(mod->immediate, mod->immediate + mod->num_immediate,
 		mod->module_init, mod->init_size);
 #endif
@@ -2657,7 +2657,7 @@
 }
 #endif
 
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 /**
  * _module_imv_update - update all immediate values in the kernel
  *

Index: linux-2.6-sched-devel/include/linux/module.h
===================================================================

include/linux/module.h +2 -2
@@ -339,7 +339,7 @@
 	/* The command line arguments (may be mangled).  People like
 	   keeping pointers to this stuff */
 	char *args;
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 	struct __imv *immediate;
 	unsigned int num_immediate;
 	unsigned long *immediate_cond_end;
@@ -563,7 +563,7 @@
 
 #endif /* CONFIG_MODULES */
 
-#if defined(CONFIG_MODULES) && defined(CONFIG_IMMEDIATE)
+#if defined(CONFIG_MODULES) && defined(USE_IMMEDIATE)
 extern void _module_imv_update(void);
 extern void module_imv_update(void);
 extern int is_imv_cond_end_module(unsigned long addr1, unsigned long addr2);

Index: linux-2.6-sched-devel/arch/x86/kernel/traps_32.c
===================================================================

arch/x86/kernel/traps_32.c +2 -2
@@ -595,7 +595,7 @@
 }
 
 DO_VM86_ERROR_INFO(0, SIGFPE,  "divide error", divide_error, FPE_INTDIV, regs->ip)
-#if !defined(CONFIG_KPROBES) && !defined(CONFIG_IMMEDIATE)
+#if !defined(CONFIG_KPROBES) && !defined(USE_IMMEDIATE)
 DO_VM86_ERROR(3, SIGTRAP, "int3", int3)
 #endif
 DO_VM86_ERROR(4, SIGSEGV, "overflow", overflow)
@@ -860,7 +860,7 @@
 	acpi_nmi_enable();
 }
 
-#if defined(CONFIG_KPROBES) || defined(CONFIG_IMMEDIATE)
+#if defined(CONFIG_KPROBES) || defined(USE_IMMEDIATE)
 void __kprobes do_int3(struct pt_regs *regs, long error_code)
 {
 	trace_hardirqs_fixup();
Signature · 3 lines
-- 
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
Signature · 2 lines
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68
#14 lore raw

Re: [PATCH] Fix Immediate Values x86_64 support old gcc (v3)

Quoted 6 lines · Mathieu Desnoyers
Quoted 4 lines · * Mathieu Desnoyers ([email protected]) wrote:

GCC < 4, on x86_64, does not accept symbol+offset operands for "i" constraints asm statements. Fallback on generic immediate values if this compiler is detected.

Quoted 8 lines

Please replace the previous paragraph in the changelog by :

GCC < 4, on x86_64, does not accept symbol+offset operands for "i" constraints asm statements. Fallback on a memory read in lieue of immediate value if this compiler is detected.

As Peter pointed out, talking of "generic immediate value" is rather confusing.

Hi Mathieu

As this is not kbuild related (except fom some minor details) I do not plan to take this in kbuild.git.
I suggest to push it via Andrew.

You may add an Acked-by: from me though.

Sam

#15 lore raw

PATCH 1/1 Fix Immediate Values x86_64 support old gcc (v3)

GCC < 4, on x86_64, does not accept symbol+offset operands for "i" constraints asm statements. Fallback on a memory read in lieue of immediate value if this compiler is detected.

Changelog :
- USE_IMMEDIATE must now be used in lieue of CONFIG_IMMEDIATE in Makefiles and in C code.
- Every architecture implementing immediate values must declare USE_IMMEDIATE in their Makefile.
- Tab -> spaces in Makefiles.

It should be pulled in
linux-2.6-ftrace.git
and
linux-2.6-sched-fixes.git,
which are the two trees which seem to have immediate values support.

Note to David Miller : the sparc64 patch you proposed will have to be updated to follow these changes.

CC "H. Peter Anvin" <[email protected]>
CC Jeremy Fitzhardinge <[email protected]>
CC Ingo Molnar <[email protected]>
CC David Miller <[email protected]>
CC Paul Mackerras <[email protected]>
---
 Makefile                     |    5 +++++
 arch/powerpc/Makefile        |    2 ++
 arch/powerpc/kernel/Makefile |    2 +-
 arch/x86/Makefile            |    5 +++++
 arch/x86/kernel/Makefile     |    2 +-
 arch/x86/kernel/traps_32.c   |    4 ++--
 include/linux/immediate.h    |    2 +-
 include/linux/module.h       |    4 ++--
 kernel/Makefile              |    2 +-
 kernel/module.c              |    8 ++++----
 10 files changed, 24 insertions(+), 12 deletions(-)
arch/x86/Makefile +5 -0
Index: linux-2.6-sched-devel/arch/x86/Makefile
===================================================================
@@ -43,6 +43,7 @@
 
         # temporary until string.h is fixed
         KBUILD_CFLAGS += -ffreestanding
+        export USE_IMMEDIATE := $(CONFIG_IMMEDIATE)
 else
         BITS := 64
         UTS_MACHINE := x86_64
@@ -78,6 +79,10 @@
                 "$(CC)" -fstack-protector-all )
 
         KBUILD_CFLAGS += $(stackp-y)
+
+        # x86_64 gcc 3.x has problems with passing symbol+offset in
+        # asm "i" constraint.
+        export USE_IMMEDIATE := $(call cc-ifversion, -ge, 0400, $(CONFIG_IMMEDIATE))
 endif
 
 # Stackpointer is addressed different for 32 bit and 64 bit x86
include/linux/immediate.h +1 -1
Index: linux-2.6-sched-devel/include/linux/immediate.h
===================================================================
@@ -10,7 +10,7 @@
  * See the file COPYING for more details.
  */
 
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 
 #include <asm/immediate.h>
 
arch/x86/kernel/Makefile +1 -1
Index: linux-2.6-sched-devel/arch/x86/kernel/Makefile
===================================================================
@@ -75,7 +75,7 @@
 obj-$(CONFIG_KPROBES)		+= kprobes.o
 obj-$(CONFIG_MODULES)		+= module_$(BITS).o
 obj-$(CONFIG_ACPI_SRAT) 	+= srat_32.o
-obj-$(CONFIG_IMMEDIATE)		+= immediate.o
+obj-$(USE_IMMEDIATE)		+= immediate.o
 obj-$(CONFIG_EFI) 		+= efi.o efi_$(BITS).o efi_stub_$(BITS).o
 obj-$(CONFIG_DOUBLEFAULT) 	+= doublefault_32.o
 obj-$(CONFIG_KGDB)		+= kgdb.o
kernel/Makefile +1 -1
Index: linux-2.6-sched-devel/kernel/Makefile
===================================================================
@@ -75,7 +75,7 @@
 obj-$(CONFIG_SYSCTL) += utsname_sysctl.o
 obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o
 obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o
-obj-$(CONFIG_IMMEDIATE) += immediate.o
+obj-$(USE_IMMEDIATE) += immediate.o
 obj-$(CONFIG_MARKERS) += marker.o
 obj-$(CONFIG_LATENCYTOP) += latencytop.o
 obj-$(CONFIG_FTRACE) += trace/
arch/powerpc/Makefile +2 -0
Index: linux-2.6-sched-devel/arch/powerpc/Makefile
===================================================================
@@ -98,6 +98,8 @@
 endif
 endif
 
+export USE_IMMEDIATE := $(CONFIG_IMMEDIATE)
+
 ifeq ($(CONFIG_TUNE_CELL),y)
 	KBUILD_CFLAGS += $(call cc-option,-mtune=cell)
 endif
Makefile +5 -0
Index: linux-2.6-sched-devel/Makefile
===================================================================
@@ -532,6 +532,11 @@
 KBUILD_CFLAGS	+= -pg
 endif
 
+# arch Makefile detects if the compiler permits use of immediate values
+ifdef USE_IMMEDIATE
+KBUILD_CFLAGS	+= -DUSE_IMMEDIATE
+endif
+
 # We trigger additional mismatches with less inlining
 ifdef CONFIG_DEBUG_SECTION_MISMATCH
 KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)
arch/powerpc/kernel/Makefile +1 -1
Index: linux-2.6-sched-devel/arch/powerpc/kernel/Makefile
===================================================================
@@ -45,7 +45,7 @@
 obj64-$(CONFIG_HIBERNATION)	+= swsusp_asm64.o
 obj-$(CONFIG_MODULES)		+= module_$(CONFIG_WORD_SIZE).o
 obj-$(CONFIG_44x)		+= cpu_setup_44x.o
-obj-$(CONFIG_IMMEDIATE)		+= immediate.o
+obj-$(USE_IMMEDIATE)		+= immediate.o
 
 ifeq ($(CONFIG_PPC_MERGE),y)
 
kernel/module.c +4 -4
Index: linux-2.6-sched-devel/kernel/module.c
===================================================================
@@ -2013,7 +2013,7 @@
 	mod->gpl_future_syms = (void *)sechdrs[gplfutureindex].sh_addr;
 	if (gplfuturecrcindex)
 		mod->gpl_future_crcs = (void *)sechdrs[gplfuturecrcindex].sh_addr;
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 	mod->immediate = (void *)sechdrs[immediateindex].sh_addr;
 	mod->num_immediate =
 		sechdrs[immediateindex].sh_size / sizeof(*mod->immediate);
@@ -2097,7 +2097,7 @@
 		marker_update_probe_range(mod->markers,
 			mod->markers + mod->num_markers);
 #endif
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 		/* Immediate values must be updated after markers */
 		imv_update_range(mod->immediate,
 			mod->immediate + mod->num_immediate);
@@ -2258,7 +2258,7 @@
 	/* Drop initial reference. */
 	module_put(mod);
 	unwind_remove_table(mod->unwind_info, 1);
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 	imv_unref(mod->immediate, mod->immediate + mod->num_immediate,
 		mod->module_init, mod->init_size);
 #endif
@@ -2657,7 +2657,7 @@
 }
 #endif
 
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 /**
  * _module_imv_update - update all immediate values in the kernel
  *
include/linux/module.h +2 -2
Index: linux-2.6-sched-devel/include/linux/module.h
===================================================================
@@ -339,7 +339,7 @@
 	/* The command line arguments (may be mangled).  People like
 	   keeping pointers to this stuff */
 	char *args;
-#ifdef CONFIG_IMMEDIATE
+#ifdef USE_IMMEDIATE
 	struct __imv *immediate;
 	unsigned int num_immediate;
 	unsigned long *immediate_cond_end;
@@ -563,7 +563,7 @@
 
 #endif /* CONFIG_MODULES */
 
-#if defined(CONFIG_MODULES) && defined(CONFIG_IMMEDIATE)
+#if defined(CONFIG_MODULES) && defined(USE_IMMEDIATE)
 extern void _module_imv_update(void);
 extern void module_imv_update(void);
 extern int is_imv_cond_end_module(unsigned long addr1, unsigned long addr2);
arch/x86/kernel/traps_32.c +2 -2
Index: linux-2.6-sched-devel/arch/x86/kernel/traps_32.c
===================================================================
@@ -595,7 +595,7 @@
 }
 
 DO_VM86_ERROR_INFO(0, SIGFPE,  "divide error", divide_error, FPE_INTDIV, regs->ip)
-#if !defined(CONFIG_KPROBES) && !defined(CONFIG_IMMEDIATE)
+#if !defined(CONFIG_KPROBES) && !defined(USE_IMMEDIATE)
 DO_VM86_ERROR(3, SIGTRAP, "int3", int3)
 #endif
 DO_VM86_ERROR(4, SIGSEGV, "overflow", overflow)
@@ -860,7 +860,7 @@
 	acpi_nmi_enable();
 }
 
-#if defined(CONFIG_KPROBES) || defined(CONFIG_IMMEDIATE)
+#if defined(CONFIG_KPROBES) || defined(USE_IMMEDIATE)
 void __kprobes do_int3(struct pt_regs *regs, long error_code)
 {
 	trace_hardirqs_fixup();
Signature · 2 lines
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68