From eebbf23330f7955a8bd9339fb978e18e5141b9c1 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Tue, 1 Sep 2015 19:51:52 +0000 Subject: [PATCH] - Move misplaced RtlPrefetchMemoryNonTemporal from rtl into kernel where it belongs (it only exists as an export for use by drivers to safely try to use prefetchnta even if it may not be available). Use existing global KePrefetchNTAGranularity that is set to the correct value via cpuid instead of hardcoded "Ke386CacheAlignment". svn path=/trunk/; revision=68903 --- reactos/lib/rtl/i386/rtlmem.s | 32 -------------------- reactos/ntoskrnl/include/internal/amd64/ke.h | 1 - reactos/ntoskrnl/include/internal/i386/ke.h | 1 - reactos/ntoskrnl/ke/i386/kiinit.c | 2 +- reactos/ntoskrnl/rtl/i386/stack.S | 28 +++++++++++++++++ 5 files changed, 29 insertions(+), 35 deletions(-) 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 -- 2.17.1