From ea8ee88f9825bf4da91b1d0931e2c76b95a682d5 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 17 Dec 2010 13:25:41 +0100 Subject: [PATCH] libwine: Reserve memory areas for 64-bit in case we don't have a preloader. --- libs/wine/mmap.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/libs/wine/mmap.c b/libs/wine/mmap.c index b400189ab63..f0665b1c190 100644 --- a/libs/wine/mmap.c +++ b/libs/wine/mmap.c @@ -243,8 +243,7 @@ static inline int mmap_reserve( void *addr, size_t size ) * * Reserve as much memory as possible in the given area. */ -#ifdef __i386__ -static void reserve_area( void *addr, void *end ) +static inline void reserve_area( void *addr, void *end ) { size_t size = (char *)end - (char *)addr; @@ -294,7 +293,7 @@ static void reserve_area( void *addr, void *end ) * Solaris malloc is not smart enough to obtain space through mmap(), so try to make * sure that there is some available sbrk() space before we reserve other things. */ -static void reserve_malloc_space( size_t size ) +static inline void reserve_malloc_space( size_t size ) { #ifdef __sun size_t i, count = size / 1024; @@ -309,15 +308,13 @@ static void reserve_malloc_space( size_t size ) #endif } -#endif /* __i386__ */ - /*********************************************************************** * reserve_dos_area * * Reserve the DOS area (0x00000000-0x00110000). */ -static void reserve_dos_area(void) +static inline void reserve_dos_area(void) { const size_t page_size = getpagesize(); const size_t dos_area_size = 0x110000; @@ -341,9 +338,9 @@ static void reserve_dos_area(void) */ void mmap_init(void) { +#ifdef __i386__ struct reserved_area *area; struct list *ptr; -#ifdef __i386__ char stack; char * const stack_ptr = &stack; char *user_space_limit = (char *)0x7ffe0000; @@ -383,7 +380,6 @@ void mmap_init(void) reserve_area( base, end ); } else reserve_area( user_space_limit, 0 ); -#endif /* __i386__ */ /* reserve the DOS area if not already done */ @@ -394,6 +390,18 @@ void mmap_init(void) if (!area->base) return; /* already reserved */ } reserve_dos_area(); + +#elif defined(__x86_64__) + + if (!list_head( &reserved_areas )) + { + /* if we don't have a preloader, try to reserve the space now */ + reserve_area( (void *)0x000000010000, (void *)0x000068000000 ); + reserve_area( (void *)0x00007ff00000, (void *)0x00007fff0000 ); + reserve_area( (void *)0x7ffffe000000, (void *)0x7fffffff0000 ); + } + +#endif } -- 2.11.4.GIT