Re: [PATCH] [RFC] [2.5 i386] GCC 3.1 -march support, PPRO_FENCE

Luca Barbieri (ldb@ldb.ods.org)
04 Aug 2002 22:23:16 +0200


--=-qKaEGyWWuS724CXg2gM2
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

Added, with the exception that sfence is only used if CONFIG_X86_OOSTORE
is not defined (currently never).

This patch, to be applied after the previous two ones, does:
- s/dep_bool/bool/ in config.in for CONFIG_X86_PPRO_FENCE
- Works around make xconfig brokenness in config.in
- Adds an option in config.in to select the processor to optimize for,
that determines the -mcpu flags
- Supports lfence, mfence and sfence

diff --exclude-from=/home/ldb/src/linux-exclude -urNd a/arch/i386/Config.help b/arch/i386/Config.help
--- a/arch/i386/Config.help 2002-08-04 21:54:59.000000000 +0200
+++ b/arch/i386/Config.help 2002-08-04 21:52:41.000000000 +0200
@@ -527,6 +527,38 @@
kernels also enable out of order memory stores for this CPU, which
can increase performance of some operations.

+CONFIG_MCPU_386
+ This is the processor type the kernel will be optimized for. The
+ kernel will run on the processor you selected in the previous
+ question and processors compatible with it, but it will run faster
+ on the CPUs selected here and slower on others.
+
+ The following settings are available:
+ - "386" for the AMD/Cyrix/Intel 386DX/DXL/SL/SLC/SX, Cyrix/TI
+ 486DLC/DLC2, UMC 486SX-S and NexGen Nx586.
+ - "486" for the AMD/Cyrix/IBM/Intel 486DX/DX2/DX4 or
+ SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or U5S.
+ - "586" for Pentium/K5/5x86/6x86.
+ - "586+MMX" for Pentium-6x86MX/CyrixIII/C3/Winchip. Currently this
+ is the same as "586".
+ - "686" for Pentium-Pro and other 686 processors.
+ - "Pentium-II" for Pentium-II. Currently this is the same as "686".
+ - "Pentium-III" for Pentium-III. Currently this is the same as "686".
+ - "Pentium-4" for the Intel Pentium 4.
+ - "K6" for the AMD K6.
+ - "K6-II/K6-III" for the AMD K6-II/K6-III processors. Currently
+ this is the same as "K6".
+ - "Athlon" for the AMD Athlon
+ - "Athlon-ThunderBird" for the AMD Athlon ThunderBird. Currently
+ this is the same as "Athlon".
+ - "Athlon-4/XP/MP" for AMD Athlon 4/XP/MP processors. Currently
+ this is the same as "Athlon".
+ - "Crusoe" for the Transmeta Crusoe.
+
+ If you don't know what to do, choose the same processor that you
+ chose in the previous question. If you still don't know what to do,
+ choose "686".
+
CONFIG_X86_PPRO_FENCE
Allows the kernel to run on Pentium Pro systems by supporting a
workaround for the store ordering bug present on them.
diff --exclude-from=/home/ldb/src/linux-exclude -urNd a/arch/i386/config.in b/arch/i386/config.in
--- a/arch/i386/config.in 2002-08-04 21:54:59.000000000 +0200
+++ b/arch/i386/config.in 2002-08-04 22:09:05.000000000 +0200
@@ -14,7 +14,7 @@

mainmenu_option next_comment
comment 'Processor type and features'
-choice 'Processor family' \
+choice 'Required processor family' \
"386 CONFIG_M386 \
486 CONFIG_M486 \
586/K5/5x86/6x86 CONFIG_M586 \
@@ -35,10 +35,33 @@
Winchip+TSC...Winchip-2 CONFIG_MWINCHIP2 \
Winchip+TSC+3DNow...Winchip-2A/Winchip-3 CONFIG_MWINCHIP3D \
CyrixIII/C3 CONFIG_MCYRIXIII" Pentium-III
+
+choice 'Optimized for processor family' \
+ "386 CONFIG_MCPU_386 \
+ 486...486/Elan CONFIG_MCPU_486 \
+ 586...Pentium/K5/etc CONFIG_MCPU_586 \
+ 586+MMX...Pentium-MMX/6x86MX/etc CONFIG_MCPU_586MMX \
+ 686...Pentium-Pro CONFIG_MCPU_686 \
+ Pentium-II CONFIG_MCPU_PENTIUMII \
+ Pentium-III CONFIG_MCPU_PENTIUMIII \
+ Pentium-4 CONFIG_MCPU_PENTIUM4 \
+ K6 CONFIG_MCPU_K6 \
+ K6-II/K6-III CONFIG_MCPU_K6II \
+ Athlon CONFIG_MCPU_ATHLON \
+ Athlon-ThunderBird CONFIG_MCPU_ATHLON_TBIRD \
+ Athlon-4/XP/MP CONFIG_MCPU_ATHLON_XP \
+ Crusoe CONFIG_MCPU_CRUSOE" 686
+
#
# Define implied options from the CPU selection here
#

+# Workaround make xconfig brokenness
+define_bool CONFIG_X86_USE_SSE_PREFETCH n
+define_bool CONFIG_X86_USE_3DNOW n
+define_bool CONFIG_X86_OOSTORE n
+define_bool CONFIG_X86_686 n
+
if [ "$CONFIG_M386" = "y" ]; then
define_bool CONFIG_X86_CMPXCHG n
define_bool CONFIG_X86_XADD n
@@ -214,7 +237,7 @@
define_bool CONFIG_X86_F00F_BUG y
fi
if [ "$CONFIG_X86_USE_SSE_PREFETCH" != "y" -a "$CONFIG_X86_USE_3DNOW" != "y" -a "$CONFIG_X86_OOSTORE" != "y" ]; then
- dep_bool 'Support Pentium Pro and slow down all processors' CONFIG_X86_PPRO_FENCE
+ bool 'Support Pentium Pro and slow down all processors' CONFIG_X86_PPRO_FENCE
fi

bool 'Symmetric multi-processing support' CONFIG_SMP
diff --exclude-from=/home/ldb/src/linux-exclude -urNd a/arch/i386/Makefile b/arch/i386/Makefile
--- a/arch/i386/Makefile 2002-08-04 16:39:51.000000000 +0200
+++ b/arch/i386/Makefile 2002-08-04 21:57:21.000000000 +0200
@@ -23,9 +23,8 @@
__cc_test = if $(CC) $(1) -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "$(1)"; $(2)fi
cc_test = $(call __cc_test,$(1),)
cc_test_ = $(call __cc_test,$(1),else $(2); )
-cc_test_march = $(call cc_test_,-march=$(1),echo "-march=$(2)")
-cc_test_march3 = $(call cc_test_,-march=$(1),$(call cc_test_march,$(2),$(3)))
-
+cc_test_o = $(call cc_test_,-$(1)=$(2),echo "-$(1)=$(3)")
+cc_test_o3 = $(call cc_test_,-$(1)=$(2),$(call cc_test_o,$(1),$(3),$(4)))
CFLAGS += -pipe

# prevent gcc from keeping the stack 16 byte aligned
@@ -56,11 +55,11 @@
endif

ifdef CONFIG_M586MX
-CFLAGS += $(shell $(call cc_test_march,pentium-mmx,i586))
+CFLAGS += $(shell $(call cc_test_o,march,pentium-mmx,i586))
endif

ifdef CONFIG_M586MMX
-CFLAGS += $(shell $(call cc_test_march,pentium-mmx,i586))
+CFLAGS += $(shell $(call cc_test_o,march,pentium-mmx,i586))
endif

ifdef CONFIG_M686
@@ -68,35 +67,35 @@
endif

ifdef CONFIG_MPENTIUMII
-CFLAGS += $(shell $(call cc_test_march,pentium2,i686))
+CFLAGS += $(shell $(call cc_test_o,march,pentium2,i686))
endif

ifdef CONFIG_MPENTIUMIII
-CFLAGS += $(shell $(call cc_test_march,pentium3,i686))
+CFLAGS += $(shell $(call cc_test_o,march,pentium3,i686))
endif

ifdef CONFIG_MPENTIUM4
-CFLAGS += $(shell $(call cc_test_march,pentium4,i686))
+CFLAGS += $(shell $(call cc_test_o,march,pentium4,i686))
endif

ifdef CONFIG_MK6
-CFLAGS += $(shell $(call cc_test_march,k6,i586 -mcpu=i686))
+CFLAGS += $(shell $(call cc_test_o,march,k6,i586))
endif

ifdef CONFIG_MK6II
-CFLAGS += $(shell $(call cc_test_march3,k6-2,k6,i586 -mcpu=i686))
+CFLAGS += $(shell $(call cc_test_o3,march,k6-2,k6,i586))
endif

ifdef CONFIG_MK7
-CFLAGS += $(shell $(call cc_test_march,athlon,i686))
+CFLAGS += $(shell $(call cc_test_o,march,athlon,i686))
endif

ifdef CONFIG_MK7SSE
-CFLAGS += $(shell $(call cc_test_march3,athlon-xp,athlon,i686))
+CFLAGS += $(shell $(call cc_test_o3,march,athlon-xp,athlon,i686))
endif

ifdef CONFIG_MCRUSOE
-CFLAGS += $(shell $(call cc_test_march,crusoe,i686 -malign-functions=0 -malign-jumps=0 -malign-loops=0))
+CFLAGS += $(shell $(call cc_test_o,march,crusoe,i686))
endif

ifdef CONFIG_MWINCHIPC6
@@ -115,6 +114,62 @@
CFLAGS += -march=i586
endif

+ifdef CONFIG_MCPU_386
+CFLAGS += -march=i386
+endif
+
+ifdef CONFIG_MCPU_486
+CFLAGS += -march=i486
+endif
+
+ifdef CONFIG_MCPU_586
+CFLAGS += -march=i586
+endif
+
+ifdef CONFIG_MCPU_586MMX
+CFLAGS += $(shell $(call cc_test_o,mcpu,pentium-mmx,i586))
+endif
+
+ifdef CONFIG_MCPU_686
+CFLAGS += -march=i686
+endif
+
+ifdef CONFIG_MCPU_PENTIUMII
+CFLAGS += $(shell $(call cc_test_o,mcpu,pentium2,i686))
+endif
+
+ifdef CONFIG_MCPU_PENTIUMIII
+CFLAGS += $(shell $(call cc_test_o,mcpu,pentium3,i686))
+endif
+
+ifdef CONFIG_MCPU_PENTIUM4
+CFLAGS += $(shell $(call cc_test_o,mcpu,pentium4,i686))
+endif
+
+ifdef CONFIG_MCPU_K6
+CFLAGS += $(shell $(call cc_test_o,mcpu,k6,i686))
+endif
+
+ifdef CONFIG_MCPU_K6II
+CFLAGS += $(shell $(call cc_test_o3,mcpu,k6-2,k6,i686))
+endif
+
+ifdef CONFIG_MCPU_ATHLON
+CFLAGS += $(shell $(call cc_test_o,mcpu,athlon,i686))
+endif
+
+ifdef CONFIG_MCPU_ATHLON_TBIRD
+CFLAGS += $(shell $(call cc_test_o3,mcpu,athlon-tbird,athlon,i686))
+endif
+
+ifdef CONFIG_MCPU_ATHLON_XP
+CFLAGS += $(shell $(call cc_test_o3,mcpu,athlon-xp,athlon,i686))
+endif
+
+ifdef CONFIG_MCPU_CRUSOE
+CFLAGS += $(shell $(call cc_test_o,mcpu,crusoe,i686 -malign-functions=0 -malign-jumps=0 -malign-loops=0))
+endif
+
HEAD := arch/i386/kernel/head.o arch/i386/kernel/init_task.o

SUBDIRS += arch/i386/kernel arch/i386/mm arch/i386/lib
diff --exclude-from=/home/ldb/src/linux-exclude -urNd a/include/asm-i386/bugs.h b/include/asm-i386/bugs.h
--- a/include/asm-i386/bugs.h 2002-08-04 21:54:59.000000000 +0200
+++ b/include/asm-i386/bugs.h 2002-08-04 22:17:22.000000000 +0200
@@ -212,10 +212,15 @@
panic("Kernel requires 3DNow support (K6-2/3, Athlon)");
#endif

-#if defined(CONFIG_X86_USE_SSE_PREFETCH)
+#if defined(CONFIG_X86_USE_SSE_PREFETCH) || (defined(CONFIG_X86_MMXEXT) && defined(CONFIG_X86_OOSTORE))
if(!boot_cpu_has(X86_FEATURE_MMXEXT))
panic("Kernel requires extended MMX support (Pentium3/4, Athlon)");
#endif
+
+#if defined(CONFIG_X86_SSE2)
+ if(!boot_cpu_has(X86_FEATURE_XMM2))
+ panic("Kernel requires SSE2 (Pentium4)");
+#endif
}

static void __init check_bugs(void)
diff --exclude-from=/home/ldb/src/linux-exclude -urNd a/include/asm-i386/system.h b/include/asm-i386/system.h
--- a/include/asm-i386/system.h 2002-07-29 04:17:20.000000000 +0200
+++ b/include/asm-i386/system.h 2002-08-04 21:56:34.000000000 +0200
@@ -282,12 +282,21 @@
* Some non intel clones support out of order store. wmb() ceases to be a
* nop for these.
*/
-
+
+#ifdef CONFIG_X86_SSE2
+#define mb() __asm__ __volatile__ ("mfence": : :"memory")
+#define rmb() __asm__ __volatile__ ("lfence": : :"memory")
+#else
#define mb() __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory")
#define rmb() mb()
+#endif

#ifdef CONFIG_X86_OOSTORE
+#ifdef CONFIG_X86_MMXEXT /* never happens right now */
+#define wmb() __asm__ __volatile__ ("sfence": : :"memory")
+#else
#define wmb() __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory")
+#endif
#else
#define wmb() __asm__ __volatile__ ("": : :"memory")
#endif

--=-qKaEGyWWuS724CXg2gM2
Content-Type: application/pgp-signature; name=signature.asc
Content-Description: This is a digitally signed message part

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.7 (GNU/Linux)

iD8DBQA9TY00djkty3ft5+cRAjSqAKCm2QFrBgP6/C15A0chY9teh/W7/ACfQdtO
eZPzf9InJ4GvU7P7Dej3poo=
=1yRj
-----END PGP SIGNATURE-----

--=-qKaEGyWWuS724CXg2gM2--
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/