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@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; }