You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-09-12 18:50:20 -07:00
Rebase against 0c27d244f76ad90301c5db09d738b3a0389bcdac.
This commit is contained in:
@@ -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
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user