libwine: allow multiple reserve areas
Mike McCormack
mike at codeweavers.com
Wed Apr 28 05:09:07 CDT 2004
This patch allows the loader to inform libwine of multiple areas of
memory that may have been reseved before wine started. Currently only a
single area is allowed.
Mike
ChangeLog:
* allow multiple reserve areas
-------------- next part --------------
Index: libs/wine/port.c
===================================================================
RCS file: /home/wine/wine/libs/wine/port.c,v
retrieving revision 1.8
diff -u -r1.8 port.c
--- libs/wine/port.c 5 Feb 2004 02:01:35 -0000 1.8
+++ libs/wine/port.c 28 Apr 2004 09:07:02 -0000
@@ -150,36 +150,63 @@
#error You must implement wine_switch_to_stack for your platform
#endif
+struct reserve_area
+{
+ char *base;
+ size_t size;
+ struct reserve_area *next;
+};
-static char *pe_area;
-static size_t pe_area_size;
+struct reserve_area *reserve_list;
/***********************************************************************
- * wine_set_pe_load_area
+ * wine_reserve_area
*
- * Define the reserved area to use for loading the main PE binary.
+ * Define a reserved area (for the PE binary and system heap)
+ * These function are not thread safe, so we assume that
+ * they're called before any threads are started, and all the
+ * reserve areas are free'd.
*/
-void wine_set_pe_load_area( void *base, size_t size )
+void wine_reserve_area( void *base, size_t size )
{
+ struct reserve_area *area;
unsigned int page_mask = getpagesize() - 1;
char *end = (char *)base + size;
- pe_area = (char *)(((unsigned long)base + page_mask) & ~page_mask);
- pe_area_size = (end - pe_area) & ~page_mask;
+ area = malloc( sizeof (struct reserve_area) );
+
+ area->base = (char *)(((unsigned long)base + page_mask) & ~page_mask);
+ area->size = (end - area->base) & ~page_mask;
+
+ area->next = reserve_list;
+ reserve_list = area;
}
/***********************************************************************
- * wine_free_pe_load_area
+ * wine_free_area
*
- * Free the reserved area to use for loading the main PE binary.
+ * Free a reserved area.
*/
-void wine_free_pe_load_area(void)
+int wine_free_area( char *start, size_t size )
{
+ struct reserve_area *area, **p;
+
+ for( p = &reserve_list; (area = *p); p = &area->next )
+ if( start >= area->base && start + size <= area->base + area->size)
+ break;
+
+ if( !area )
+ return 0;
+
+ *p = area->next;
+
#ifdef HAVE_MMAP
- if (pe_area) munmap( pe_area, pe_area_size );
+ munmap( area->base, area->size );
#endif
- pe_area = NULL;
+
+ free( area );
+ return 1;
}
@@ -296,13 +323,8 @@
flags |= MAP_PRIVATE;
#endif
- if (pe_area && start &&
- (char *)start >= pe_area &&
- (char *)start + size <= pe_area + pe_area_size)
- {
- wine_free_pe_load_area();
+ if ( start && reserve_list && wine_free_area(start, size) )
flags |= MAP_FIXED;
- }
if (!(flags & MAP_FIXED))
{
Index: libs/wine/wine.def
===================================================================
RCS file: /home/wine/wine/libs/wine/wine.def,v
retrieving revision 1.10
diff -u -r1.10 wine.def
--- libs/wine/wine.def 5 Feb 2004 02:01:35 -0000 1.10
+++ libs/wine/wine.def 28 Apr 2004 09:07:02 -0000
@@ -64,5 +64,5 @@
wine_pthread_init_thread
wine_set_fs
wine_set_gs
- wine_set_pe_load_area
+ wine_reserve_area
wine_switch_to_stack
Index: libs/wine/wine.map
===================================================================
RCS file: /home/wine/wine/libs/wine/wine.map,v
retrieving revision 1.1
diff -u -r1.1 wine.map
--- libs/wine/wine.map 12 Feb 2004 22:54:00 -0000 1.1
+++ libs/wine/wine.map 28 Apr 2004 09:07:02 -0000
@@ -64,7 +64,7 @@
wine_pthread_init_thread;
wine_set_fs;
wine_set_gs;
- wine_set_pe_load_area;
+ wine_reserve_area;
wine_switch_to_stack;
local: *;
Index: dlls/kernel/process.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/process.c,v
retrieving revision 1.55
diff -u -r1.55 process.c
--- dlls/kernel/process.c 28 Apr 2004 01:04:24 -0000 1.55
+++ dlls/kernel/process.c 28 Apr 2004 09:07:03 -0000
@@ -917,8 +917,6 @@
}
found:
- wine_free_pe_load_area(); /* the main binary is loaded, we don't need this anymore */
-
/* build command line */
set_library_wargv( __wine_main_argv );
if (!build_command_line( __wine_main_wargv )) goto error;
More information about the wine-patches
mailing list