Rebase against 0c27d244f76ad90301c5db09d738b3a0389bcdac.

This commit is contained in:
Zebediah Figura
2020-04-30 17:39:18 -05:00
parent 7b0b95ee53
commit 169c49055d
11 changed files with 136 additions and 137 deletions

View File

@@ -1,4 +1,4 @@
From 0aee0556e8c5eaff0ac15cd2f2a8ba7c234dfe57 Mon Sep 17 00:00:00 2001
From 2c3361713f010ec03423c6eae45bacda5e7e93ac Mon Sep 17 00:00:00 2001
From: Paul Gofman <gofmanp@gmail.com>
Date: Mon, 25 Nov 2019 12:19:20 +0300
Subject: [PATCH] ntdll: Force bottom up allocation order for 64 bit arch
@@ -11,19 +11,18 @@ Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46568
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index 486693f312..81d844ab17 100644
index 0c7d6990b8c..f2e961d31c3 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -1278,14 +1278,20 @@ static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size,
@@ -1256,13 +1256,19 @@ static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size,
}
else
{
- size_t view_size = size + mask + 1;
- size_t view_size = size + granularity_mask + 1;
struct alloc_area alloc;
+ size_t view_size;
alloc.size = size;
alloc.mask = mask;
alloc.top_down = top_down;
alloc.limit = (void*)(get_zero_bits_64_mask( zero_bits_64 ) & (UINT_PTR)user_space_limit);
@@ -36,24 +35,24 @@ index 486693f312..81d844ab17 100644
if (wine_mmap_enum_reserved_areas( alloc_reserved_area_callback, &alloc, top_down ))
{
ptr = alloc.result;
@@ -1295,7 +1301,7 @@ static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size,
@@ -1272,7 +1278,7 @@ static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size,
goto done;
}
- if (zero_bits_64)
+ if (is_win64 || zero_bits_64)
{
if (!(ptr = map_free_area( address_space_start, alloc.limit, size, mask, top_down, VIRTUAL_GetUnixProt(vprot) )))
return STATUS_NO_MEMORY;
@@ -1303,6 +1309,8 @@ static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size,
if (!(ptr = map_free_area( address_space_start, alloc.limit, size,
top_down, VIRTUAL_GetUnixProt(vprot) )))
@@ -1281,6 +1287,8 @@ static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size,
goto done;
}
+ view_size = size + mask + 1;
+ view_size = size + granularity_mask + 1;
+
for (;;)
{
if ((ptr = wine_anon_mmap( NULL, view_size, VIRTUAL_GetUnixProt(vprot), 0 )) == (void *)-1)
--
2.24.1
2.26.2

View File

@@ -1,4 +1,4 @@
From c8c6a1025ead2e1befbdccf9a53f8fd4141f8d53 Mon Sep 17 00:00:00 2001
From 3b0d0de794f903da33ce7fb4de545d0305163a31 Mon Sep 17 00:00:00 2001
From: Paul Gofman <gofmanp@gmail.com>
Date: Tue, 14 Jan 2020 21:42:21 +0300
Subject: [PATCH] ntdll: Use free area list for virtual memory allocation.
@@ -8,10 +8,10 @@ Subject: [PATCH] ntdll: Use free area list for virtual memory allocation.
1 file changed, 55 insertions(+), 56 deletions(-)
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index a262401f58..2951b5b15b 100644
index a4bc4c6ef05..18524fc12de 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -596,60 +596,6 @@ static void* try_map_free_area( void *base, void *end, ptrdiff_t step,
@@ -577,59 +577,6 @@ static void* try_map_free_area( void *base, void *end, ptrdiff_t step,
return NULL;
}
@@ -22,16 +22,15 @@ index a262401f58..2951b5b15b 100644
- * Find a free area between views inside the specified range and map it.
- * The csVirtual section must be held by caller.
- */
-static void *map_free_area( void *base, void *end, size_t size, size_t mask, int top_down,
- int unix_prot )
-static void *map_free_area( void *base, void *end, size_t size, int top_down, int unix_prot )
-{
- struct wine_rb_entry *first = find_view_inside_range( &base, &end, top_down );
- ptrdiff_t step = top_down ? -(mask + 1) : (mask + 1);
- ptrdiff_t step = top_down ? -(granularity_mask + 1) : (granularity_mask + 1);
- void *start;
-
- if (top_down)
- {
- start = ROUND_ADDR( (char *)end - size, mask );
- start = ROUND_ADDR( (char *)end - size, granularity_mask );
- if (start >= end || start < base) return NULL;
-
- while (first)
@@ -39,7 +38,7 @@ index a262401f58..2951b5b15b 100644
- struct file_view *view = WINE_RB_ENTRY_VALUE( first, struct file_view, entry );
- if ((start = try_map_free_area( (char *)view->base + view->size, (char *)start + size, step,
- start, size, unix_prot ))) break;
- start = ROUND_ADDR( (char *)view->base - size, mask );
- start = ROUND_ADDR( (char *)view->base - size, granularity_mask );
- /* stop if remaining space is not large enough */
- if (!start || start >= end || start < base) return NULL;
- first = wine_rb_prev( first );
@@ -47,7 +46,7 @@ index a262401f58..2951b5b15b 100644
- }
- else
- {
- start = ROUND_ADDR( (char *)base + mask, mask );
- start = ROUND_ADDR( (char *)base + granularity_mask, granularity_mask );
- if (!start || start >= end || (char *)end - (char *)start < size) return NULL;
-
- while (first)
@@ -55,7 +54,7 @@ index a262401f58..2951b5b15b 100644
- struct file_view *view = WINE_RB_ENTRY_VALUE( first, struct file_view, entry );
- if ((start = try_map_free_area( start, view->base, step,
- start, size, unix_prot ))) break;
- start = ROUND_ADDR( (char *)view->base + view->size + mask, mask );
- start = ROUND_ADDR( (char *)view->base + view->size + granularity_mask, granularity_mask );
- /* stop if remaining space is not large enough */
- if (!start || start >= end || (char *)end - (char *)start < size) return NULL;
- first = wine_rb_next( first );
@@ -72,7 +71,7 @@ index a262401f58..2951b5b15b 100644
/***********************************************************************
* find_reserved_free_area
*
@@ -864,6 +810,7 @@ static struct file_view *alloc_view(void)
@@ -844,6 +791,7 @@ static struct file_view *alloc_view(void)
*/
static void delete_view( struct file_view *view ) /* [in] View */
{
@@ -80,7 +79,7 @@ index a262401f58..2951b5b15b 100644
if (!(view->protect & VPROT_SYSTEM)) unmap_area( view->base, view->size );
set_page_vprot( view->base, view->size, 0 );
wine_rb_remove( &views_tree, &view->entry );
@@ -921,6 +868,7 @@ static NTSTATUS create_view( struct file_view **view_ret, void *base, size_t siz
@@ -901,6 +849,7 @@ static NTSTATUS create_view( struct file_view **view_ret, void *base, size_t siz
TRACE( "forcing exec permission on %p-%p\n", base, (char *)base + size - 1 );
mprotect( base, size, unix_prot | PROT_EXEC );
}
@@ -88,7 +87,7 @@ index a262401f58..2951b5b15b 100644
return STATUS_SUCCESS;
}
@@ -1158,6 +1106,7 @@ struct alloc_area
@@ -1137,6 +1086,7 @@ struct alloc_area
int top_down;
void *limit;
void *result;
@@ -96,7 +95,7 @@ index a262401f58..2951b5b15b 100644
};
/***********************************************************************
@@ -1199,6 +1148,41 @@ static int alloc_reserved_area_callback( void *start, size_t size, void *arg )
@@ -1178,6 +1128,41 @@ static int alloc_reserved_area_callback( void *start, size_t size, void *arg )
return 0;
}
@@ -105,7 +104,7 @@ index a262401f58..2951b5b15b 100644
+ struct alloc_area *alloc = arg;
+ void *end = (char *)base + area_size;
+ size_t size = alloc->size;
+ ptrdiff_t step = alloc->top_down ? -(alloc->mask + 1) : (alloc->mask + 1);
+ ptrdiff_t step = alloc->top_down ? -(granularity_mask + 1) : (granularity_mask + 1);
+ void *start;
+
+ if (base < address_space_start) base = address_space_start;
@@ -114,7 +113,7 @@ index a262401f58..2951b5b15b 100644
+
+ if (alloc->top_down)
+ {
+ start = ROUND_ADDR( (char *)end - size, alloc->mask );
+ start = ROUND_ADDR( (char *)end - size, granularity_mask );
+ if (start >= end || start < base)
+ return 0;
+
@@ -124,7 +123,7 @@ index a262401f58..2951b5b15b 100644
+ }
+ else
+ {
+ start = ROUND_ADDR( (char *)base + alloc->mask, alloc->mask );
+ start = ROUND_ADDR( (char *)base + granularity_mask, granularity_mask );
+ if (!start || start >= end || (char *)end - (char *)start < size)
+ return 0;
+
@@ -138,19 +137,20 @@ index a262401f58..2951b5b15b 100644
/***********************************************************************
* map_fixed_area
*
@@ -1286,6 +1270,7 @@ static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size,
alloc.mask = mask;
@@ -1263,6 +1248,7 @@ static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size,
alloc.size = size;
alloc.top_down = top_down;
alloc.limit = (void*)(get_zero_bits_64_mask( zero_bits_64 ) & (UINT_PTR)user_space_limit);
+ alloc.unix_prot = VIRTUAL_GetUnixProt(vprot);
if (is_win64 && !top_down)
{
@@ -1304,9 +1289,11 @@ static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size,
@@ -1281,10 +1267,11 @@ static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size,
if (is_win64 || zero_bits_64)
{
- if (!(ptr = map_free_area( address_space_start, alloc.limit, size, mask, top_down, VIRTUAL_GetUnixProt(vprot) )))
- if (!(ptr = map_free_area( address_space_start, alloc.limit, size,
- top_down, VIRTUAL_GetUnixProt(vprot) )))
+ if (!wine_mmap_enum_free_areas( alloc_free_area_callback, &alloc, top_down ))
return STATUS_NO_MEMORY;
- TRACE( "got mem with map_free_area %p-%p\n", ptr, (char *)ptr + size );
@@ -160,7 +160,7 @@ index a262401f58..2951b5b15b 100644
goto done;
}
@@ -1981,6 +1968,12 @@ static int alloc_virtual_heap( void *base, size_t size, void *arg )
@@ -1955,6 +1942,12 @@ static int alloc_virtual_heap( void *base, size_t size, void *arg )
return (alloc->base != (void *)-1);
}
@@ -173,7 +173,7 @@ index a262401f58..2951b5b15b 100644
/***********************************************************************
* virtual_init
*/
@@ -2039,6 +2032,9 @@ void virtual_init(void)
@@ -2020,6 +2013,9 @@ void virtual_init(void)
size = (char *)address_space_start - (char *)0x10000;
if (size && wine_mmap_is_in_reserved_area( (void*)0x10000, size ) == 1)
wine_anon_mmap( (void *)0x10000, size, PROT_READ | PROT_WRITE, MAP_FIXED );
@@ -183,7 +183,7 @@ index a262401f58..2951b5b15b 100644
}
@@ -2734,6 +2730,9 @@ void virtual_set_large_address_space(void)
@@ -2791,6 +2787,9 @@ void virtual_set_large_address_space(void)
/* no large address space on win9x */
if (NtCurrentTeb()->Peb->OSPlatformId != VER_PLATFORM_WIN32_NT) return;
@@ -194,5 +194,5 @@ index a262401f58..2951b5b15b 100644
}
--
2.24.1
2.26.2

View File

@@ -1,4 +1,4 @@
From e015956f133594c51f5f1e7baccf3fe56ef7d83f Mon Sep 17 00:00:00 2001
From edf5fb86ff4d075fb48fd562fc0be2140c8e66bb Mon Sep 17 00:00:00 2001
From: Paul Gofman <gofmanp@gmail.com>
Date: Wed, 15 Jan 2020 17:05:09 +0300
Subject: [PATCH] ntdll: Permanently exclude natively mapped areas from free
@@ -9,10 +9,10 @@ Subject: [PATCH] ntdll: Permanently exclude natively mapped areas from free
1 file changed, 22 insertions(+)
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index 2951b5b15b..3617dcf348 100644
index 18524fc12de..63a10435890 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -110,6 +110,9 @@ static const BYTE VIRTUAL_Win32Flags[16] =
@@ -111,6 +111,9 @@ static const BYTE VIRTUAL_Win32Flags[16] =
static struct wine_rb_tree views_tree;
@@ -22,7 +22,7 @@ index 2951b5b15b..3617dcf348 100644
static RTL_CRITICAL_SECTION csVirtual;
static RTL_CRITICAL_SECTION_DEBUG critsect_debug =
{
@@ -585,6 +588,13 @@ static void* try_map_free_area( void *base, void *end, ptrdiff_t step,
@@ -566,6 +569,13 @@ static void* try_map_free_area( void *base, void *end, ptrdiff_t step,
if (ptr != (void *)-1)
munmap( ptr, size );
@@ -36,8 +36,8 @@ index 2951b5b15b..3617dcf348 100644
if ((step > 0 && (char *)end - (char *)start < step) ||
(step < 0 && (char *)start - (char *)base < -step) ||
step == 0)
@@ -1156,6 +1166,8 @@ static int alloc_free_area_callback( void *base, size_t area_size, void *arg )
ptrdiff_t step = alloc->top_down ? -(alloc->mask + 1) : (alloc->mask + 1);
@@ -1136,6 +1146,8 @@ static int alloc_free_area_callback( void *base, size_t area_size, void *arg )
ptrdiff_t step = alloc->top_down ? -(granularity_mask + 1) : (granularity_mask + 1);
void *start;
+ TRACE("base %p, area_size %p, size %p.\n", base, (void *)area_size, (void *)size);
@@ -45,7 +45,7 @@ index 2951b5b15b..3617dcf348 100644
if (base < address_space_start) base = address_space_start;
if (is_beyond_limit( base, size, alloc->limit )) end = alloc->limit;
if (base >= end) return 0;
@@ -1287,11 +1299,21 @@ static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size,
@@ -1265,11 +1277,21 @@ static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size,
goto done;
}
@@ -68,5 +68,5 @@ index 2951b5b15b..3617dcf348 100644
TRACE( "got mem in free area %p-%p\n", ptr, (char *)ptr + size );
goto done;
--
2.24.1
2.26.2