[PATCH v3 06/10] ntdll: Add map_view_aligned function that handles memory alignment

Rémi Bernon rbernon at codeweavers.com
Tue Jun 18 11:39:30 CDT 2019


Instead of mask, this function takes top_down, zero_bits and alignment
(resp. high bits and low bits alignment constraints) parameters.

The map_view function is now just a wrapper around it with default
alignment values.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/ntdll/virtual.c | 39 +++++++++++++++++++++++++--------------
 1 file changed, 25 insertions(+), 14 deletions(-)

diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index 3bd295780c2..cf3e597ab2f 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -1077,16 +1077,17 @@ static NTSTATUS map_fixed_area( void *base, size_t size, unsigned int vprot )
 }
 
 /***********************************************************************
- *           map_view
+ *           map_view_aligned
  *
  * Create a view and mmap the corresponding memory area.
  * The csVirtual section must be held by caller.
  */
-static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size, size_t mask,
-                          int top_down, unsigned int vprot, size_t zero_bits )
+static NTSTATUS map_view_aligned( struct file_view **view_ret, void *base, size_t size, unsigned int vprot,
+                                  int top_down, size_t zero_bits, size_t alignment )
 {
     void *ptr;
     NTSTATUS status;
+    size_t mask = get_mask( alignment );
 
     if (base)
     {
@@ -1137,6 +1138,15 @@ done:
     return status;
 }
 
+/***********************************************************************
+ *           map_view
+ *
+ * Same as map_view_aligned but without alignment constraints.
+ */
+static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size, unsigned int vprot )
+{
+    return map_view_aligned( view_ret, base, size, vprot, FALSE, 0, 0 );
+}
 
 /***********************************************************************
  *           map_file_into_view
@@ -1287,7 +1297,7 @@ static NTSTATUS allocate_dos_memory( struct file_view **view, unsigned int vprot
         if (addr != low_64k)
         {
             if (addr != (void *)-1) munmap( addr, dosmem_size - 0x10000 );
-            return map_view( view, NULL, dosmem_size, 0xffff, 0, vprot, 0 );
+            return map_view( view, NULL, dosmem_size, vprot );
         }
     }
 
@@ -1390,12 +1400,14 @@ static NTSTATUS map_image( HANDLE hmapping, ACCESS_MASK access, int fd, SIZE_T z
     server_enter_uninterrupted_section( &csVirtual, &sigset );
 
     if (base >= (char *)address_space_start)  /* make sure the DOS area remains free */
-        status = map_view( &view, base, total_size, get_mask( 0 ), FALSE, SEC_IMAGE | SEC_FILE |
-                           VPROT_COMMITTED | VPROT_READ | VPROT_EXEC | VPROT_WRITECOPY, zero_bits );
+        status = map_view_aligned( &view, base, total_size,
+                                   SEC_IMAGE | SEC_FILE | VPROT_COMMITTED | VPROT_READ | VPROT_EXEC | VPROT_WRITECOPY,
+                                   FALSE, zero_bits, 0 );
 
     if (status != STATUS_SUCCESS)
-        status = map_view( &view, NULL, total_size, get_mask( 0 ), FALSE, SEC_IMAGE | SEC_FILE |
-                           VPROT_COMMITTED | VPROT_READ | VPROT_EXEC | VPROT_WRITECOPY, zero_bits );
+        status = map_view_aligned( &view, NULL, total_size,
+                                   SEC_IMAGE | SEC_FILE | VPROT_COMMITTED | VPROT_READ | VPROT_EXEC | VPROT_WRITECOPY,
+                                   FALSE, zero_bits, 0 );
 
     if (status != STATUS_SUCCESS) goto error;
 
@@ -1717,7 +1729,7 @@ NTSTATUS virtual_map_section( HANDLE handle, PVOID *addr_ptr, ULONG zero_bits, S
     get_vprot_flags( protect, &vprot, sec_flags & SEC_IMAGE );
     vprot |= sec_flags;
     if (!(sec_flags & SEC_RESERVE)) vprot |= VPROT_COMMITTED;
-    res = map_view( &view, *addr_ptr, size, get_mask( 0 ), FALSE, vprot, zero_bits );
+    res = map_view_aligned( &view, *addr_ptr, size, vprot, FALSE, zero_bits, 0 );
     if (res)
     {
         server_leave_uninterrupted_section( &csVirtual, &sigset );
@@ -1949,8 +1961,8 @@ NTSTATUS virtual_alloc_thread_stack( TEB *teb, SIZE_T reserve_size, SIZE_T commi
 
     server_enter_uninterrupted_section( &csVirtual, &sigset );
 
-    if ((status = map_view( &view, NULL, size + extra_size, 0xffff, 0,
-                            VPROT_READ | VPROT_WRITE | VPROT_COMMITTED, 0 )) != STATUS_SUCCESS)
+    if ((status = map_view( &view, NULL, size + extra_size,
+                            VPROT_READ | VPROT_WRITE | VPROT_COMMITTED )) != STATUS_SUCCESS)
         goto done;
 
 #ifdef VALGRIND_STACK_REGISTER
@@ -2513,7 +2525,6 @@ NTSTATUS virtual_alloc_aligned( PVOID *ret, ULONG zero_bits, SIZE_T *size_ptr,
     void *base;
     unsigned int vprot;
     SIZE_T size = *size_ptr;
-    SIZE_T mask = get_mask( alignment );
     NTSTATUS status = STATUS_SUCCESS;
     BOOL is_dos_memory = FALSE;
     struct file_view *view;
@@ -2526,7 +2537,7 @@ NTSTATUS virtual_alloc_aligned( PVOID *ret, ULONG zero_bits, SIZE_T *size_ptr,
     if (*ret)
     {
         if (type & MEM_RESERVE) /* Round down to 64k boundary */
-            base = ROUND_ADDR( *ret, mask );
+            base = ROUND_ADDR( *ret, get_mask( alignment ) );
         else
             base = ROUND_ADDR( *ret, page_mask );
         size = (((UINT_PTR)*ret + size + page_mask) & ~page_mask) - (UINT_PTR)base;
@@ -2570,7 +2581,7 @@ NTSTATUS virtual_alloc_aligned( PVOID *ret, ULONG zero_bits, SIZE_T *size_ptr,
 
             if (vprot & VPROT_WRITECOPY) status = STATUS_INVALID_PAGE_PROTECTION;
             else if (is_dos_memory) status = allocate_dos_memory( &view, vprot );
-            else status = map_view( &view, base, size, mask, type & MEM_TOP_DOWN, vprot, zero_bits );
+            else status = map_view_aligned( &view, base, size, vprot, type & MEM_TOP_DOWN, zero_bits, alignment );
 
             if (status == STATUS_SUCCESS) base = view->base;
         }
-- 
2.20.1




More information about the wine-devel mailing list