Initial implementaions of MmAllocateContiguousMemorySpecifyCache() and MmFreeContiguo...
authorJason Filby <jason.filby@gmail.com>
Wed, 31 Dec 2003 05:33:04 +0000 (05:33 +0000)
committerJason Filby <jason.filby@gmail.com>
Wed, 31 Dec 2003 05:33:04 +0000 (05:33 +0000)
svn path=/trunk/; revision=7360

20 files changed:
reactos/hal/halx86/adapter.c
reactos/include/ddk/mmfuncs.h
reactos/include/ddk/mmtypes.h
reactos/include/ntos/mm.h
reactos/ntoskrnl/cc/view.c
reactos/ntoskrnl/include/internal/mm.h
reactos/ntoskrnl/ke/kthread.c
reactos/ntoskrnl/mm/anonmem.c
reactos/ntoskrnl/mm/cont.c
reactos/ntoskrnl/mm/freelist.c
reactos/ntoskrnl/mm/iospace.c
reactos/ntoskrnl/mm/marea.c
reactos/ntoskrnl/mm/mdl.c
reactos/ntoskrnl/mm/mminit.c
reactos/ntoskrnl/mm/ncache.c
reactos/ntoskrnl/mm/section.c
reactos/ntoskrnl/ntoskrnl.def
reactos/ntoskrnl/ntoskrnl.edf
reactos/ntoskrnl/ps/process.c
reactos/ntoskrnl/ps/w32call.c

index b989635..581d1e2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: adapter.c,v 1.9 2003/12/28 22:38:09 fireball Exp $
+/* $Id: adapter.c,v 1.10 2003/12/31 05:33:03 jfilby Exp $
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
@@ -49,7 +49,9 @@ HalAllocateAdapterChannel(
  *     - there are many unhandled cases
  */
 {
+  LARGE_INTEGER MinAddress;
   LARGE_INTEGER MaxAddress;
+  LARGE_INTEGER BoundryAddressMultiple;
   IO_ALLOCATION_ACTION Retval;
   
   assert(KeGetCurrentIrql() == DISPATCH_LEVEL);
@@ -68,7 +70,9 @@ HalAllocateAdapterChannel(
     return STATUS_SUCCESS;
 
   /* 24-bit max address due to 16-bit dma controllers */
+  MinAddress.QuadPart = 0x0000000;
   MaxAddress.QuadPart = 0x1000000;
+  BoundryAddressMultiple.QuadPart = 0;
 
   /* why 64K alignment? */
   /*
@@ -77,7 +81,12 @@ HalAllocateAdapterChannel(
    * that.  This can be optimized.
    */
   AdapterObject->MapRegisterBase = MmAllocateContiguousAlignedMemory( 
-      NumberOfMapRegisters * PAGE_SIZE, MaxAddress, 0x10000 );
+      NumberOfMapRegisters * PAGE_SIZE,
+      MinAddress,
+      MaxAddress,
+      BoundryAddressMultiple,
+      MmCached,
+      0x10000 );
 
   if(!AdapterObject->MapRegisterBase)
     return STATUS_INSUFFICIENT_RESOURCES;
@@ -188,6 +197,8 @@ IoFreeAdapterChannel (PADAPTER_OBJECT       AdapterObject)
  */
 {
   LARGE_INTEGER MaxAddress;
+  LARGE_INTEGER MinAddress;
+  LARGE_INTEGER BoundryAddressMultiple;
   PWAIT_CONTEXT_BLOCK WaitContextBlock;
   IO_ALLOCATION_ACTION Retval;
 
@@ -206,10 +217,17 @@ IoFreeAdapterChannel (PADAPTER_OBJECT     AdapterObject)
        */
 
       /* 24-bit max address due to 16-bit dma controllers */
+      MinAddress.QuadPart = 0x0000000;
       MaxAddress.QuadPart = 0x1000000;
+      BoundryAddressMultiple.QuadPart = 0;
 
       AdapterObject->MapRegisterBase = MmAllocateContiguousAlignedMemory( 
-          WaitContextBlock->NumberOfMapRegisters * PAGE_SIZE, MaxAddress, 0x10000 );
+          WaitContextBlock->NumberOfMapRegisters * PAGE_SIZE,
+          MinAddress,
+          MaxAddress,
+          BoundryAddressMultiple,
+          MmCached,
+          0x10000 );
 
       if(!AdapterObject->MapRegisterBase)
         return;
index 1d3cfe7..44f6930 100644 (file)
@@ -1,6 +1,6 @@
 #ifndef _INCLUDE_DDK_MMFUNCS_H
 #define _INCLUDE_DDK_MMFUNCS_H
-/* $Id: mmfuncs.h,v 1.18 2003/11/18 05:11:41 royce Exp $ */
+/* $Id: mmfuncs.h,v 1.19 2003/12/31 05:33:03 jfilby Exp $ */
 /* MEMORY MANAGMENT ******************************************************/
 
 
@@ -72,10 +72,21 @@ MmAllocateContiguousMemory (
        IN      PHYSICAL_ADDRESS        HighestAcceptableAddress
        );
 
+PVOID STDCALL 
+MmAllocateContiguousMemorySpecifyCache (IN ULONG NumberOfBytes,
+                IN PHYSICAL_ADDRESS LowestAcceptableAddress,
+                           IN PHYSICAL_ADDRESS HighestAcceptableAddress,
+                           IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
+                           IN MEMORY_CACHING_TYPE CacheType
+                           );
+
 PVOID STDCALL
 MmAllocateContiguousAlignedMemory(IN ULONG NumberOfBytes,
+                                         IN PHYSICAL_ADDRESS LowestAcceptableAddress,
                                  IN PHYSICAL_ADDRESS HighestAcceptableAddress,
-                                 IN ULONG Alignment);
+                                 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
+                                 IN MEMORY_CACHING_TYPE CacheType OPTIONAL,
+                                         IN ULONG Alignment);
 
 PVOID
 STDCALL
@@ -158,6 +169,12 @@ MmFreeContiguousMemory (
        );
 VOID
 STDCALL
+MmFreeContiguousMemorySpecifyCache(IN PVOID BaseAddress,
+                               IN ULONG NumberOfBytes,
+                           IN MEMORY_CACHING_TYPE CacheType
+                           );
+VOID
+STDCALL
 MmFreeNonCachedMemory (
        IN      PVOID   BaseAddress,
        IN      ULONG   NumberOfBytes
index b2d03ae..d403ca7 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmtypes.h,v 1.17 2003/11/03 20:27:51 gdalsnes Exp $ */
+/* $Id: mmtypes.h,v 1.18 2003/12/31 05:33:03 jfilby Exp $ */
 
 #ifndef _INCLUDE_DDK_MMTYPES_H
 #define _INCLUDE_DDK_MMTYPES_H
@@ -76,11 +76,15 @@ typedef enum _MMFLUSH_TYPE
        MmFlushForWrite
 } MMFLUSH_TYPE;
 
+typedef enum _MEMORY_CACHING_TYPE_ORIG {
+    MmFrameBufferCached = 2
+} MEMORY_CACHING_TYPE_ORIG;
+
 typedef enum _MEMORY_CACHING_TYPE
 {
        MmNonCached = FALSE,
        MmCached = TRUE,
-       MmFrameBufferCached,
+       MmWriteCombined = MmFrameBufferCached,
        MmHardwareCoherentCached,
        MmMaximumCacheType
 } MEMORY_CACHING_TYPE;
index 2c97e14..77f7970 100644 (file)
@@ -22,6 +22,7 @@
 #define SEC_RESERVE     (0x04000000)
 #define SEC_COMMIT      (0x08000000)
 #define SEC_NOCACHE     (0x10000000)
+#define PAGE_NOACCESS  (1)
 #define PAGE_READONLY  (2)
 #define PAGE_READWRITE (4)
 #define PAGE_WRITECOPY (8)
@@ -30,8 +31,8 @@
 #define PAGE_EXECUTE_READWRITE (64)
 #define PAGE_EXECUTE_WRITECOPY (128)
 #define PAGE_GUARD     (256)
-#define PAGE_NOACCESS  (1)
 #define PAGE_NOCACHE   (512)
+#define PAGE_WRITECOMBINE      (1024)
 #define MEM_COMMIT     (4096)
 #define MEM_FREE       (65536)
 #define MEM_RESERVE    (8192)
index 512c205..c9ba56f 100644 (file)
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: view.c,v 1.70 2003/12/30 18:52:03 fireball Exp $
+/* $Id: view.c,v 1.71 2003/12/31 05:33:03 jfilby Exp $
  *
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/cc/view.c
@@ -489,11 +489,13 @@ CcRosCreateCacheSegment(PBCB Bcb,
 #ifdef CACHE_BITMAP
   ULONG StartingOffset;
 #endif
-
+  PHYSICAL_ADDRESS BoundaryAddressMultiple;
+  
   assert(Bcb);
 
   DPRINT("CcRosCreateCacheSegment()\n");
 
+  BoundaryAddressMultiple.QuadPart = 0;
   if (FileOffset >= Bcb->FileSize.u.LowPart)
   {
      CacheSeg = NULL;
@@ -598,7 +600,8 @@ CcRosCreateCacheSegment(PBCB Bcb,
                              PAGE_READWRITE,
                              (PMEMORY_AREA*)&current->MemoryArea,
                              FALSE,
-                             FALSE);
+                             FALSE,
+                             BoundaryAddressMultiple);
   MmUnlockAddressSpace(MmGetKernelAddressSpace());
   if (!NT_SUCCESS(Status))
   {
@@ -1273,12 +1276,14 @@ CcInitView(VOID)
 #ifdef CACHE_BITMAP
   PMEMORY_AREA marea;
   PVOID Buffer;
+  PHYSICAL_ADDRESS BoundaryAddressMultiple;
 #endif
   NTSTATUS Status;
   KPRIORITY Priority;
-
+  
   DPRINT("CcInitView()\n");
 #ifdef CACHE_BITMAP
+  BoundaryAddressMultiple.QuadPart = 0;
   CiCacheSegMappingRegionHint = 0;
   CiCacheSegMappingRegionBase = NULL;
 
@@ -1292,7 +1297,8 @@ CcInitView(VOID)
                              0,
                              &marea,
                              FALSE,
-                             FALSE);
+                             FALSE,
+                             BoundaryAddressMultiple);
   MmUnlockAddressSpace(MmGetKernelAddressSpace());
   if (!NT_SUCCESS(Status))
     {
index c819c42..a21bf7e 100644 (file)
@@ -194,7 +194,8 @@ NTSTATUS MmCreateMemoryArea(struct _EPROCESS* Process,
                            ULONG Attributes,
                            MEMORY_AREA** Result,
                            BOOL FixedAddress,
-                           BOOL TopDown);
+                           BOOL TopDown,
+                           PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL);
 MEMORY_AREA* MmOpenMemoryAreaByAddress(PMADDRESS_SPACE AddressSpace, 
                                       PVOID Address);
 NTSTATUS MmInitMemoryAreas(VOID);
@@ -383,6 +384,7 @@ NTSTATUS
 MmCreatePhysicalMemorySection(VOID);
 PHYSICAL_ADDRESS
 MmGetContinuousPages(ULONG NumberOfBytes,
+                    PHYSICAL_ADDRESS LowestAcceptableAddress,
                     PHYSICAL_ADDRESS HighestAcceptableAddress,
                     ULONG Alignment);
 
index c718417..f28a4dd 100644 (file)
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: kthread.c,v 1.45 2003/12/30 18:52:04 fireball Exp $
+/* $Id: kthread.c,v 1.46 2003/12/31 05:33:03 jfilby Exp $
  *
  * FILE:            ntoskrnl/ke/kthread.c
  * PURPOSE:         Microkernel thread support
@@ -88,6 +88,9 @@ KeInitializeThread(PKPROCESS Process, PKTHREAD Thread, BOOLEAN First)
   extern unsigned int init_stack;
   PMEMORY_AREA StackArea;
   ULONG i;
+  PHYSICAL_ADDRESS BoundaryAddressMultiple;
+  
+  BoundaryAddressMultiple.QuadPart = 0;
   
   KeInitializeDispatcherHeader(&Thread->DispatcherHeader,
                               InternalThreadType,
@@ -107,7 +110,8 @@ KeInitializeThread(PKPROCESS Process, PKTHREAD Thread, BOOLEAN First)
                                  0,
                                  &StackArea,
                                  FALSE,
-                                 FALSE);
+                                 FALSE,
+                                 BoundaryAddressMultiple);
       MmUnlockAddressSpace(MmGetKernelAddressSpace());
       
       if (!NT_SUCCESS(Status))
index 526ea6c..ada600c 100644 (file)
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: anonmem.c,v 1.23 2003/12/30 18:52:05 fireball Exp $
+/* $Id: anonmem.c,v 1.24 2003/12/31 05:33:03 jfilby Exp $
  *
  * PROJECT:     ReactOS kernel
  * FILE:        ntoskrnl/mm/anonmem.c
@@ -548,6 +548,7 @@ NtAllocateVirtualMemory(IN  HANDLE  ProcessHandle,
    ULONG RegionSize;
    PVOID PBaseAddress;
    ULONG PRegionSize;
+   PHYSICAL_ADDRESS BoundaryAddressMultiple;
 
    DPRINT("NtAllocateVirtualMemory(*UBaseAddress %x, "
          "ZeroBits %d, *URegionSize %x, AllocationType %x, Protect %x)\n",
@@ -568,6 +569,7 @@ NtAllocateVirtualMemory(IN  HANDLE  ProcessHandle,
    
    PBaseAddress = *UBaseAddress;
    PRegionSize = *URegionSize;
+   BoundaryAddressMultiple.QuadPart = 0;
    
    BaseAddress = (PVOID)PAGE_ROUND_DOWN(PBaseAddress);
    RegionSize = PAGE_ROUND_UP(PBaseAddress + PRegionSize) -
@@ -627,7 +629,8 @@ NtAllocateVirtualMemory(IN  HANDLE  ProcessHandle,
                               Protect,
                               &MemoryArea,
                               PBaseAddress != 0,
-                              (AllocationType & MEM_TOP_DOWN));
+                              (AllocationType & MEM_TOP_DOWN),
+                              BoundaryAddressMultiple);
    if (!NT_SUCCESS(Status))
      {
        MmUnlockAddressSpace(AddressSpace);
index a0b804b..03493ce 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: cont.c,v 1.29 2003/12/30 18:52:05 fireball Exp $
+/* $Id: cont.c,v 1.30 2003/12/31 05:33:03 jfilby Exp $
  * 
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
@@ -33,15 +33,29 @@ MmFreeContinuousPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address,
 
 PVOID STDCALL
 MmAllocateContiguousAlignedMemory(IN ULONG NumberOfBytes,
-                                 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
-                                 IN ULONG Alignment)
+                IN PHYSICAL_ADDRESS LowestAcceptableAddress OPTIONAL,
+                           IN PHYSICAL_ADDRESS HighestAcceptableAddress,
+                           IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
+                           IN MEMORY_CACHING_TYPE CacheType OPTIONAL,
+                               IN ULONG Alignment)
 {
    PMEMORY_AREA MArea;
    NTSTATUS Status;
    PVOID BaseAddress = 0;
    PHYSICAL_ADDRESS PBase;
+   ULONG Attributes;
    ULONG i;
    
+   Attributes = PAGE_EXECUTE_READWRITE | PAGE_SYSTEM;
+   if (CacheType == MmNonCached || CacheType == MmWriteCombined)
+   {
+      Attributes |= PAGE_NOCACHE;
+   }
+   if (CacheType == MmWriteCombined)
+   {
+      Attributes |= PAGE_WRITECOMBINE;
+   }
+   
    MmLockAddressSpace(MmGetKernelAddressSpace());
    Status = MmCreateMemoryArea(NULL,
                               MmGetKernelAddressSpace(),
@@ -51,7 +65,8 @@ MmAllocateContiguousAlignedMemory(IN ULONG NumberOfBytes,
                               0,
                               &MArea,
                               FALSE,
-                              FALSE);
+                              FALSE,
+                              BoundaryAddressMultiple);
    MmUnlockAddressSpace(MmGetKernelAddressSpace());
 
    if (!NT_SUCCESS(Status))
@@ -60,6 +75,7 @@ MmAllocateContiguousAlignedMemory(IN ULONG NumberOfBytes,
      }
    DPRINT( "Base = %x\n", BaseAddress );
    PBase = MmGetContinuousPages(NumberOfBytes,
+                               LowestAcceptableAddress,
                                HighestAcceptableAddress,
                                Alignment);
 #if defined(__GNUC__)
@@ -85,7 +101,7 @@ MmAllocateContiguousAlignedMemory(IN ULONG NumberOfBytes,
 #endif
        MmCreateVirtualMapping(NULL,
                               (char*)BaseAddress + (i * 4096),
-                              PAGE_EXECUTE_READWRITE | PAGE_SYSTEM,
+                              Attributes,
 #if defined(__GNUC__)
                               (LARGE_INTEGER)(PBase.QuadPart + (i * 4096)),
 #else
@@ -127,8 +143,17 @@ PVOID STDCALL
 MmAllocateContiguousMemory (IN ULONG NumberOfBytes,
                            IN PHYSICAL_ADDRESS HighestAcceptableAddress)
 {
+  PHYSICAL_ADDRESS LowestAcceptableAddress;
+  PHYSICAL_ADDRESS BoundaryAddressMultiple;
+  
+  LowestAcceptableAddress.QuadPart = 0;
+  BoundaryAddressMultiple.QuadPart = 0;
+  
   return(MmAllocateContiguousAlignedMemory(NumberOfBytes,
+                                          LowestAcceptableAddress,
                                           HighestAcceptableAddress,
+                                          BoundaryAddressMultiple,
+                                          MmCached,
                                           PAGE_SIZE));
 }
 
@@ -168,4 +193,91 @@ MmFreeContiguousMemory(IN PVOID BaseAddress)
    MmUnlockAddressSpace(MmGetKernelAddressSpace());
 }
 
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     MmAllocateContiguousMemorySpecifyCache@32
+ *
+ * DESCRIPTION
+  *    Allocates a range of physically contiguous memory
+ *     with a cache parameter.
+ *     
+ * ARGUMENTS
+ *     NumberOfBytes
+ *             Size of the memory block to allocate;
+ *             
+ *     LowestAcceptableAddress
+ *             Lowest address valid for the caller.
+ *             
+ *     HighestAcceptableAddress
+ *             Highest address valid for the caller.
+ *             
+ *     BoundaryAddressMultiple
+ *             Address multiple not to be crossed by allocated buffer (optional).
+ *             
+ *     CacheType
+ *             Type of caching to use.
+ *             
+ * RETURN VALUE
+ *     The virtual address of the memory block on success;
+ *     NULL on error.
+ *
+ * REVISIONS
+ *
+ * @implemented
+ */
+PVOID STDCALL 
+MmAllocateContiguousMemorySpecifyCache (IN ULONG NumberOfBytes,
+                IN PHYSICAL_ADDRESS LowestAcceptableAddress,
+                           IN PHYSICAL_ADDRESS HighestAcceptableAddress,
+                           IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
+                           IN MEMORY_CACHING_TYPE CacheType)
+{
+  return(MmAllocateContiguousAlignedMemory(NumberOfBytes,
+                                           LowestAcceptableAddress,
+                                           HighestAcceptableAddress,
+                                           BoundaryAddressMultiple,
+                                           CacheType,
+                                           PAGE_SIZE));
+}
+
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     MmFreeContiguousMemorySpecifyCache@12
+ *
+ * DESCRIPTION
+ *     Releases a range of physically contiguous memory allocated
+ *     with MmAllocateContiguousMemorySpecifyCache.
+ *     
+ * ARGUMENTS
+ *     BaseAddress
+ *             Virtual address of the memory to be freed.
+ *
+ *     NumberOfBytes
+ *             Size of the memory block to free.
+ *             
+ *     CacheType
+ *             Type of caching used.
+ *             
+ * RETURN VALUE
+ *     None.
+ *
+ * REVISIONS
+ *
+ * @implemented
+ */
+VOID STDCALL 
+MmFreeContiguousMemorySpecifyCache(IN PVOID BaseAddress,
+                               IN ULONG NumberOfBytes,
+                           IN MEMORY_CACHING_TYPE CacheType)
+{
+   MmLockAddressSpace(MmGetKernelAddressSpace());
+   MmFreeMemoryArea(MmGetKernelAddressSpace(),
+                   BaseAddress,
+                   NumberOfBytes,
+                   MmFreeContinuousPage,
+                   NULL);
+   MmUnlockAddressSpace(MmGetKernelAddressSpace());
+}
+
+
 /* EOF */
index 3abc716..7f10f7e 100644 (file)
@@ -169,6 +169,7 @@ MmGetLRUNextUserPage(PHYSICAL_ADDRESS PreviousPhysicalAddress)
 
 PHYSICAL_ADDRESS
 MmGetContinuousPages(ULONG NumberOfBytes,
+                    PHYSICAL_ADDRESS LowestAcceptableAddress,
                     PHYSICAL_ADDRESS HighestAcceptableAddress,
                     ULONG Alignment)
 {
@@ -184,7 +185,7 @@ MmGetContinuousPages(ULONG NumberOfBytes,
    
    start = -1;
    length = 0;
-   for (i = 0; i < (HighestAcceptableAddress.QuadPart / PAGE_SIZE); )
+   for (i = (LowestAcceptableAddress.QuadPart / PAGE_SIZE); i < (HighestAcceptableAddress.QuadPart / PAGE_SIZE); )
      {
        if (MmPageArray[i].Flags.Type ==  MM_PHYSICAL_PAGE_FREE)
          {
index 3009877..562e752 100644 (file)
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: iospace.c,v 1.23 2003/12/30 18:52:05 fireball Exp $
+/* $Id: iospace.c,v 1.24 2003/12/31 05:33:04 jfilby Exp $
  *
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/mm/iospace.c
@@ -75,9 +75,11 @@ MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress,
    NTSTATUS Status;
    ULONG i;
    ULONG Attributes;
+   PHYSICAL_ADDRESS BoundaryAddressMultiple;
 
    DPRINT("MmMapIoSpace(%lx, %d, %d)\n", PhysicalAddress, NumberOfBytes, CacheEnable);
 
+   BoundaryAddressMultiple.QuadPart = 0;
    MmLockAddressSpace(MmGetKernelAddressSpace());
    Result = NULL;
    Status = MmCreateMemoryArea (NULL,
@@ -88,7 +90,8 @@ MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress,
                                0,
                                &marea,
                                FALSE,
-                               FALSE);
+                               FALSE,
+                               BoundaryAddressMultiple);
    MmUnlockAddressSpace(MmGetKernelAddressSpace());
 
    if (!NT_SUCCESS(Status))
index e42af29..e39c51a 100644 (file)
@@ -487,7 +487,8 @@ NTSTATUS MmCreateMemoryArea(PEPROCESS Process,
                            ULONG Attributes,
                            MEMORY_AREA** Result,
                            BOOL FixedAddress,
-                           BOOL TopDown)
+                           BOOL TopDown,
+                           PHYSICAL_ADDRESS BoundaryAddressMultiple)
 /*
  * FUNCTION: Create a memory area
  * ARGUMENTS:
@@ -501,6 +502,7 @@ NTSTATUS MmCreateMemoryArea(PEPROCESS Process,
  * NOTES: Lock the address space before calling this function
  */
 {
+   PVOID EndAddress;
    ULONG tmpLength;
    DPRINT("MmCreateMemoryArea(Type %d, BaseAddress %x,"
           "*BaseAddress %x, Length %x, Attributes %x, Result %x)\n",
@@ -543,6 +545,13 @@ NTSTATUS MmCreateMemoryArea(PEPROCESS Process,
          {
            return STATUS_ACCESS_VIOLATION;
          }
+
+   if (BoundaryAddressMultiple.QuadPart != 0)
+     {
+      EndAddress = *BaseAddress + tmpLength-1;
+      assert((*BaseAddress/BoundaryAddressMultiple) == (EndAddress/BoundaryAddressMultiple));
+     }
+
        if (MmOpenMemoryAreaByRegion(AddressSpace,
                                     *BaseAddress,
                                     tmpLength)!=NULL)
@@ -551,7 +560,7 @@ NTSTATUS MmCreateMemoryArea(PEPROCESS Process,
             return(STATUS_CONFLICTING_ADDRESSES);
          }
      }
-   
+
    *Result = ExAllocatePoolWithTag(NonPagedPool, sizeof(MEMORY_AREA),
                                   TAG_MAREA);
    RtlZeroMemory(*Result,sizeof(MEMORY_AREA));
index 6db8c53..26d042d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mdl.c,v 1.55 2003/12/30 18:52:05 fireball Exp $
+/* $Id: mdl.c,v 1.56 2003/12/31 05:33:04 jfilby Exp $
  *
  * COPYRIGHT:    See COPYING in the top level directory
  * PROJECT:      ReactOS kernel
@@ -39,7 +39,9 @@ MmInitializeMdlImplementation(VOID)
   MEMORY_AREA* Result;
   NTSTATUS Status;
   PVOID Buffer;
+  PHYSICAL_ADDRESS BoundaryAddressMultiple;
 
+  BoundaryAddressMultiple.QuadPart = 0;
   MiMdlMappingRegionHint = 0;
   MiMdlMappingRegionBase = NULL;
 
@@ -52,7 +54,8 @@ MmInitializeMdlImplementation(VOID)
                              0,
                              &Result,
                              FALSE,
-                             FALSE);
+                             FALSE,
+                             BoundaryAddressMultiple);
   if (!NT_SUCCESS(Status))
     {
       MmUnlockAddressSpace(MmGetKernelAddressSpace());
index 1fb3b7d..759bc0f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mminit.c,v 1.58 2003/12/30 18:52:05 fireball Exp $
+/* $Id: mminit.c,v 1.59 2003/12/31 05:33:04 jfilby Exp $
  *
  * COPYRIGHT:   See COPYING in the top directory
  * PROJECT:     ReactOS kernel 
@@ -105,10 +105,12 @@ MmInitVirtualMemory(ULONG LastKernelAddress,
    ULONG Length;
    ULONG ParamLength = KernelLength;
    NTSTATUS Status;
+   PHYSICAL_ADDRESS BoundaryAddressMultiple;
    //ULONG i;
    
    DPRINT("MmInitVirtualMemory(%x, %x)\n",LastKernelAddress, KernelLength);
    
+   BoundaryAddressMultiple.QuadPart = 0;
    LastKernelAddress = PAGE_ROUND_UP(LastKernelAddress);
 
    MmInitMemoryAreas();
@@ -139,7 +141,8 @@ MmInitVirtualMemory(ULONG LastKernelAddress,
                      0,
                      &kernel_map_desc,
                      FALSE,
-                     FALSE);
+                     FALSE,
+                     BoundaryAddressMultiple);
 
    BaseAddress = (PVOID)KPCR_BASE;
    MmCreateMemoryArea(NULL,
@@ -150,7 +153,8 @@ MmInitVirtualMemory(ULONG LastKernelAddress,
                      0,
                      &kernel_kpcr_desc,
                      FALSE,
-                     FALSE);
+                     FALSE,
+                     BoundaryAddressMultiple);
 
    BaseAddress = (PVOID)0xd0000000;
    MmCreateMemoryArea(NULL,
@@ -161,7 +165,8 @@ MmInitVirtualMemory(ULONG LastKernelAddress,
                      0,
                      &kernel_mapped_low_mem_desc,
                      FALSE,
-                     FALSE);
+                     FALSE,
+                     BoundaryAddressMultiple);
 
    BaseAddress = (PVOID)KERNEL_BASE;
    Length = PAGE_ROUND_UP(((ULONG)&_text_end__)) - KERNEL_BASE;
@@ -179,7 +184,8 @@ MmInitVirtualMemory(ULONG LastKernelAddress,
                      0,
                      &kernel_text_desc,
                      FALSE,
-                     FALSE);
+                     FALSE,
+                     BoundaryAddressMultiple);
 
    BaseAddress = (PVOID)PAGE_ROUND_UP(((ULONG)&_text_end__));
    assert (BaseAddress == (PVOID)&_init_start__);
@@ -195,7 +201,8 @@ MmInitVirtualMemory(ULONG LastKernelAddress,
                      0,
                      &kernel_init_desc,
                      FALSE,
-                     FALSE);
+                     FALSE,
+                     BoundaryAddressMultiple);
 
    Length = PAGE_ROUND_UP(((ULONG)&_bss_end__)) - 
             PAGE_ROUND_UP(((ULONG)&_init_end__));
@@ -216,7 +223,8 @@ MmInitVirtualMemory(ULONG LastKernelAddress,
                      0,
                      &kernel_data_desc,
                      FALSE,
-                     FALSE);
+                     FALSE,
+                     BoundaryAddressMultiple);
 
    BaseAddress = (PVOID)PAGE_ROUND_UP(((ULONG)&_bss_end__));
    Length = LastKernelAddress - (ULONG)BaseAddress;
@@ -228,7 +236,8 @@ MmInitVirtualMemory(ULONG LastKernelAddress,
                      0,
                      &kernel_param_desc,
                      FALSE,
-                     FALSE);
+                     FALSE,
+                     BoundaryAddressMultiple);
    
    BaseAddress = MiNonPagedPoolStart;
    MmCreateMemoryArea(NULL,
@@ -239,7 +248,8 @@ MmInitVirtualMemory(ULONG LastKernelAddress,
                      0,
                      &kernel_pool_desc,
                      FALSE,
-                     FALSE);
+                     FALSE,
+                     BoundaryAddressMultiple);
 
    BaseAddress = MiKernelMapStart;
    Status = MmCreateMemoryArea(NULL,
@@ -250,7 +260,8 @@ MmInitVirtualMemory(ULONG LastKernelAddress,
                      0,
                      &MiKernelMapDescriptor,
                      FALSE,
-                     FALSE);
+                     FALSE,
+                     BoundaryAddressMultiple);
    
    BaseAddress = MmPagedPoolBase;
    Status = MmCreateMemoryArea(NULL,
@@ -261,7 +272,8 @@ MmInitVirtualMemory(ULONG LastKernelAddress,
                      0,
                      &MiPagedPoolDescriptor,
                      FALSE,
-                     FALSE);
+                     FALSE,
+                     BoundaryAddressMultiple);
 
    MmInitializePagedPool();
 
@@ -278,7 +290,8 @@ MmInitVirtualMemory(ULONG LastKernelAddress,
                      0,
                      &kernel_shared_data_desc,
                      FALSE,
-                     FALSE);
+                     FALSE,
+                     BoundaryAddressMultiple);
    Status = MmRequestPageMemoryConsumer(MC_NPPOOL, TRUE, 
                                        &MmSharedDataPagePhysicalAddress);
    Status = MmCreateVirtualMapping(NULL,
index b448337..b488d62 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: ncache.c,v 1.26 2003/12/30 18:52:05 fireball Exp $
+/* $Id: ncache.c,v 1.27 2003/12/31 05:33:04 jfilby Exp $
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
@@ -53,7 +53,9 @@ MmAllocateNonCachedMemory(IN ULONG NumberOfBytes)
    NTSTATUS Status;
    ULONG i;
    ULONG Attributes;
+   PHYSICAL_ADDRESS BoundaryAddressMultiple;
 
+   BoundaryAddressMultiple.QuadPart = 0;
    MmLockAddressSpace(MmGetKernelAddressSpace());
    Result = NULL;
    Status = MmCreateMemoryArea (NULL,
@@ -64,7 +66,8 @@ MmAllocateNonCachedMemory(IN ULONG NumberOfBytes)
                                0,
                                &marea,
                                FALSE,
-                               FALSE);
+                               FALSE,
+                               BoundaryAddressMultiple);
    MmUnlockAddressSpace(MmGetKernelAddressSpace());
 
    if (!NT_SUCCESS(Status))
index 9c7e0c7..601f3cf 100644 (file)
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: section.c,v 1.138 2003/12/30 18:52:05 fireball Exp $
+/* $Id: section.c,v 1.139 2003/12/31 05:33:04 jfilby Exp $
  *
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/mm/section.c
@@ -3096,6 +3096,9 @@ MmMapViewOfSegment(PEPROCESS Process,
   PMEMORY_AREA MArea;
   NTSTATUS Status;
   KIRQL oldIrql;
+  PHYSICAL_ADDRESS BoundaryAddressMultiple;
+
+  BoundaryAddressMultiple.QuadPart = 0;
 
   Status = MmCreateMemoryArea(Process,
                              AddressSpace,
@@ -3105,7 +3108,8 @@ MmMapViewOfSegment(PEPROCESS Process,
                              Protect,
                              &MArea,
                              FALSE,
-                             TopDown);
+                             TopDown,
+                             BoundaryAddressMultiple);
   if (!NT_SUCCESS(Status))
     {
       DPRINT1("Mapping between 0x%.8X and 0x%.8X failed.\n",
@@ -3665,9 +3669,11 @@ MmAllocateSection (IN ULONG Length)
    NTSTATUS Status;
    ULONG i;
    PMADDRESS_SPACE AddressSpace;
+   PHYSICAL_ADDRESS BoundaryAddressMultiple;
 
    DPRINT("MmAllocateSection(Length %x)\n",Length);
 
+   BoundaryAddressMultiple.QuadPart = 0;
    AddressSpace = MmGetKernelAddressSpace();
    Result = NULL;
    MmLockAddressSpace(AddressSpace);
@@ -3679,7 +3685,8 @@ MmAllocateSection (IN ULONG Length)
                                0,
                                &marea,
                                FALSE,
-                               FALSE);
+                               FALSE,
+                               BoundaryAddressMultiple);
    MmUnlockAddressSpace(AddressSpace);
    if (!NT_SUCCESS(Status))
      {
index 53af695..329426a 100644 (file)
@@ -1,4 +1,4 @@
-; $Id: ntoskrnl.def,v 1.170 2003/11/22 11:56:17 ekohl Exp $
+; $Id: ntoskrnl.def,v 1.171 2003/12/31 05:33:03 jfilby Exp $
 ;
 ; reactos/ntoskrnl/ntoskrnl.def
 ;
@@ -498,8 +498,9 @@ LsaLogonUser@56
 LsaLookupAuthenticationPackage@12
 LsaRegisterLogonProcess@12
 MmAdjustWorkingSetSize@12
-MmAllocateContiguousAlignedMemory@16
+MmAllocateContiguousAlignedMemory@36
 MmAllocateContiguousMemory@12
+MmAllocateContiguousMemorySpecifyCache@32
 MmAllocateNonCachedMemory@4
 MmBuildMdlForNonPagedPool@4
 MmCanFileBeTruncated@8
@@ -512,6 +513,7 @@ MmDisableModifiedWriteOfSection@4
 MmFlushImageSection@8
 MmForceSectionClosed@8
 MmFreeContiguousMemory@4
+MmFreeContiguousMemorySpecifyCache@12
 MmFreeNonCachedMemory@8
 MmGetPhysicalAddress@4
 MmGrowKernelStack@4
index 08ad44b..25021e2 100644 (file)
@@ -1,4 +1,4 @@
-; $Id: ntoskrnl.edf,v 1.157 2003/11/22 11:56:17 ekohl Exp $
+; $Id: ntoskrnl.edf,v 1.158 2003/12/31 05:33:03 jfilby Exp $
 ;
 ; reactos/ntoskrnl/ntoskrnl.def
 ;
@@ -499,8 +499,9 @@ LsaLogonUser=LsaLogonUser@56
 LsaLookupAuthenticationPackage=LsaLookupAuthenticationPackage@12
 LsaRegisterLogonProcess=LsaRegisterLogonProcess@12
 MmAdjustWorkingSetSize=MmAdjustWorkingSetSize@12
-MmAllocateContiguousAlignedMemory=MmAllocateContiguousAlignedMemory@16
+MmAllocateContiguousAlignedMemory=MmAllocateContiguousAlignedMemory@36
 MmAllocateContiguousMemory=MmAllocateContiguousMemory@12
+MmAllocateContiguousMemorySpecifyCache=MmAllocateContiguousMemorySpecifyCache@32
 MmAllocateNonCachedMemory=MmAllocateNonCachedMemory@4
 MmBuildMdlForNonPagedPool=MmBuildMdlForNonPagedPool@4
 MmCanFileBeTruncated=MmCanFileBeTruncated@8
@@ -513,6 +514,7 @@ MmDisableModifiedWriteOfSection=MmDisableModifiedWriteOfSection@4
 MmFlushImageSection=MmFlushImageSection@8
 MmForceSectionClosed=MmForceSectionClosed@8
 MmFreeContiguousMemory=MmFreeContiguousMemory@4
+MmFreeContiguousMemorySpecifyCache=MmFreeContiguousMemorySpecifyCache@12
 MmFreeNonCachedMemory=MmFreeNonCachedMemory@8
 MmGetPhysicalAddress=MmGetPhysicalAddress@4
 MmGrowKernelStack=MmGrowKernelStack@4
index a4fbfe5..83648ce 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: process.c,v 1.122 2003/12/30 22:18:12 fireball Exp $
+/* $Id: process.c,v 1.123 2003/12/31 05:33:04 jfilby Exp $
  *
  * COPYRIGHT:         See COPYING in the top level directory
  * PROJECT:           ReactOS kernel
@@ -578,9 +578,12 @@ NtCreateProcess(OUT PHANDLE ProcessHandle,
    PEPORT ExceptionPort;
    PVOID BaseAddress;
    PMEMORY_AREA MemoryArea;
+   PHYSICAL_ADDRESS BoundaryAddressMultiple;
 
    DPRINT("NtCreateProcess(ObjectAttributes %x)\n",ObjectAttributes);
 
+   BoundaryAddressMultiple.QuadPart = 0;
+   
    Status = ObReferenceObjectByHandle(ParentProcessHandle,
                                      PROCESS_CREATE_PROCESS,
                                      PsProcessType,
@@ -751,7 +754,8 @@ NtCreateProcess(OUT PHANDLE ProcessHandle,
                               PAGE_NOACCESS,
                               &MemoryArea,
                               FALSE,
-                              FALSE);
+                              FALSE,
+                              BoundaryAddressMultiple);
    if (!NT_SUCCESS(Status))
      {
        MmUnlockAddressSpace(&Process->AddressSpace);
@@ -770,7 +774,8 @@ NtCreateProcess(OUT PHANDLE ProcessHandle,
                               PAGE_NOACCESS,
                               &MemoryArea,
                               FALSE,
-                              FALSE);
+                              FALSE,
+                              BoundaryAddressMultiple);
    if (!NT_SUCCESS(Status))
      {
        MmUnlockAddressSpace(&Process->AddressSpace);
@@ -789,7 +794,8 @@ NtCreateProcess(OUT PHANDLE ProcessHandle,
                               PAGE_NOACCESS,
                               &MemoryArea,
                               FALSE,
-                              FALSE);
+                              FALSE,
+                              BoundaryAddressMultiple);
    if (!NT_SUCCESS(Status))
      {
        MmUnlockAddressSpace(&Process->AddressSpace);
@@ -807,7 +813,8 @@ NtCreateProcess(OUT PHANDLE ProcessHandle,
                               PAGE_READONLY,
                               &MemoryArea,
                               FALSE,
-                              FALSE);
+                              FALSE,
+                              BoundaryAddressMultiple);
    MmUnlockAddressSpace(&Process->AddressSpace);
    if (!NT_SUCCESS(Status))
      {
index ce729e9..b1b88de 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: w32call.c,v 1.10 2003/12/30 18:52:05 fireball Exp $
+/* $Id: w32call.c,v 1.11 2003/12/31 05:33:04 jfilby Exp $
  *
  * COPYRIGHT:              See COPYING in the top level directory
  * PROJECT:                ReactOS kernel
@@ -182,7 +182,9 @@ PsAllocateCallbackStack(ULONG StackSize)
   NTSTATUS Status;
   PMEMORY_AREA StackArea;
   ULONG i;
+  PHYSICAL_ADDRESS BoundaryAddressMultiple;
 
+  BoundaryAddressMultiple.QuadPart = 0;
   StackSize = PAGE_ROUND_UP(StackSize);
   MmLockAddressSpace(MmGetKernelAddressSpace());
   Status = MmCreateMemoryArea(NULL,
@@ -193,7 +195,8 @@ PsAllocateCallbackStack(ULONG StackSize)
                              0,
                              &StackArea,
                              FALSE,
-                             FALSE);
+                             FALSE,
+                             BoundaryAddressMultiple);
   MmUnlockAddressSpace(MmGetKernelAddressSpace());
   if (!NT_SUCCESS(Status))
     {