diff --git a/reactos/lib/rtl/i386/rtlmem.s b/reactos/lib/rtl/i386/rtlmem.s index c5340b00fb8..639ac7009eb 100644 --- a/reactos/lib/rtl/i386/rtlmem.s +++ b/reactos/lib/rtl/i386/rtlmem.s @@ -16,7 +16,6 @@ PUBLIC _RtlFillMemory@12 PUBLIC _RtlFillMemoryUlong@12 PUBLIC _RtlMoveMemory@12 PUBLIC _RtlZeroMemory@8 -PUBLIC @RtlPrefetchMemoryNonTemporal@8 /* FUNCTIONS *****************************************************************/ .code @@ -328,35 +327,4 @@ _RtlMoveMemory@12: dec edi jmp .CopyDownBytes - - -@RtlPrefetchMemoryNonTemporal@8: - - /* - * Overwritten by ntoskrnl/ke/i386/kernel.c if SSE is supported - * (see Ki386SetProcessorFeatures()) - */ - ret - - /* Get granularity */ - mov eax, [_Ke386CacheAlignment] - -FetchLine: - - /* Prefetch this line */ - prefetchnta byte ptr [ecx] - - /* Update address and count */ - add ecx, eax - sub edx, eax - - /* Keep looping for the next line, or return if done */ - ja FetchLine - ret - - -/* FIXME: HACK */ -_Ke386CacheAlignment: - .long 64 - END diff --git a/reactos/ntoskrnl/include/internal/amd64/ke.h b/reactos/ntoskrnl/include/internal/amd64/ke.h index b01e9940899..1701fe60fb2 100644 --- a/reactos/ntoskrnl/include/internal/amd64/ke.h +++ b/reactos/ntoskrnl/include/internal/amd64/ke.h @@ -81,7 +81,6 @@ typedef struct _KI_INTERRUPT_DISPATCH_ENTRY } KI_INTERRUPT_DISPATCH_ENTRY, *PKI_INTERRUPT_DISPATCH_ENTRY; #include -extern ULONG Ke386CacheAlignment; extern ULONG KeI386NpxPresent; extern ULONG KeI386XMMIPresent; extern ULONG KeI386FxsrPresent; diff --git a/reactos/ntoskrnl/include/internal/i386/ke.h b/reactos/ntoskrnl/include/internal/i386/ke.h index a610734a611..4dbdb2d5891 100644 --- a/reactos/ntoskrnl/include/internal/i386/ke.h +++ b/reactos/ntoskrnl/include/internal/i386/ke.h @@ -529,7 +529,6 @@ extern ULONG KeI386FxsrPresent; extern ULONG KiMXCsrMask; extern ULONG KeI386CpuType; extern ULONG KeI386CpuStep; -extern ULONG Ke386CacheAlignment; extern ULONG KiFastSystemCallDisable; extern UCHAR KiDebugRegisterTrapOffsets[9]; extern UCHAR KiDebugRegisterContextOffsets[9]; diff --git a/reactos/ntoskrnl/ke/i386/kiinit.c b/reactos/ntoskrnl/ke/i386/kiinit.c index d9c22cf2178..fe8c4a51157 100644 --- a/reactos/ntoskrnl/ke/i386/kiinit.c +++ b/reactos/ntoskrnl/ke/i386/kiinit.c @@ -162,7 +162,7 @@ KiInitMachineDependent(VOID) /* FIXME: Implement and enable XMM Page Zeroing for Mm */ /* Patch the RtlPrefetchMemoryNonTemporal routine to enable it */ - *(PCHAR)RtlPrefetchMemoryNonTemporal = 0x90; + *(PCHAR)RtlPrefetchMemoryNonTemporal = 0x90; // NOP } } diff --git a/reactos/ntoskrnl/rtl/i386/stack.S b/reactos/ntoskrnl/rtl/i386/stack.S index 7fbb6e0106a..05fb981def3 100644 --- a/reactos/ntoskrnl/rtl/i386/stack.S +++ b/reactos/ntoskrnl/rtl/i386/stack.S @@ -11,6 +11,8 @@ #include #include +EXTERN _KePrefetchNTAGranularity:DWORD + /* FUNCTIONS *****************************************************************/ .code @@ -35,4 +37,30 @@ _RtlpGetStackLimits@8: /* return */ ret 8 + +PUBLIC @RtlPrefetchMemoryNonTemporal@8 +@RtlPrefetchMemoryNonTemporal@8: + + /* + * Kernel will overwrite this to 'nop' during init + * if prefetchnta is available. Slight optimization + * as compared to checking KeI386XMMIPresent for every call. + */ + ret + + /* Get granularity */ + mov eax, [_KePrefetchNTAGranularity] + + /* Prefetch this line */ +FetchLine: + prefetchnta byte ptr [ecx] + + /* Update address and count */ + add ecx, eax + sub edx, eax + + /* Keep looping for the next line, or return if done */ + ja FetchLine + ret + END