x86-64 build problem with tip
Subsystems (4)
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
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.
--- include/asm-x86/immediate.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
include/asm-x86/immediate.h +4 -4
@@ -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_MARKERoff avoids the problem.J
Signature · 2 lines
Mathieu Desnoyers OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
H. Peter Anvin
reviewerRe: [PATCH] Fix immediate asm constraint for gcc 3 x86_64
Quoted 9 lines · Mathieu Desnoyers
It seems that
include/asm-x86/immediate.hin 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
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.hin 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 3x86_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
PATCH 1/1 Fix Immediate Values x86_64 support old gcc
In reply to a message not in the archiveDoes 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
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.Signed-off-by Mathieu Desnoyers <[email protected]>--- 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
-0endif# 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)
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.Signed-off-by Mathieu Desnoyers <[email protected]>--- 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
-0KBUILD_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):
exportUSE_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
-0endif# 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_IMMEDIATEand 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
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.Signed-off-by Mathieu Desnoyers <[email protected]>--- 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
-0KBUILD_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):
exportUSE_IMMEDIATE:= $(call cc-ifversion, -ge, 0400, $(CONFIG_IMMEDIATE))
Quoted 7 lines
Hrm, if I do that, I would have to add
USE_IMMEDIATEto 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 onx86_64where 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
Re: [PATCH] Fix Immediate Values x86_64 support old gcc (v2)
Quoted 3 lines · * Sam Ravnborg ([email protected]) wrote:
Same with
USE_IMMEDIATE- asUSE_IMMEDIATEis only used in a x86Makefile. 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.
--- 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
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- asUSE_IMMEDIATEis only used in a x86Makefile. Or did I miss sothing?Given that I want to change every use of
CONFIG_IMMEDIATEintoUSE_IMMEDIATE, both in architecture specific and independant C files and also in arch spec. and indep. Makefiles, I will have to defineUSE_IMMEDIATEon other arch too.Here is the updated patch. It applies on top of the sched-devel.git tree.
Fix Immediate Values
x86_64support old gccGCC < 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_IMMEDIATEmust now be used in lieue ofCONFIG_IMMEDIATEin Makefiles and in C code.
- Every architecture implementing immediate values must declareUSE_IMMEDIATEin theirMakefile.Signed-off-by Mathieu Desnoyers <[email protected]>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
-0else 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
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.
--- 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
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_IMMEDIATEmust now be used in lieue ofCONFIG_IMMEDIATEin Makefiles and in C code.
- Every architecture implementing immediate values must declareUSE_IMMEDIATEin theirMakefile.
- Tab -> spaces in Makefiles.Signed-off-by Mathieu Desnoyers <[email protected]>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 x86Index:
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.oIndex: 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) endifIndex: 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
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
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.
--- 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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