2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/ke/i386/cpu.c
5 * PURPOSE: Routines for CPU-level support
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
9 /* INCLUDES *****************************************************************/
15 /* GLOBALS *******************************************************************/
17 /* CPU Features and Flags */
18 ULONG KeLargestCacheLine
= 0x40;
19 ULONG KeDcacheFlushCount
= 0;
20 ULONG KeIcacheFlushCount
= 0;
21 ULONG KiDmaIoCoherency
= 0;
22 BOOLEAN KiSMTProcessorsPresent
;
26 CHAR CmpIntelID
[] = "GenuineIntel";
27 CHAR CmpAmdID
[] = "AuthenticAMD";
28 CHAR CmpCyrixID
[] = "CyrixInstead";
29 CHAR CmpTransmetaID
[] = "GenuineTMx86";
30 CHAR CmpCentaurID
[] = "CentaurHauls";
31 CHAR CmpRiseID
[] = "RiseRiseRise";
34 /* SUPPORT ROUTINES FOR MSVC COMPATIBILITY ***********************************/
38 CPUID(IN ULONG CpuInfo
[4],
41 RtlZeroMemory(CpuInfo
, 4 * sizeof(ULONG
));
45 WRMSR(IN ULONG Register
,
51 RDMSR(IN ULONG Register
)
53 LARGE_INTEGER LargeVal
;
54 LargeVal
.QuadPart
= 0;
55 return LargeVal
.QuadPart
;
58 /* FUNCTIONS *****************************************************************/
62 KiSetProcessorType(VOID
)
75 KiGetFeatureBits(VOID
)
77 ULONG FeatureBits
= 0;
78 /* Return the Feature Bits */
84 KiGetCacheInformation(VOID
)
96 KiInitializeTSS2(IN PKTSS Tss
,
97 IN PKGDTENTRY TssEntry OPTIONAL
)
103 KiInitializeTSS(IN PKTSS Tss
)
109 Ki386InitializeTss(IN PKTSS Tss
,
117 KeFlushCurrentTb(VOID
)
123 KiSaveProcessorControlState(OUT PKPROCESSOR_STATE ProcessorState
)
129 KiInitializeMachineType(VOID
)
135 KiLoadFastSyscallMachineSpecificRegisters(IN ULONG_PTR Context
)
142 KiRestoreFastSyscallReturnState(VOID
)
148 Ki386EnableDE(IN ULONG_PTR Context
)
155 Ki386EnableFxsr(IN ULONG_PTR Context
)
162 Ki386EnableXMMIExceptions(IN ULONG_PTR Context
)
164 /* FIXME: Support this */
165 DPRINT1("Your machine supports XMMI exceptions but ReactOS doesn't\n");
171 KiI386PentiumLockErrataFixup(VOID
)
173 /* FIXME: Support this */
174 DPRINT1("WARNING: Your machine has a CPU bug that ReactOS can't bypass!\n");
177 /* PUBLIC FUNCTIONS **********************************************************/
184 KeSaveFloatingPointState(OUT PKFLOATING_SAVE Save
)
186 return STATUS_SUCCESS
;
194 KeRestoreFloatingPointState(IN PKFLOATING_SAVE Save
)
196 return STATUS_SUCCESS
;
204 KeGetRecommendedSharedDataAlignment(VOID
)
206 /* Return the global variable */
207 return KeLargestCacheLine
;
215 KeFlushEntireTb(IN BOOLEAN Invalid
,
216 IN BOOLEAN AllProcessors
)
220 /* Raise the IRQL for the TB Flush */
221 OldIrql
= KeRaiseIrqlToSynchLevel();
224 /* FIXME: Support IPI Flush */
225 #error Not yet implemented!
228 /* Flush the TB for the Current CPU */
229 //KeFlushCurrentTb();
231 /* Return to Original IRQL */
232 KeLowerIrql(OldIrql
);
240 KeSetDmaIoCoherency(IN ULONG Coherency
)
242 /* Save the coherency globally */
243 KiDmaIoCoherency
= Coherency
;
251 KeQueryActiveProcessors(VOID
)
255 /* Simply return the number of active processors */
256 return KeActiveProcessors
;
264 KeSaveStateForHibernate(IN PKPROCESSOR_STATE State
)
266 /* Capture the context */
267 RtlCaptureContext(&State
->ContextFrame
);
269 /* Capture the control state */
270 KiSaveProcessorControlState(State
);