Don't rely on the reserved area list being empty in reserve_area,
since the preloader will need to add things to the list before startup.
This commit is contained in:
parent
f974c8598e
commit
dc4d05690e
|
@ -266,6 +266,8 @@ static void add_reserved_area( void *addr, size_t size )
|
||||||
size -= (char *)USER_SPACE_LIMIT - (char *)addr;
|
size -= (char *)USER_SPACE_LIMIT - (char *)addr;
|
||||||
addr = USER_SPACE_LIMIT;
|
addr = USER_SPACE_LIMIT;
|
||||||
}
|
}
|
||||||
|
/* blow away existing mappings */
|
||||||
|
wine_anon_mmap( addr, size, PROT_NONE, MAP_NORESERVE | MAP_FIXED );
|
||||||
wine_mmap_add_reserved_area( addr, size );
|
wine_mmap_add_reserved_area( addr, size );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -201,32 +201,13 @@ static void reserve_area( void *addr, void *end )
|
||||||
{
|
{
|
||||||
void *ptr;
|
void *ptr;
|
||||||
size_t size = (char *)end - (char *)addr;
|
size_t size = (char *)end - (char *)addr;
|
||||||
struct list *prev;
|
|
||||||
struct reserved_area *area;
|
|
||||||
|
|
||||||
if ((ptr = wine_anon_mmap( addr, size, PROT_NONE, MAP_NORESERVE )) != (void *)-1)
|
if ((ptr = wine_anon_mmap( addr, size, PROT_NONE, MAP_NORESERVE )) != (void *)-1)
|
||||||
{
|
{
|
||||||
if (ptr == addr)
|
if (ptr == addr)
|
||||||
{
|
{
|
||||||
if (!end) size--; /* avoid wrap-around */
|
wine_mmap_add_reserved_area( addr, size );
|
||||||
/* try to merge it with the previous one */
|
return;
|
||||||
if ((prev = list_tail( &reserved_areas )))
|
|
||||||
{
|
|
||||||
area = LIST_ENTRY( prev, struct reserved_area, entry );
|
|
||||||
if (area && (char *)area->base + area->size == (char *)ptr)
|
|
||||||
{
|
|
||||||
area->size += size;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* create a new area */
|
|
||||||
if ((area = malloc( sizeof(*area) )))
|
|
||||||
{
|
|
||||||
area->base = addr;
|
|
||||||
area->size = size;
|
|
||||||
list_add_tail( &reserved_areas, &area->entry );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else munmap( ptr, size );
|
else munmap( ptr, size );
|
||||||
}
|
}
|
||||||
|
@ -287,11 +268,6 @@ void wine_mmap_add_reserved_area( void *addr, size_t size )
|
||||||
|
|
||||||
if (!((char *)addr + size)) size--; /* avoid wrap-around */
|
if (!((char *)addr + size)) size--; /* avoid wrap-around */
|
||||||
|
|
||||||
#ifdef HAVE_MMAP
|
|
||||||
/* blow away existing mappings */
|
|
||||||
wine_anon_mmap( addr, size, PROT_NONE, MAP_NORESERVE | MAP_FIXED );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
LIST_FOR_EACH( ptr, &reserved_areas )
|
LIST_FOR_EACH( ptr, &reserved_areas )
|
||||||
{
|
{
|
||||||
area = LIST_ENTRY( ptr, struct reserved_area, entry );
|
area = LIST_ENTRY( ptr, struct reserved_area, entry );
|
||||||
|
|
Loading…
Reference in New Issue