diff -burN clean/arch/x86/boot/compressed/Makefile icc.new/arch/x86/boot/compressed/Makefile --- clean/arch/x86/boot/compressed/Makefile 2009-12-03 11:51:21.000000000 +0800 +++ icc.new/arch/x86/boot/compressed/Makefile 2011-04-27 03:52:26.952551623 +0800 @@ -6,7 +6,7 @@ targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma head_$(BITS).o misc.o piggy.o -KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2 +KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2 -no-vec -mP2OPT_il0_switch_max_jump_table_entries=0 KBUILD_CFLAGS += -fno-strict-aliasing -fPIC KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING cflags-$(CONFIG_X86_64) := -mcmodel=small diff -burN clean/arch/x86/include/asm/delay.h icc.new/arch/x86/include/asm/delay.h --- clean/arch/x86/include/asm/delay.h 2009-12-03 11:51:21.000000000 +0800 +++ icc.new/arch/x86/include/asm/delay.h 2011-04-27 03:52:30.544201959 +0800 @@ -17,8 +17,10 @@ extern void __delay(unsigned long loops); /* 0x10c7 is 2**32 / 1000000 (rounded up) */ +// In drivers/net/igb/e1000_phy.c, igb_phy_force_speed_duplex_igp() passes 100000 as the value of usec_interval. +// Looks like a kernel source bug. #define udelay(n) (__builtin_constant_p(n) ? \ - ((n) > 20000 ? __bad_udelay() : __const_udelay((n) * 0x10c7ul)) : \ + ((n) > 100000 ? __bad_udelay() : __const_udelay((n) * 0x10c7ul)) : \ __udelay(n)) /* 0x5 is 2**32 / 1000000000 (rounded up) */ diff -burN clean/arch/x86/include/asm/percpu.h icc.new/arch/x86/include/asm/percpu.h --- clean/arch/x86/include/asm/percpu.h 2009-12-03 11:51:21.000000000 +0800 +++ icc.new/arch/x86/include/asm/percpu.h 2011-04-27 03:52:30.398202153 +0800 @@ -145,7 +145,7 @@ #define percpu_read(var) percpu_from_op("mov", per_cpu__##var, \ "m" (per_cpu__##var)) #define percpu_read_stable(var) percpu_from_op("mov", per_cpu__##var, \ - "p" (&per_cpu__##var)) + "m" (per_cpu__##var)) #define percpu_write(var, val) percpu_to_op("mov", per_cpu__##var, val) #define percpu_add(var, val) percpu_to_op("add", per_cpu__##var, val) #define percpu_sub(var, val) percpu_to_op("sub", per_cpu__##var, val) diff -burN clean/arch/x86/include/asm/xen/hypercall.h icc.new/arch/x86/include/asm/xen/hypercall.h --- clean/arch/x86/include/asm/xen/hypercall.h 2010-10-27 14:24:34.000000000 +0800 +++ icc.new/arch/x86/include/asm/xen/hypercall.h 2011-04-27 03:52:30.421222177 +0800 @@ -91,6 +91,13 @@ #define __HYPERCALL_ARG3REG "edx" #define __HYPERCALL_ARG4REG "esi" #define __HYPERCALL_ARG5REG "edi" +// WORKAROUND FOR DPD200164950/DPD200165010 +#define __HYPERCALL_RETREGX "=a" +#define __HYPERCALL_ARG1REGX "+b" +#define __HYPERCALL_ARG2REGX "+c" +#define __HYPERCALL_ARG3REGX "+d" +#define __HYPERCALL_ARG4REGX "+S" +#define __HYPERCALL_ARG5REGX "+D" #else #define __HYPERCALL_RETREG "rax" #define __HYPERCALL_ARG1REG "rdi" @@ -101,19 +108,19 @@ #endif #define __HYPERCALL_DECLS \ - register unsigned long __res asm(__HYPERCALL_RETREG); \ - register unsigned long __arg1 asm(__HYPERCALL_ARG1REG) = __arg1; \ - register unsigned long __arg2 asm(__HYPERCALL_ARG2REG) = __arg2; \ - register unsigned long __arg3 asm(__HYPERCALL_ARG3REG) = __arg3; \ - register unsigned long __arg4 asm(__HYPERCALL_ARG4REG) = __arg4; \ - register unsigned long __arg5 asm(__HYPERCALL_ARG5REG) = __arg5; - -#define __HYPERCALL_0PARAM "=r" (__res) -#define __HYPERCALL_1PARAM __HYPERCALL_0PARAM, "+r" (__arg1) -#define __HYPERCALL_2PARAM __HYPERCALL_1PARAM, "+r" (__arg2) -#define __HYPERCALL_3PARAM __HYPERCALL_2PARAM, "+r" (__arg3) -#define __HYPERCALL_4PARAM __HYPERCALL_3PARAM, "+r" (__arg4) -#define __HYPERCALL_5PARAM __HYPERCALL_4PARAM, "+r" (__arg5) + register unsigned long __res; \ + register unsigned long __arg1 = __arg1; \ + register unsigned long __arg2 = __arg2; \ + register unsigned long __arg3 = __arg3; \ + register unsigned long __arg4 = __arg4; \ + register unsigned long __arg5 = __arg5; + +#define __HYPERCALL_0PARAM __HYPERCALL_RETREGX (__res) +#define __HYPERCALL_1PARAM __HYPERCALL_0PARAM, __HYPERCALL_ARG1REGX (__arg1) +#define __HYPERCALL_2PARAM __HYPERCALL_1PARAM, __HYPERCALL_ARG2REGX (__arg2) +#define __HYPERCALL_3PARAM __HYPERCALL_2PARAM, __HYPERCALL_ARG3REGX (__arg3) +#define __HYPERCALL_4PARAM __HYPERCALL_3PARAM, __HYPERCALL_ARG4REGX (__arg4) +#define __HYPERCALL_5PARAM __HYPERCALL_4PARAM, __HYPERCALL_ARG5REGX (__arg5) #define __HYPERCALL_0ARG() #define __HYPERCALL_1ARG(a1) \ diff -burN clean/arch/x86/Makefile icc.new/arch/x86/Makefile --- clean/arch/x86/Makefile 2010-10-27 14:24:44.000000000 +0800 +++ icc.new/arch/x86/Makefile 2011-04-27 03:52:30.235201951 +0800 @@ -107,7 +107,7 @@ # KBUILD_CFLAGS += -fno-asynchronous-unwind-tables # prevent gcc from generating any FP code by mistake -KBUILD_CFLAGS += $(call cc-option,-mno-sse -mno-mmx -mno-sse2 -mno-3dnow,) +KBUILD_CFLAGS += $(call cc-option,-mno-sse -mno-mmx -mno-sse2 -mno-3dnow -no-vec,) KBUILD_CFLAGS += $(mflags-y) KBUILD_AFLAGS += $(mflags-y) diff -burN clean/arch/x86/mm/Makefile icc.new/arch/x86/mm/Makefile --- clean/arch/x86/mm/Makefile 2010-10-27 14:24:10.000000000 +0800 +++ icc.new/arch/x86/mm/Makefile 2011-04-27 04:12:44.388576751 +0800 @@ -27,3 +27,5 @@ obj-$(CONFIG_TRACK_DIRTY_PAGES) += track.o obj-$(CONFIG_MEMTEST) += memtest.o + +CC=fcc diff -burN clean/kernel/Makefile icc.new/kernel/Makefile --- clean/kernel/Makefile 2010-10-27 14:25:00.000000000 +0800 +++ icc.new/kernel/Makefile 2011-04-27 03:52:57.003883734 +0800 @@ -136,3 +136,5 @@ targets += timeconst.h $(obj)/timeconst.h: $(src)/timeconst.pl FORCE $(call if_changed,timeconst) + +CC=fcc diff -burN clean/kernel/module.c icc.new/kernel/module.c --- clean/kernel/module.c 2010-10-27 14:24:46.000000000 +0800 +++ icc.new/kernel/module.c 2011-04-27 03:52:57.075542521 +0800 @@ -2191,6 +2191,11 @@ versindex = find_sec(hdr, sechdrs, secstrings, "__versions"); infoindex = find_sec(hdr, sechdrs, secstrings, ".modinfo"); pcpuindex = find_pcpusec(hdr, sechdrs, secstrings); + // WORKAROUND FOR DPD200167859 + // ignore empty percpu section + if (pcpuindex && !sechdrs[pcpuindex].sh_size) { + pcpuindex = 0; + } /* Don't keep modinfo and version sections. */ sechdrs[infoindex].sh_flags &= ~(unsigned long)SHF_ALLOC; diff -burN clean/Makefile icc.new/Makefile --- clean/Makefile 2010-10-27 14:25:06.000000000 +0800 +++ icc.new/Makefile 2011-04-27 03:52:47.575400957 +0800 @@ -227,8 +227,8 @@ else if [ -x /bin/bash ]; then echo /bin/bash; \ else echo sh; fi ; fi) -HOSTCC = gcc -HOSTCXX = g++ +HOSTCC = icc +HOSTCXX = icpc HOSTCFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer HOSTCXXFLAGS = -O2 @@ -314,7 +314,7 @@ AS = $(CROSS_COMPILE)as LD = $(CROSS_COMPILE)ld -CC = $(CROSS_COMPILE)gcc +CC = $(CROSS_COMPILE)icc CPP = $(CC) -E AR = $(CROSS_COMPILE)ar NM = $(CROSS_COMPILE)nm @@ -353,7 +353,8 @@ -fno-strict-aliasing -fno-common \ -Werror-implicit-function-declaration \ -Wno-format-security \ - -fno-delete-null-pointer-checks + -fno-delete-null-pointer-checks \ + -ffreestanding ifneq (,$(filter $(ARCH), i386 x86_64)) CPP_MAJOR := $(shell $(CPP) -dumpversion 2>&1 | cut -d'.' -f1) @@ -368,7 +369,7 @@ # gcc version 4.4.4 . ifeq ($(KBUILD_EXTMOD),) KBUILD_CFLAGS += $(shell if [ $(CPP_VERS) -ge 4004004 ]; then \ - echo "-Wno-array-bounds -Werror"; else echo ""; fi) + echo "-Wno-array-bounds"; else echo ""; fi) endif ##($(KBUILD_EXTMOD),) endif #(,$(filter $(ARCH), i386 x86_64)) diff -burN clean/scripts/Makefile.modpost icc.new/scripts/Makefile.modpost --- clean/scripts/Makefile.modpost 2010-10-27 14:24:24.000000000 +0800 +++ icc.new/scripts/Makefile.modpost 2011-04-29 02:42:25.509316430 +0800 @@ -110,7 +110,8 @@ modname = $(notdir $(@:.mod.o=)) quiet_cmd_cc_o_c = CC $@ - cmd_cc_o_c = $(CC) $(c_flags) $(CFLAGS_MODULE) \ +# Workaround for "Module signature verification failed" + cmd_cc_o_c = gcc $(c_flags) $(CFLAGS_MODULE) \ -c -o $@ $< $(modules:.ko=.mod.o): %.mod.o: %.mod.c FORCE