- Used the already detected cache line size for
RtlPrefetchMemoryNonTemporal.
- Initialized RtlPrefetchMemoryNonTemporal earlier.
- Change the memory protection during the initialisation of
RtlPrefetchMemoryNonTemporal.
Modified: trunk/reactos/lib/rtl/i386/mem_asm.S
Modified: trunk/reactos/ntoskrnl/ke/i386/kernel.c
_____
Modified: trunk/reactos/lib/rtl/i386/mem_asm.S
--- trunk/reactos/lib/rtl/i386/mem_asm.S 2005-11-30 00:17:14 UTC
(rev 19763)
+++ trunk/reactos/lib/rtl/i386/mem_asm.S 2005-11-30 00:25:48 UTC
(rev 19764)
@@ -151,13 +151,12 @@
@RtlPrefetchMemoryNonTemporal@8:
ret /* Overwritten by ntoskrnl/ke/i386/kernel.c if SSE
is supported (see Ki386SetProcessorFeatures() ) */
- mov eax, [_Ke386CacheGranularity] // Get cache line size
+ mov eax, [_Ke386CacheAlignment] // Get cache line size
// This is fastcall, so ecx = address, edx = size
- fetch_next_line:
+fetch_next_line:
prefetchnta byte ptr [ecx] // prefechnta(address)
- sub edx, eax // count = count - cache_line_size
add ecx, eax // address = address +
cache_line_size
- cmp edx, 0 // if(count) > 0
+ sub edx, eax // count = count - cache_line_size
ja fetch_next_line // goto fetch_next_line
ret
_____
Modified: trunk/reactos/ntoskrnl/ke/i386/kernel.c
--- trunk/reactos/ntoskrnl/ke/i386/kernel.c 2005-11-30 00:17:14 UTC
(rev 19763)
+++ trunk/reactos/ntoskrnl/ke/i386/kernel.c 2005-11-30 00:25:48 UTC
(rev 19764)
@@ -22,7 +22,6 @@
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;
@@ -418,6 +417,18 @@
/* Target EIP. */
Ke386Wrmsr(0x176, (ULONG_PTR)KiFastCallEntry, 0);
}
+
+ /* Does the CPU Support 'prefetchnta' (SSE) */
+ if(KPCR->PrcbData.FeatureBits & X86_FEATURE_SSE)
+ {
+ ULONG Protect;
+
+ Protect = MmGetPageProtect(NULL,
(PVOID)RtlPrefetchMemoryNonTemporal);
+ MmSetPageProtect(NULL, (PVOID)RtlPrefetchMemoryNonTemporal,
Protect | PAGE_IS_WRITABLE);
+ /* Replace the ret by a nop */
+ *(PCHAR)RtlPrefetchMemoryNonTemporal = 0x90;
+ MmSetPageProtect(NULL, (PVOID)RtlPrefetchMemoryNonTemporal,
Protect);
+ }
}
VOID
@@ -523,13 +534,6 @@
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 */
- /* FIXME - *(PCHAR)RtlPrefetchMemoryNonTemporal = 0x90; */
- }
-
/* Does the CPU Support Fast System Call? */
if (Pcr->PrcbData.FeatureBits & X86_FEATURE_SYSCALL) {
Show replies by date