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 KeProcessorArchitecture
;
19 ULONG KeProcessorLevel
;
20 ULONG KeProcessorRevision
;
22 ULONG KeLargestCacheLine
= 0x40;
23 ULONG KeDcacheFlushCount
= 0;
24 ULONG KeIcacheFlushCount
= 0;
25 ULONG KiDmaIoCoherency
= 0;
26 CHAR KeNumberProcessors
;
27 KAFFINITY KeActiveProcessors
= 1;
28 BOOLEAN KiSMTProcessorsPresent
;
32 CHAR CmpIntelID
[] = "GenuineIntel";
33 CHAR CmpAmdID
[] = "AuthenticAMD";
34 CHAR CmpCyrixID
[] = "CyrixInstead";
35 CHAR CmpTransmetaID
[] = "GenuineTMx86";
36 CHAR CmpCentaurID
[] = "CentaurHauls";
37 CHAR CmpRiseID
[] = "RiseRiseRise";
40 /* SUPPORT ROUTINES FOR MSVC COMPATIBILITY ***********************************/
44 CPUID(IN ULONG CpuInfo
[4],
47 RtlZeroMemory(CpuInfo
, sizeof(CpuInfo
) * sizeof(ULONG
));
51 WRMSR(IN ULONG Register
,
57 RDMSR(IN ULONG Register
)
59 LARGE_INTEGER LargeVal
;
60 LargeVal
.QuadPart
= 0;
61 return LargeVal
.QuadPart
;
64 /* FUNCTIONS *****************************************************************/
68 KiSetProcessorType(VOID
)
81 KiGetFeatureBits(VOID
)
83 ULONG FeatureBits
= 0;
84 /* Return the Feature Bits */
90 KiGetCacheInformation(VOID
)
102 KiInitializeTSS2(IN PKTSS Tss
,
103 IN PKGDTENTRY TssEntry OPTIONAL
)
109 KiInitializeTSS(IN PKTSS Tss
)
115 Ki386InitializeTss(IN PKTSS Tss
,
123 KeFlushCurrentTb(VOID
)
129 KiSaveProcessorControlState(OUT PKPROCESSOR_STATE ProcessorState
)
135 KiInitializeMachineType(VOID
)
141 KiLoadFastSyscallMachineSpecificRegisters(IN ULONG_PTR Context
)
148 KiRestoreFastSyscallReturnState(VOID
)
154 Ki386EnableDE(IN ULONG_PTR Context
)
161 Ki386EnableFxsr(IN ULONG_PTR Context
)
168 Ki386EnableXMMIExceptions(IN ULONG_PTR Context
)
170 /* FIXME: Support this */
171 DPRINT1("Your machine supports XMMI exceptions but ReactOS doesn't\n");
177 KiI386PentiumLockErrataFixup(VOID
)
179 /* FIXME: Support this */
180 DPRINT1("WARNING: Your machine has a CPU bug that ReactOS can't bypass!\n");
183 /* PUBLIC FUNCTIONS **********************************************************/
190 KeSaveFloatingPointState(OUT PKFLOATING_SAVE Save
)
192 return STATUS_SUCCESS
;
200 KeRestoreFloatingPointState(IN PKFLOATING_SAVE Save
)
202 return STATUS_SUCCESS
;
210 KeGetRecommendedSharedDataAlignment(VOID
)
212 /* Return the global variable */
213 return KeLargestCacheLine
;
221 KeFlushEntireTb(IN BOOLEAN Invalid
,
222 IN BOOLEAN AllProcessors
)
226 /* Raise the IRQL for the TB Flush */
227 OldIrql
= KeRaiseIrqlToSynchLevel();
230 /* FIXME: Support IPI Flush */
231 #error Not yet implemented!
234 /* Flush the TB for the Current CPU */
235 //KeFlushCurrentTb();
237 /* Return to Original IRQL */
238 KeLowerIrql(OldIrql
);
246 KeSetDmaIoCoherency(IN ULONG Coherency
)
248 /* Save the coherency globally */
249 KiDmaIoCoherency
= Coherency
;
257 KeQueryActiveProcessors(VOID
)
261 /* Simply return the number of active processors */
262 return KeActiveProcessors
;
270 KeSaveStateForHibernate(IN PKPROCESSOR_STATE State
)
272 /* Capture the context */
273 RtlCaptureContext(&State
->ContextFrame
);
275 /* Capture the control state */
276 KiSaveProcessorControlState(State
);