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