Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

x86-64 build problem with tip

0 views
Skip to first unread message

Jeremy Fitzhardinge

unread,
May 14, 2008, 6:00:29 AM5/14/08
to
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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majo...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Mathieu Desnoyers

unread,
May 16, 2008, 8:50:12 AM5/16/08
to

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.

Signed-off-by: Mathieu Desnoyers <mathieu....@polymtl.ca>
CC: Jeremy Fitzhardinge <jer...@goop.org>
CC: Ingo Molnar <mi...@elte.hu>
CC: "H. Peter Anvin" <h...@zytor.com>
---
include/asm-x86/immediate.h | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

Index: linux-2.6-sched-devel/include/asm-x86/immediate.h
===================================================================
--- linux-2.6-sched-devel.orig/include/asm-x86/immediate.h 2008-05-16 05:07:55.000000000 -0400
+++ linux-2.6-sched-devel/include/asm-x86/immediate.h 2008-05-16 05:08:29.000000000 -0400
@@ -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; \


> Turning CONFIG_MARKER off avoids the problem.
>
> J

--
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68

H. Peter Anvin

unread,
May 16, 2008, 5:40:11 PM5/16/08
to
Mathieu Desnoyers wrote:

>
> 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

Mathieu Desnoyers

unread,
May 21, 2008, 9:40:11 AM5/21/08
to
* H. Peter Anvin (h...@zytor.com) wrote:
> Mathieu Desnoyers wrote:
>
>> 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

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

--
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68

Mathieu Desnoyers

unread,
May 21, 2008, 1:10:20 PM5/21/08
to
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.

Signed-off-by: Mathieu Desnoyers <mathieu....@polymtl.ca>
---
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
===================================================================
--- linux-2.6-sched-devel.orig/arch/x86/Makefile 2008-05-21 09:04:52.000000000 -0400
+++ linux-2.6-sched-devel/arch/x86/Makefile 2008-05-21 09:22:05.000000000 -0400
@@ -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
Index: linux-2.6-sched-devel/include/asm-x86/immediate.h
===================================================================
--- linux-2.6-sched-devel.orig/include/asm-x86/immediate.h 2008-05-21 09:10:59.000000000 -0400
+++ linux-2.6-sched-devel/include/asm-x86/immediate.h 2008-05-21 09:15:43.000000000 -0400
@@ -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 */
Index: linux-2.6-sched-devel/include/linux/immediate.h
===================================================================
--- linux-2.6-sched-devel.orig/include/linux/immediate.h 2008-05-21 09:12:22.000000000 -0400
+++ linux-2.6-sched-devel/include/linux/immediate.h 2008-05-21 09:12:59.000000000 -0400
@@ -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)
Index: linux-2.6-sched-devel/arch/x86/kernel/Makefile
===================================================================
--- linux-2.6-sched-devel.orig/arch/x86/kernel/Makefile 2008-05-21 09:20:49.000000000 -0400
+++ linux-2.6-sched-devel/arch/x86/kernel/Makefile 2008-05-21 09:21:22.000000000 -0400
@@ -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
Index: linux-2.6-sched-devel/kernel/Makefile
===================================================================
--- linux-2.6-sched-devel.orig/kernel/Makefile 2008-05-21 09:21:28.000000000 -0400
+++ linux-2.6-sched-devel/kernel/Makefile 2008-05-21 09:21:44.000000000 -0400
@@ -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/

Sam Ravnborg

unread,
May 21, 2008, 4:40:21 PM5/21/08
to
Hi Mathieu

> 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.
>
> Signed-off-by: Mathieu Desnoyers <mathieu....@polymtl.ca>
> ---
> 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
> ===================================================================
> --- linux-2.6-sched-devel.orig/arch/x86/Makefile 2008-05-21 09:04:52.000000000 -0400
> +++ linux-2.6-sched-devel/arch/x86/Makefile 2008-05-21 09:22:05.000000000 -0400
> @@ -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:
> -obj-$(CONFIG_IMMEDIATE) += immediate.o
> +obj-$(USE_IMMEDIATE) += immediate.o

(Or find a better name than "USE_IMMEDIATE".


> endif
>
> # Stackpointer is addressed different for 32 bit and 64 bit x86
> Index: linux-2.6-sched-devel/include/asm-x86/immediate.h
> ===================================================================
> --- linux-2.6-sched-devel.orig/include/asm-x86/immediate.h 2008-05-21 09:10:59.000000000 -0400
> +++ linux-2.6-sched-devel/include/asm-x86/immediate.h 2008-05-21 09:15:43.000000000 -0400
> @@ -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.

> --- linux-2.6-sched-devel.orig/include/linux/immediate.h 2008-05-21 09:12:22.000000000 -0400
> +++ linux-2.6-sched-devel/include/linux/immediate.h 2008-05-21 09:12:59.000000000 -0400
> @@ -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.


>
> -#include <asm/immediate.h>
> +#ifdef CONFIG_IMMEDIATE
>
> /**
> * imv_set - set immediate variable (with locking)

Mathieu Desnoyers

unread,
May 21, 2008, 5:30:22 PM5/21/08
to

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

> 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.

> Then the MAkefile fragment can be simplified as:
> > -obj-$(CONFIG_IMMEDIATE) += immediate.o
> > +obj-$(USE_IMMEDIATE) += immediate.o
>
> (Or find a better name than "USE_IMMEDIATE".
>
>
> > endif
> >
> > # Stackpointer is addressed different for 32 bit and 64 bit x86
> > Index: linux-2.6-sched-devel/include/asm-x86/immediate.h
> > ===================================================================
> > --- linux-2.6-sched-devel.orig/include/asm-x86/immediate.h 2008-05-21 09:10:59.000000000 -0400
> > +++ linux-2.6-sched-devel/include/asm-x86/immediate.h 2008-05-21 09:15:43.000000000 -0400
> > @@ -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.
>

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

> > --- linux-2.6-sched-devel.orig/include/linux/immediate.h 2008-05-21 09:12:22.000000000 -0400
> > +++ linux-2.6-sched-devel/include/linux/immediate.h 2008-05-21 09:12:59.000000000 -0400
> > @@ -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

>
> >
> > -#include <asm/immediate.h>
> > +#ifdef CONFIG_IMMEDIATE
> >
> > /**
> > * imv_set - set immediate variable (with locking)
>

--

Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68

Sam Ravnborg

unread,
May 21, 2008, 5:50:15 PM5/21/08
to
Same with USE_IMMEDIATE - as USE_IMMEDIATE is only used in a x86 Makefile.
Or did I miss sothing?

Sam

Mathieu Desnoyers

unread,
May 21, 2008, 6:00:22 PM5/21/08
to
* Sam Ravnborg (s...@ravnborg.org) 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.

Signed-off-by: Mathieu Desnoyers <mathieu....@polymtl.ca>
CC: Sam Ravnborg <s...@ravnborg.org>


CC: "H. Peter Anvin" <h...@zytor.com>
CC: Jeremy Fitzhardinge <jer...@goop.org>
CC: Ingo Molnar <mi...@elte.hu>

CC: David Miller <da...@davemloft.net>
CC: Paul Mackerras pau...@samba.org
---
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
===================================================================
--- linux-2.6-sched-devel.orig/arch/x86/Makefile 2008-05-21 09:04:52.000000000 -0400

+++ linux-2.6-sched-devel/arch/x86/Makefile 2008-05-21 14:18:16.000000000 -0400
@@ -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
===================================================================


--- linux-2.6-sched-devel.orig/include/linux/immediate.h 2008-05-21 09:12:22.000000000 -0400

+++ linux-2.6-sched-devel/include/linux/immediate.h 2008-05-21 14:12:05.000000000 -0400
@@ -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
===================================================================
--- linux-2.6-sched-devel.orig/arch/x86/kernel/Makefile 2008-05-21 09:20:49.000000000 -0400

+++ linux-2.6-sched-devel/arch/x86/kernel/Makefile 2008-05-21 14:11:10.000000000 -0400
@@ -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
===================================================================
--- linux-2.6-sched-devel.orig/kernel/Makefile 2008-05-21 09:21:28.000000000 -0400

+++ linux-2.6-sched-devel/kernel/Makefile 2008-05-21 14:10:51.000000000 -0400
@@ -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
===================================================================
--- linux-2.6-sched-devel.orig/arch/powerpc/Makefile 2008-05-21 14:00:23.000000000 -0400
+++ linux-2.6-sched-devel/arch/powerpc/Makefile 2008-05-21 14:08:15.000000000 -0400
@@ -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
===================================================================
--- linux-2.6-sched-devel.orig/Makefile 2008-05-21 14:09:41.000000000 -0400
+++ linux-2.6-sched-devel/Makefile 2008-05-21 14:16:44.000000000 -0400
@@ -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
===================================================================
--- linux-2.6-sched-devel.orig/arch/powerpc/kernel/Makefile 2008-05-21 14:11:25.000000000 -0400
+++ linux-2.6-sched-devel/arch/powerpc/kernel/Makefile 2008-05-21 14:11:36.000000000 -0400
@@ -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
===================================================================
--- linux-2.6-sched-devel.orig/kernel/module.c 2008-05-21 14:13:01.000000000 -0400
+++ linux-2.6-sched-devel/kernel/module.c 2008-05-21 14:13:18.000000000 -0400
@@ -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
===================================================================
--- linux-2.6-sched-devel.orig/include/linux/module.h 2008-05-21 14:13:30.000000000 -0400
+++ linux-2.6-sched-devel/include/linux/module.h 2008-05-21 14:13:47.000000000 -0400
@@ -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
===================================================================
--- linux-2.6-sched-devel.orig/arch/x86/kernel/traps_32.c 2008-05-21 14:14:13.000000000 -0400
+++ linux-2.6-sched-devel/arch/x86/kernel/traps_32.c 2008-05-21 14:14:32.000000000 -0400
@@ -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();

--
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68

Sam Ravnborg

unread,
May 21, 2008, 6:40:11 PM5/21/08
to
tabs has a special sematic purpose in makefiles so do not
use tabs for indent.

> 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

Mathieu Desnoyers

unread,
May 21, 2008, 7:30:17 PM5/21/08
to
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.

Signed-off-by: Mathieu Desnoyers <mathieu....@polymtl.ca>
CC: Sam Ravnborg <s...@ravnborg.org>
CC: "H. Peter Anvin" <h...@zytor.com>
CC: Jeremy Fitzhardinge <jer...@goop.org>
CC: Ingo Molnar <mi...@elte.hu>
CC: David Miller <da...@davemloft.net>
CC: Paul Mackerras <pau...@samba.org>
---
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
===================================================================
--- linux-2.6-sched-devel.orig/arch/x86/Makefile 2008-05-21 15:16:06.000000000 -0400
+++ linux-2.6-sched-devel/arch/x86/Makefile 2008-05-21 15:53:00.000000000 -0400


@@ -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
===================================================================

--- linux-2.6-sched-devel.orig/include/linux/immediate.h 2008-05-21 15:16:06.000000000 -0400
+++ linux-2.6-sched-devel/include/linux/immediate.h 2008-05-21 15:16:59.000000000 -0400


@@ -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
===================================================================

--- linux-2.6-sched-devel.orig/arch/x86/kernel/Makefile 2008-05-21 15:16:51.000000000 -0400
+++ linux-2.6-sched-devel/arch/x86/kernel/Makefile 2008-05-21 15:16:59.000000000 -0400


@@ -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
===================================================================

--- linux-2.6-sched-devel.orig/kernel/Makefile 2008-05-21 15:16:52.000000000 -0400
+++ linux-2.6-sched-devel/kernel/Makefile 2008-05-21 15:16:59.000000000 -0400


@@ -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
===================================================================

--- linux-2.6-sched-devel.orig/arch/powerpc/Makefile 2008-05-21 15:16:06.000000000 -0400
+++ linux-2.6-sched-devel/arch/powerpc/Makefile 2008-05-21 15:16:59.000000000 -0400


@@ -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
===================================================================

--- linux-2.6-sched-devel.orig/Makefile 2008-05-21 15:16:51.000000000 -0400
+++ linux-2.6-sched-devel/Makefile 2008-05-21 15:16:59.000000000 -0400


@@ -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
===================================================================

--- linux-2.6-sched-devel.orig/arch/powerpc/kernel/Makefile 2008-05-21 15:16:06.000000000 -0400
+++ linux-2.6-sched-devel/arch/powerpc/kernel/Makefile 2008-05-21 15:16:59.000000000 -0400


@@ -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
===================================================================

--- linux-2.6-sched-devel.orig/kernel/module.c 2008-05-21 15:16:52.000000000 -0400
+++ linux-2.6-sched-devel/kernel/module.c 2008-05-21 15:16:59.000000000 -0400

--- linux-2.6-sched-devel.orig/include/linux/module.h 2008-05-21 15:16:52.000000000 -0400
+++ linux-2.6-sched-devel/include/linux/module.h 2008-05-21 15:16:59.000000000 -0400


@@ -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
===================================================================

--- linux-2.6-sched-devel.orig/arch/x86/kernel/traps_32.c 2008-05-21 15:16:06.000000000 -0400
+++ linux-2.6-sched-devel/arch/x86/kernel/traps_32.c 2008-05-21 15:16:59.000000000 -0400


@@ -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();

--
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68

Mathieu Desnoyers

unread,
May 21, 2008, 10:10:10 PM5/21/08
to
* Mathieu Desnoyers (com...@krystal.dyndns.org) 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

Sam Ravnborg

unread,
May 25, 2008, 3:30:15 AM5/25/08
to
On Wed, May 21, 2008 at 10:03:09PM -0400, Mathieu Desnoyers wrote:
> * Mathieu Desnoyers (com...@krystal.dyndns.org) 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.

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

Mathieu Desnoyers

unread,
May 27, 2008, 9:20:18 AM5/27/08
to
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.

Signed-off-by: Mathieu Desnoyers <mathieu....@polymtl.ca>
Acked-by: Sam Ravnborg <s...@ravnborg.org>

0 new messages