Author: hyperion
Date: Wed Oct 1 06:54:29 2008
New Revision: 36610
URL:
http://svn.reactos.org/svn/reactos?rev=36610&view=rev
Log:
modified ke/i386/cpu.c
Added CMPXCHG8B enabling/detection code for TransMeta, Centaur and Rise (source:
<URL:
http://www.geoffchappell.com/notes/windows/kernel/cpu/cx8.htm>)t;). Code dead
until each vendor will be officially supported
Alex and others: please review
Modified:
trunk/reactos/ntoskrnl/ke/i386/cpu.c
Modified: trunk/reactos/ntoskrnl/ke/i386/cpu.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/cpu.c?rev…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/cpu.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/i386/cpu.c [iso-8859-1] Wed Oct 1 06:54:29 2008
@@ -353,6 +353,46 @@
CpuFeatures = Reg[3];
}
+#ifdef CPU_TRANSMETA
+ if (Vendor == CPU_TRANSMETA)
+ {
+ /* Enable CMPXCHG8B if the family (>= 5), model and stepping (>= 4.2) support it
*/
+ if ((Reg[0] & 0x0F00) >= 0x0500 && (Reg[0] & 0x00FF) >= 0x0042)
+ {
+ WRMSR(0x80860004, RDMSR(0x80860004) | 0x0100);
+ FeatureBits |= KF_CMPXCHG8B;
+ }
+ }
+#endif
+
+#ifdef CPU_CENTAUR
+ if (Vendor == CPU_CENTAUR)
+ {
+ /* If CMPXCHG8B is not detected, try to enable it */
+ if (!(CpuFeatures & 0x00000100))
+ {
+ if ((Reg[0] & 0x0F00) == 0x0500)
+ {
+ WRMSR(0x0107, RDMSR(0x0107) | 0x02);
+ FeatureBits |= KF_CMPXCHG8B;
+ }
+ else if ((Reg[0] & 0x0F00) >= 0x0600)
+ {
+ WRMSR(0x1107, (RDMSR(0x1107) | 0x02) & ~((LONGLONG)0x01));
+ FeatureBits |= KF_CMPXCHG8B;
+ }
+ }
+ }
+#endif
+
+#ifdef CPU_RISE
+ if (Vendor == CPU_RISE)
+ {
+ /* Windows Vista assumes CMPXCHG8B is always supported on Rise */
+ FeatureBits |= KF_CMPXCHG8B;
+ }
+#endif
+
/* Convert all CPUID Feature bits into our format */
if (CpuFeatures & 0x00000002) FeatureBits |= KF_V86_VIS | KF_CR4;
if (CpuFeatures & 0x00000008) FeatureBits |= KF_LARGE_PAGE | KF_CR4;