--- a/ntoskrnl/mm/ARM3/zeropage.c +++ b/ntoskrnl/mm/ARM3/zeropage.c @@ -43,6 +43,9 @@ MmZeroPageThread(VOID) PVOID ZeroAddress; PFN_NUMBER PageIndex, FreePage; PMMPFN Pfn1; + LARGE_INTEGER StartCounter, EndCounter, Frequency; + ULONG PageCount; + KFLOATING_SAVE FloatingSave; /* Get the discardable sections to free them */ MiFindInitializationCode(&StartAddress, &EndAddress); @@ -67,9 +70,15 @@ MmZeroPageThread(VOID) FALSE, NULL, NULL); + + KeEnterGuardedRegion(); + KeSaveFloatingPointState(&FloatingSave); + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); MmZeroingPageThreadActive = TRUE; + PageCount = 0; + StartCounter = KeQueryPerformanceCounter(NULL); while (TRUE) { if (!MmFreePageListHead.Total) @@ -101,13 +110,36 @@ MmZeroPageThread(VOID) ZeroAddress = MiMapPagesInZeroSpace(Pfn1, 1); ASSERT(ZeroAddress); - RtlZeroMemory(ZeroAddress, PAGE_SIZE); + //RtlZeroMemory(ZeroAddress, PAGE_SIZE); + __asm + { + mov edi, ZeroAddress + mov ecx, 256 + pxor xmm0, xmm0 + l: + movntdq [edi], xmm0 + add edi, 10h + dec ecx + jnz l + } MiUnmapPagesInZeroSpace(ZeroAddress, 1); + PageCount++; OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); MiInsertPageInList(&MmZeroedPageListHead, PageIndex); } + if (PageCount > 16) + { + EndCounter = KeQueryPerformanceCounter(&Frequency); + EndCounter.QuadPart -= StartCounter.QuadPart; + EndCounter.QuadPart *= 1000000000; + EndCounter.QuadPart /= Frequency.QuadPart; + DPRINT1("Zeroed %lu pages (%lu MB) in %I64u ns @ %I64u ns/page (total)\n", PageCount, PageCount / (1024 * 1024 / PAGE_SIZE), EndCounter.QuadPart, EndCounter.QuadPart / PageCount); + } + + KeRestoreFloatingPointState(&FloatingSave); + KeLeaveGuardedRegion(); } }