[ros-diffs] [ros-arm-bringup] 41708: - Rewrite MmAllocateNonCachedMemory and MmFreeNonCachedMemory to use the new functionality present in ARM3. - These functions now use the MDL routines to allocate their physical memory, since the constraints and requirements are identical as for a non-cached MDL mapping. - As for the virtual address space, it is guaranteed once again by System PTEs! - If it's not getting old already, optimizations to the System PTE code will, yet again, yield improvements here as well. - This is the last large kernel-facing memory allocator that needed updating to use System PTEs instead. - Only the pool allocator remains (which, for nonpaged pool, also uses System PTEs, present in the nonpaged pool expansion VA). - That effort will take significantly longer.
ros-arm-bringup at svn.reactos.org
ros-arm-bringup at svn.reactos.org
Tue Jun 30 10:55:20 CEST 2009
- Previous message: [ros-diffs] [ros-arm-bringup] 41707: - Major rewrite of Memory Descriptor List (MDL) implementation (moving it towards using System PTEs). - MmCreateMdl, MmSizeOfMdl: No Change. - MmBuildMdlForNonPagedPool: Do not use MmGetPfnForProcess, just normal PMMPTE manipulation. - This seems to cause issues in certain scenarios, because in ReactOS, nonpaged pool, a resident and guaranteed resources, does not always have its PDEs mapped! - By calling MmGetPfnForProcess, this wound up in the annals of ReactOS mm code, which lazy-remapped the PDE. We detected this issue specifically in the cache manager, and fixed it there. It should not appear anywhere else. - MmAllocatePagesForMdl, MmAllocatePagesForMdlEx, MmFreePagesFromMdl: - The *Ex function is now implemented. - Allocating pages now uses MiAllocatePagesForMdl, which is based on the older MmAllocPagesSpecifyRange. - The code is cleaner, better commented, and better handles partial MDLs. - Cache flags are still ignored (so the Ex functionality isn't really there). - MmMapLockedPages, MmMapLockedPagesSpecifyCache, MmUnmapLockedPages: - These functions now use System PTEs for the mappings, instead of the hacked-up "MDL Mapping Space". - This frees up 256MB of Kernel Virtual Address Space. - Takes advantage of all System PTE functionality. - Once again, optimizations in the System PTE code will be felt here. - For user-space mappings however, the old code is still kept and used. - MiMapLockedPagesInUserSpace and MiUnMapLockedPagesInUserSpace are now in virtual.c and provide this. - MmProbeAndLockPages, MmUnlockPages: - The pages are actually probed now, in SEH. This did not seem to happen before (did someone misread the function's name?) - Probe for write is only done for write access to user pages (as documented). - We do not probe/check for write access for kernel requests (force Operation to be IoReadAccess). - Proper locking is used now: Address Space lock for user mappings, PFN lock for kernel mappings. - Faulting in pages (to make them available before locking) is now done outside the address space/PFN lock. - You don't want to be holding a spinlock/mutex while doing disk I/O! - For write/modify access, if the PTE is not writable, fail the request since the PTE protection overrides. - However, if the PTE is writable but also copy on write, then we'll fault the page in for write access, which is a legitimate operation for certain user-mode scenarios. - The old version always provided the CopyOnWrite behavior, even for non-CopyOnWrite pages! - Reference and lock every valid page that has a PFN entry (non-I/O Pages). - The older code did not seem to lock pages that had to be faulted in (weren't already valid). - Cleanup the cleanup code (no pun intended). Because we now mark the pages as locked early-on, and because of changes in MmUnlockPages, we can simply use MmUnlockPages in case of error, since it will be able to fully back-out and references/locks that we did. - Previous code attempted to do this on its own, in a pretty inconsistent manner, which would leave page leaks (both in references and lock count). - In MmUnlockPages, not as many changes, but we now: - Still make sure that an I/O Mapping MDL doesn't have valid PFN database pages (non-I/O). - An MDL can cover pages that are both I/O mapped and RAM mapped, so we have to unlock/dereference the latter instead of skipping them as the old code did. - Use the PFN lock when checking pages and unlocking/dereferencing them. - Overall, non-complete MDLs are now marked by having a -1 PFN, and the MDL code has been updated to early-break out of page-scanning loops and/or ignore such pages, which can happen in a sparse MDL. - Implementation has been tested on VMWare and QEMU for a variety of tasks and was found to be reliable and stable.
- Next message: [ros-diffs] [ros-arm-bringup] 41709: - Cleanup some debug-only debug prints. - Make the VA-range-printing debug prints match the same format as those in ReactOS Mm (MiDbgKernelLayout). - Add the appropriate number of spaces so that the layout appears continuous, even though it's coming from two source files. - This makes it easy to see the VA mappings at boot (but not all of them).
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Author: ros-arm-bringup
Date: Tue Jun 30 12:55:18 2009
New Revision: 41708
URL: http://svn.reactos.org/svn/reactos?rev=41708&view=rev
Log:
- Rewrite MmAllocateNonCachedMemory and MmFreeNonCachedMemory to use the new functionality present in ARM3.
- These functions now use the MDL routines to allocate their physical memory, since the constraints and requirements are identical as for a non-cached MDL mapping.
- As for the virtual address space, it is guaranteed once again by System PTEs!
- If it's not getting old already, optimizations to the System PTE code will, yet again, yield improvements here as well.
- This is the last large kernel-facing memory allocator that needed updating to use System PTEs instead.
- Only the pool allocator remains (which, for nonpaged pool, also uses System PTEs, present in the nonpaged pool expansion VA).
- That effort will take significantly longer.
Added:
trunk/reactos/ntoskrnl/mm/ARM3/ncache.c
- copied, changed from r41647, trunk/reactos/ntoskrnl/mm/ncache.c
Removed:
trunk/reactos/ntoskrnl/mm/ncache.c
Modified:
trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild
Copied: trunk/reactos/ntoskrnl/mm/ARM3/ncache.c (from r41647, trunk/reactos/ntoskrnl/mm/ncache.c)
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/ncache.c?p2=trunk/reactos/ntoskrnl/mm/ARM3/ncache.c&p1=trunk/reactos/ntoskrnl/mm/ncache.c&r1=41647&r2=41708&rev=41708&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ncache.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/ncache.c [iso-8859-1] Tue Jun 30 12:55:18 2009
@@ -1,128 +1,214 @@
/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: ntoskrnl/mm/ncache.c
- * PURPOSE: Manages non-cached memory
- *
- * PROGRAMMERS: David Welch (welch at cwcom.net)
+ * PROJECT: ReactOS Kernel
+ * LICENSE: BSD - See COPYING.ARM in the top level directory
+ * FILE: ntoskrnl/mm/ARM3/ncache.c
+ * PURPOSE: ARM Memory Manager Noncached Memory Allocator
+ * PROGRAMMERS: ReactOS Portable Systems Group
*/
-/* INCLUDES *****************************************************************/
+/* INCLUDES *******************************************************************/
#include <ntoskrnl.h>
#define NDEBUG
#include <debug.h>
-/* FUNCTIONS *****************************************************************/
-
-
-/**********************************************************************
- * NAME EXPORTED
- * MmAllocateNonCachedMemory at 4
- *
- * DESCRIPTION
- * Allocates a virtual address range of noncached and cache
- * aligned memory.
- *
- * ARGUMENTS
- * NumberOfBytes
- * Size of region to allocate.
- *
- * RETURN VALUE
- * The base address of the range on success;
- * NULL on failure.
- *
- * NOTE
- * Description taken from include/ddk/mmfuncs.h.
- * Code taken from ntoskrnl/mm/special.c.
- *
- * REVISIONS
- *
+#line 15 "ARM³::NCACHE"
+#define MODULE_INVOLVED_IN_ARM3
+#include "../ARM3/miarm.h"
+
+/* GLOBALS ********************************************************************/
+
+/*
* @implemented
*/
-PVOID NTAPI
+PVOID
+NTAPI
MmAllocateNonCachedMemory(IN ULONG NumberOfBytes)
{
- PVOID Result;
- MEMORY_AREA* marea;
- NTSTATUS Status;
- ULONG Protect = PAGE_READWRITE|PAGE_SYSTEM|PAGE_NOCACHE|PAGE_WRITETHROUGH;
- PHYSICAL_ADDRESS BoundaryAddressMultiple;
-
- BoundaryAddressMultiple.QuadPart = 0;
- MmLockAddressSpace(MmGetKernelAddressSpace());
- Result = NULL;
- Status = MmCreateMemoryArea (MmGetKernelAddressSpace(),
- MEMORY_AREA_NO_CACHE,
- &Result,
+ PFN_NUMBER PageCount, MdlPageCount, PageFrameIndex;
+ PHYSICAL_ADDRESS LowAddress, HighAddress, SkipBytes;
+ MI_PFN_CACHE_ATTRIBUTE CacheAttribute;
+ PMDL Mdl;
+ PVOID BaseAddress;
+ PPFN_NUMBER MdlPages;
+ PMMPTE PointerPte;
+ MMPTE TempPte;
+
+ //
+ // Get the page count
+ //
+ ASSERT(NumberOfBytes != 0);
+ PageCount = BYTES_TO_PAGES(NumberOfBytes);
+
+ //
+ // Use the MDL allocator for simplicity, so setup the parameters
+ //
+ LowAddress.QuadPart = 0;
+ HighAddress.QuadPart = -1;
+ SkipBytes.QuadPart = 0;
+ CacheAttribute = MiPlatformCacheAttributes[0][MmNonCached];
+
+ //
+ // Now call the MDL allocator
+ //
+ Mdl = MiAllocatePagesForMdl(LowAddress,
+ HighAddress,
+ SkipBytes,
NumberOfBytes,
- Protect,
- &marea,
- FALSE,
- 0,
- BoundaryAddressMultiple);
- MmUnlockAddressSpace(MmGetKernelAddressSpace());
-
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Allocating marea for noncached mem failed with Status "
- "0x%08X\n", Status);
- return (NULL);
- }
-
- /* Create a virtual mapping for this memory area */
- MmMapMemoryArea(Result, NumberOfBytes, MC_NPPOOL, Protect);
-
- return ((PVOID)Result);
+ CacheAttribute,
+ 0);
+ if (!Mdl) return NULL;
+
+ //
+ // Get the MDL VA and check how many pages we got (could be partial)
+ //
+ BaseAddress = (PVOID)((ULONG_PTR)Mdl->StartVa + Mdl->ByteOffset);
+ MdlPageCount = ADDRESS_AND_SIZE_TO_SPAN_PAGES(BaseAddress, Mdl->ByteCount);
+ if (PageCount != MdlPageCount)
+ {
+ //
+ // Unlike MDLs, partial isn't okay for a noncached allocation, so fail
+ //
+ ASSERT(PageCount > MdlPageCount);
+ MmFreePagesFromMdl(Mdl);
+ ExFreePool(Mdl);
+ return NULL;
+ }
+
+ //
+ // Allocate system PTEs for the base address
+ // We use an extra page to store the actual MDL pointer for the free later
+ //
+ PointerPte = MiReserveSystemPtes(PageCount + 1, SystemPteSpace);
+ if (!PointerPte)
+ {
+ //
+ // Out of memory...
+ //
+ MmFreePagesFromMdl(Mdl);
+ ExFreePool(Mdl);
+ return NULL;
+ }
+
+ //
+ // Store the MDL pointer
+ //
+ *(PMDL*)PointerPte++ = Mdl;
+
+ //
+ // Okay, now see what range we got
+ //
+ BaseAddress = MiPteToAddress(PointerPte);
+
+ //
+ // This is our array of pages
+ //
+ MdlPages = (PPFN_NUMBER)(Mdl + 1);
+
+ //
+ // Setup the template PTE
+ //
+ TempPte = HyperTemplatePte;
+
+ //
+ // Now check what kind of caching we should use
+ //
+ switch (CacheAttribute)
+ {
+ case MiNonCached:
+
+ //
+ // Disable caching
+ //
+ TempPte.u.Hard.CacheDisable = 1;
+ TempPte.u.Hard.WriteThrough = 1;
+ break;
+
+ case MiWriteCombined:
+
+ //
+ // Enable write combining
+ //
+ TempPte.u.Hard.CacheDisable = 1;
+ TempPte.u.Hard.WriteThrough = 0;
+ break;
+
+ default:
+ //
+ // Nothing to do
+ //
+ break;
+ }
+
+ //
+ // Now loop the MDL pages
+ //
+ do
+ {
+ //
+ // Get the PFN
+ //
+ PageFrameIndex = *MdlPages++;
+
+ //
+ // Set the PFN in the page and write it
+ //
+ TempPte.u.Hard.PageFrameNumber = PageFrameIndex;
+ ASSERT(PointerPte->u.Hard.Valid == 0);
+ ASSERT(TempPte.u.Hard.Valid == 1);
+ *PointerPte++ = TempPte;
+ } while (--PageCount);
+
+ //
+ // Return the base address
+ //
+ return BaseAddress;
+
}
-static VOID
-MmFreeNonCachedPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address,
- PFN_TYPE Page, SWAPENTRY SwapEntry,
- BOOLEAN Dirty)
-{
- ASSERT(SwapEntry == 0);
- if (Page != 0)
- {
- MmReleasePageMemoryConsumer(MC_NPPOOL, Page);
- }
-}
-
-/**********************************************************************
- * NAME EXPORTED
- * MmFreeNonCachedMemory at 8
- *
- * DESCRIPTION
- * Releases a range of noncached memory allocated with
- * MmAllocateNonCachedMemory.
- *
- * ARGUMENTS
- * BaseAddress
- * Virtual address to be freed;
- *
- * NumberOfBytes
- * Size of the region to be freed.
- *
- * RETURN VALUE
- * None.
- *
- * NOTE
- * Description taken from include/ddk/mmfuncs.h.
- * Code taken from ntoskrnl/mm/special.c.
- *
- * REVISIONS
- *
+/*
* @implemented
*/
-VOID NTAPI MmFreeNonCachedMemory (IN PVOID BaseAddress,
- IN ULONG NumberOfBytes)
+VOID
+NTAPI
+MmFreeNonCachedMemory(IN PVOID BaseAddress,
+ IN ULONG NumberOfBytes)
{
- MmLockAddressSpace(MmGetKernelAddressSpace());
- MmFreeMemoryAreaByPtr(MmGetKernelAddressSpace(),
- BaseAddress,
- MmFreeNonCachedPage,
- NULL);
- MmUnlockAddressSpace(MmGetKernelAddressSpace());
+ PMDL Mdl;
+ PMMPTE PointerPte;
+ PFN_NUMBER PageCount;
+
+ //
+ // Sanity checks
+ //
+ ASSERT(NumberOfBytes != 0);
+ ASSERT(PAGE_ALIGN(BaseAddress) == BaseAddress);
+
+ //
+ // Get the page count
+ //
+ PageCount = BYTES_TO_PAGES(NumberOfBytes);
+
+ //
+ // Get the first PTE
+ //
+ PointerPte = MiAddressToPte(BaseAddress);
+
+ //
+ // Remember this is where we store the shadow MDL pointer
+ //
+ Mdl = *(PMDL*)(--PointerPte);
+
+ //
+ // Kill the MDL (and underlying pages)
+ //
+ MmFreePagesFromMdl(Mdl);
+ ExFreePool(Mdl);
+
+ //
+ // Now free the system PTEs for the underlying VA
+ //
+ MiReleaseSystemPtes(PointerPte, PageCount + 1, SystemPteSpace);
}
/* EOF */
Removed: trunk/reactos/ntoskrnl/mm/ncache.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ncache.c?rev=41707&view=auto
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ncache.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ncache.c (removed)
@@ -1,128 +1,0 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: ntoskrnl/mm/ncache.c
- * PURPOSE: Manages non-cached memory
- *
- * PROGRAMMERS: David Welch (welch at cwcom.net)
- */
-
-/* INCLUDES *****************************************************************/
-
-#include <ntoskrnl.h>
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS *****************************************************************/
-
-
-/**********************************************************************
- * NAME EXPORTED
- * MmAllocateNonCachedMemory at 4
- *
- * DESCRIPTION
- * Allocates a virtual address range of noncached and cache
- * aligned memory.
- *
- * ARGUMENTS
- * NumberOfBytes
- * Size of region to allocate.
- *
- * RETURN VALUE
- * The base address of the range on success;
- * NULL on failure.
- *
- * NOTE
- * Description taken from include/ddk/mmfuncs.h.
- * Code taken from ntoskrnl/mm/special.c.
- *
- * REVISIONS
- *
- * @implemented
- */
-PVOID NTAPI
-MmAllocateNonCachedMemory(IN ULONG NumberOfBytes)
-{
- PVOID Result;
- MEMORY_AREA* marea;
- NTSTATUS Status;
- ULONG Protect = PAGE_READWRITE|PAGE_SYSTEM|PAGE_NOCACHE|PAGE_WRITETHROUGH;
- PHYSICAL_ADDRESS BoundaryAddressMultiple;
-
- BoundaryAddressMultiple.QuadPart = 0;
- MmLockAddressSpace(MmGetKernelAddressSpace());
- Result = NULL;
- Status = MmCreateMemoryArea (MmGetKernelAddressSpace(),
- MEMORY_AREA_NO_CACHE,
- &Result,
- NumberOfBytes,
- Protect,
- &marea,
- FALSE,
- 0,
- BoundaryAddressMultiple);
- MmUnlockAddressSpace(MmGetKernelAddressSpace());
-
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Allocating marea for noncached mem failed with Status "
- "0x%08X\n", Status);
- return (NULL);
- }
-
- /* Create a virtual mapping for this memory area */
- MmMapMemoryArea(Result, NumberOfBytes, MC_NPPOOL, Protect);
-
- return ((PVOID)Result);
-}
-
-static VOID
-MmFreeNonCachedPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address,
- PFN_TYPE Page, SWAPENTRY SwapEntry,
- BOOLEAN Dirty)
-{
- ASSERT(SwapEntry == 0);
- if (Page != 0)
- {
- MmReleasePageMemoryConsumer(MC_NPPOOL, Page);
- }
-}
-
-/**********************************************************************
- * NAME EXPORTED
- * MmFreeNonCachedMemory at 8
- *
- * DESCRIPTION
- * Releases a range of noncached memory allocated with
- * MmAllocateNonCachedMemory.
- *
- * ARGUMENTS
- * BaseAddress
- * Virtual address to be freed;
- *
- * NumberOfBytes
- * Size of the region to be freed.
- *
- * RETURN VALUE
- * None.
- *
- * NOTE
- * Description taken from include/ddk/mmfuncs.h.
- * Code taken from ntoskrnl/mm/special.c.
- *
- * REVISIONS
- *
- * @implemented
- */
-VOID NTAPI MmFreeNonCachedMemory (IN PVOID BaseAddress,
- IN ULONG NumberOfBytes)
-{
- MmLockAddressSpace(MmGetKernelAddressSpace());
- MmFreeMemoryAreaByPtr(MmGetKernelAddressSpace(),
- BaseAddress,
- MmFreeNonCachedPage,
- NULL);
- MmUnlockAddressSpace(MmGetKernelAddressSpace());
-}
-
-/* EOF */
Modified: trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild?rev=41708&r1=41707&r2=41708&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild [iso-8859-1] Tue Jun 30 12:55:18 2009
@@ -367,6 +367,7 @@
<file>init.c</file>
<file>iosup.c</file>
<file>mdlsup.c</file>
+ <file>ncache.c</file>
<file>pool.c</file>
<file>procsup.c</file>
<file>syspte.c</file>
@@ -380,7 +381,6 @@
<file>mmsup.c</file>
<file>mminit.c</file>
<file>mpw.c</file>
- <file>ncache.c</file>
<file>npool.c</file>
<file>pagefile.c</file>
<file>pageop.c</file>
- Previous message: [ros-diffs] [ros-arm-bringup] 41707: - Major rewrite of Memory Descriptor List (MDL) implementation (moving it towards using System PTEs). - MmCreateMdl, MmSizeOfMdl: No Change. - MmBuildMdlForNonPagedPool: Do not use MmGetPfnForProcess, just normal PMMPTE manipulation. - This seems to cause issues in certain scenarios, because in ReactOS, nonpaged pool, a resident and guaranteed resources, does not always have its PDEs mapped! - By calling MmGetPfnForProcess, this wound up in the annals of ReactOS mm code, which lazy-remapped the PDE. We detected this issue specifically in the cache manager, and fixed it there. It should not appear anywhere else. - MmAllocatePagesForMdl, MmAllocatePagesForMdlEx, MmFreePagesFromMdl: - The *Ex function is now implemented. - Allocating pages now uses MiAllocatePagesForMdl, which is based on the older MmAllocPagesSpecifyRange. - The code is cleaner, better commented, and better handles partial MDLs. - Cache flags are still ignored (so the Ex functionality isn't really there). - MmMapLockedPages, MmMapLockedPagesSpecifyCache, MmUnmapLockedPages: - These functions now use System PTEs for the mappings, instead of the hacked-up "MDL Mapping Space". - This frees up 256MB of Kernel Virtual Address Space. - Takes advantage of all System PTE functionality. - Once again, optimizations in the System PTE code will be felt here. - For user-space mappings however, the old code is still kept and used. - MiMapLockedPagesInUserSpace and MiUnMapLockedPagesInUserSpace are now in virtual.c and provide this. - MmProbeAndLockPages, MmUnlockPages: - The pages are actually probed now, in SEH. This did not seem to happen before (did someone misread the function's name?) - Probe for write is only done for write access to user pages (as documented). - We do not probe/check for write access for kernel requests (force Operation to be IoReadAccess). - Proper locking is used now: Address Space lock for user mappings, PFN lock for kernel mappings. - Faulting in pages (to make them available before locking) is now done outside the address space/PFN lock. - You don't want to be holding a spinlock/mutex while doing disk I/O! - For write/modify access, if the PTE is not writable, fail the request since the PTE protection overrides. - However, if the PTE is writable but also copy on write, then we'll fault the page in for write access, which is a legitimate operation for certain user-mode scenarios. - The old version always provided the CopyOnWrite behavior, even for non-CopyOnWrite pages! - Reference and lock every valid page that has a PFN entry (non-I/O Pages). - The older code did not seem to lock pages that had to be faulted in (weren't already valid). - Cleanup the cleanup code (no pun intended). Because we now mark the pages as locked early-on, and because of changes in MmUnlockPages, we can simply use MmUnlockPages in case of error, since it will be able to fully back-out and references/locks that we did. - Previous code attempted to do this on its own, in a pretty inconsistent manner, which would leave page leaks (both in references and lock count). - In MmUnlockPages, not as many changes, but we now: - Still make sure that an I/O Mapping MDL doesn't have valid PFN database pages (non-I/O). - An MDL can cover pages that are both I/O mapped and RAM mapped, so we have to unlock/dereference the latter instead of skipping them as the old code did. - Use the PFN lock when checking pages and unlocking/dereferencing them. - Overall, non-complete MDLs are now marked by having a -1 PFN, and the MDL code has been updated to early-break out of page-scanning loops and/or ignore such pages, which can happen in a sparse MDL. - Implementation has been tested on VMWare and QEMU for a variety of tasks and was found to be reliable and stable.
- Next message: [ros-diffs] [ros-arm-bringup] 41709: - Cleanup some debug-only debug prints. - Make the VA-range-printing debug prints match the same format as those in ReactOS Mm (MiDbgKernelLayout). - Add the appropriate number of spaces so that the layout appears continuous, even though it's coming from two source files. - This makes it easy to see the VA mappings at boot (but not all of them).
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Ros-diffs
mailing list