/* \r
* COPYRIGHT: See COPYING in the top level directory\r
* PROJECT: ReactOS kernel\r
- * FILE: mem.asm\r
+ * FILE: mem_asm.S\r
* PURPOSE: Memory functions\r
- * PROGRAMMER: Magnus Olsen (magnusolsen@greatlord.com)\r
- * UPDATE HISTORY:\r
- * Created 27/07/2005\r
+ * PROGRAMMERS: Patrick Baggett (baggett.patrick@gmail.com)\r
+ * Alex Ionescu (alex@relsoft.net)\r
+ * Magnus Olsen (magnusolsen@greatlord.com)\r
*/\r
\r
.intel_syntax noprefix\r
.globl _RtlFillMemory@12 // [4] (no bug)\r
.globl _RtlCompareMemoryUlong@12 // [5] (no bug) \r
.globl _RtlCompareMemory@12 // [4] (no bug)\r
+.globl @RtlPrefetchMemoryNonTemporal@8\r
\r
/* FUNCTIONS ***************************************************************/\r
\r
pop edi \r
3: \r
ret 12 // return count\r
+\r
+\r
+@RtlPrefetchMemoryNonTemporal@8:\r
+ ret /* Overwritten by ntoskrnl/ke/i386/kernel.c if SSE is supported (see Ki386SetProcessorFeatures() ) */\r
+\r
+ mov eax, [_Ke386CacheGranularity] // Get cache line size\r
+\r
+ // This is fastcall, so ecx = address, edx = size\r
+ fetch_next_line:\r
+ prefetchnta byte ptr [ecx] // prefechnta(address)\r
+ sub edx, eax // count = count - cache_line_size\r
+ add ecx, eax // address = address + cache_line_size\r
+ cmp edx, 0 // if(count) <= 0\r
+ ja fetch_next_line // goto fetch_next_line\r
+ ret\r
ULONG Ke386CacheAlignment;
CHAR Ke386CpuidModel[49] = {0,};
ULONG Ke386L1CacheSize;
+ULONG Ke386CacheGranularity = 0x40; /* FIXME: Default to 64 bytes for RtlPrefetchMemoryNonTemporal(), need real size */
BOOLEAN Ke386NoExecute = FALSE;
BOOLEAN Ke386Pae = FALSE;
BOOLEAN Ke386GlobalPagesEnabled = FALSE;
DPRINT("Ke386CacheAlignment: %d\n", Ke386CacheAlignment);
if (Ke386L1CacheSize)
{
+
DPRINT("Ke386L1CacheSize: %dkB\n", Ke386L1CacheSize);
}
if (Pcr->L2CacheSize)
KEY_VALUE_PARTIAL_INFORMATION ValueData;
NTSTATUS Status;
ULONG FastSystemCallDisable = 0;
-
+
SharedUserData->ProcessorFeatures[PF_FLOATING_POINT_PRECISION_ERRATA] = FALSE;
SharedUserData->ProcessorFeatures[PF_FLOATING_POINT_EMULATED] = FALSE;
SharedUserData->ProcessorFeatures[PF_COMPARE_EXCHANGE_DOUBLE] =
SharedUserData->ProcessorFeatures[PF_XMMI64_INSTRUCTIONS_AVAILABLE] =
(Pcr->PrcbData.FeatureBits & X86_FEATURE_SSE2);
+ /* Does the CPU Support 'prefetchnta' (SSE) */
+ if(Pcr->PrcbData.FeatureBits & X86_FEATURE_SSE)
+ {
+ /* Replace the ret by a nop */
+ *(PCHAR)RtlPrefetchMemoryNonTemporal = 0x90;
+ }
+
/* Does the CPU Support Fast System Call? */
if (Pcr->PrcbData.FeatureBits & X86_FEATURE_SYSCALL) {