[PATCH 1/2] loader: Move some code in preparation for adding the Mac preloader.

Ken Thomases ken at codeweavers.com
Mon Dec 3 10:46:50 CST 2018


Signed-off-by: Ken Thomases <ken at codeweavers.com>
---
This is a no-op.  It justs makes the next patch simpler.

 loader/preloader.c | 288 +++++++++++++++++++++++++++--------------------------
 1 file changed, 148 insertions(+), 140 deletions(-)

diff --git a/loader/preloader.c b/loader/preloader.c
index 644244b..de15130 100644
--- a/loader/preloader.c
+++ b/loader/preloader.c
@@ -93,6 +93,14 @@
 
 #include "main.h"
 
+static int wld_vsprintf(char *buffer, const char *fmt, va_list args );
+
+static __attribute__((format(printf,1,2))) void wld_printf(const char *fmt, ... );
+
+static __attribute__((noreturn,format(printf,1,2))) void fatal_error(const char *fmt, ... );
+
+static void preload_reserve( const char *str );
+
 /* ELF definitions */
 #define ELF_PREFERRED_ADDRESS(loader, maplength, mapstartpref) (mapstartpref)
 #define ELF_FIXED_ADDRESS(loader, mapstart) ((void) 0)
@@ -559,85 +567,6 @@ static inline void *wld_memset( void *dest, int val, size_t len )
     return dest;
 }
 
-/*
- * wld_printf - just the basics
- *
- *  %x prints a hex number
- *  %s prints a string
- *  %p prints a pointer
- */
-static int wld_vsprintf(char *buffer, const char *fmt, va_list args )
-{
-    static const char hex_chars[16] = "0123456789abcdef";
-    const char *p = fmt;
-    char *str = buffer;
-    int i;
-
-    while( *p )
-    {
-        if( *p == '%' )
-        {
-            p++;
-            if( *p == 'x' )
-            {
-                unsigned int x = va_arg( args, unsigned int );
-                for (i = 2*sizeof(x) - 1; i >= 0; i--)
-                    *str++ = hex_chars[(x>>(i*4))&0xf];
-            }
-            else if (p[0] == 'l' && p[1] == 'x')
-            {
-                unsigned long x = va_arg( args, unsigned long );
-                for (i = 2*sizeof(x) - 1; i >= 0; i--)
-                    *str++ = hex_chars[(x>>(i*4))&0xf];
-                p++;
-            }
-            else if( *p == 'p' )
-            {
-                unsigned long x = (unsigned long)va_arg( args, void * );
-                for (i = 2*sizeof(x) - 1; i >= 0; i--)
-                    *str++ = hex_chars[(x>>(i*4))&0xf];
-            }
-            else if( *p == 's' )
-            {
-                char *s = va_arg( args, char * );
-                while(*s)
-                    *str++ = *s++;
-            }
-            else if( *p == 0 )
-                break;
-            p++;
-        }
-        *str++ = *p++;
-    }
-    *str = 0;
-    return str - buffer;
-}
-
-static __attribute__((format(printf,1,2))) void wld_printf(const char *fmt, ... )
-{
-    va_list args;
-    char buffer[256];
-    int len;
-
-    va_start( args, fmt );
-    len = wld_vsprintf(buffer, fmt, args );
-    va_end( args );
-    wld_write(2, buffer, len);
-}
-
-static __attribute__((noreturn,format(printf,1,2))) void fatal_error(const char *fmt, ... )
-{
-    va_list args;
-    char buffer[256];
-    int len;
-
-    va_start( args, fmt );
-    len = wld_vsprintf(buffer, fmt, args );
-    va_end( args );
-    wld_write(2, buffer, len);
-    wld_exit(1);
-}
-
 #ifdef DUMP_AUX_INFO
 /*
  *  Dump interesting bits of the ELF auxv_t structure that is passed
@@ -1120,67 +1049,6 @@ found:
     return (void *)(symtab[idx].st_value + map->l_addr);
 }
 
-/*
- *  preload_reserve
- *
- * Reserve a range specified in string format
- */
-static void preload_reserve( const char *str )
-{
-    const char *p;
-    unsigned long result = 0;
-    void *start = NULL, *end = NULL;
-    int i, first = 1;
-
-    for (p = str; *p; p++)
-    {
-        if (*p >= '0' && *p <= '9') result = result * 16 + *p - '0';
-        else if (*p >= 'a' && *p <= 'f') result = result * 16 + *p - 'a' + 10;
-        else if (*p >= 'A' && *p <= 'F') result = result * 16 + *p - 'A' + 10;
-        else if (*p == '-')
-        {
-            if (!first) goto error;
-            start = (void *)(result & ~page_mask);
-            result = 0;
-            first = 0;
-        }
-        else goto error;
-    }
-    if (!first) end = (void *)((result + page_mask) & ~page_mask);
-    else if (result) goto error;  /* single value '0' is allowed */
-
-    /* sanity checks */
-    if (end <= start) start = end = NULL;
-    else if ((char *)end > preloader_start &&
-             (char *)start <= preloader_end)
-    {
-        wld_printf( "WINEPRELOADRESERVE range %p-%p overlaps preloader %p-%p\n",
-                     start, end, preloader_start, preloader_end );
-        start = end = NULL;
-    }
-
-    /* check for overlap with low memory areas */
-    for (i = 0; preload_info[i].size; i++)
-    {
-        if ((char *)preload_info[i].addr > (char *)0x00110000) break;
-        if ((char *)end <= (char *)preload_info[i].addr + preload_info[i].size)
-        {
-            start = end = NULL;
-            break;
-        }
-        if ((char *)start < (char *)preload_info[i].addr + preload_info[i].size)
-            start = (char *)preload_info[i].addr + preload_info[i].size;
-    }
-
-    while (preload_info[i].size) i++;
-    preload_info[i].addr = start;
-    preload_info[i].size = (char *)end - (char *)start;
-    return;
-
-error:
-    fatal_error( "invalid WINEPRELOADRESERVE value '%s'\n", str );
-}
-
 /* check if address is in one of the reserved ranges */
 static int is_addr_reserved( const void *addr )
 {
@@ -1374,3 +1242,143 @@ void* wld_start( void **stack )
 
     return (void *)ld_so_map.l_entry;
 }
+
+/*
+ * wld_printf - just the basics
+ *
+ *  %x prints a hex number
+ *  %s prints a string
+ *  %p prints a pointer
+ */
+static int wld_vsprintf(char *buffer, const char *fmt, va_list args )
+{
+    static const char hex_chars[16] = "0123456789abcdef";
+    const char *p = fmt;
+    char *str = buffer;
+    int i;
+
+    while( *p )
+    {
+        if( *p == '%' )
+        {
+            p++;
+            if( *p == 'x' )
+            {
+                unsigned int x = va_arg( args, unsigned int );
+                for (i = 2*sizeof(x) - 1; i >= 0; i--)
+                    *str++ = hex_chars[(x>>(i*4))&0xf];
+            }
+            else if (p[0] == 'l' && p[1] == 'x')
+            {
+                unsigned long x = va_arg( args, unsigned long );
+                for (i = 2*sizeof(x) - 1; i >= 0; i--)
+                    *str++ = hex_chars[(x>>(i*4))&0xf];
+                p++;
+            }
+            else if( *p == 'p' )
+            {
+                unsigned long x = (unsigned long)va_arg( args, void * );
+                for (i = 2*sizeof(x) - 1; i >= 0; i--)
+                    *str++ = hex_chars[(x>>(i*4))&0xf];
+            }
+            else if( *p == 's' )
+            {
+                char *s = va_arg( args, char * );
+                while(*s)
+                    *str++ = *s++;
+            }
+            else if( *p == 0 )
+                break;
+            p++;
+        }
+        *str++ = *p++;
+    }
+    *str = 0;
+    return str - buffer;
+}
+
+static __attribute__((format(printf,1,2))) void wld_printf(const char *fmt, ... )
+{
+    va_list args;
+    char buffer[256];
+    int len;
+
+    va_start( args, fmt );
+    len = wld_vsprintf(buffer, fmt, args );
+    va_end( args );
+    wld_write(2, buffer, len);
+}
+
+static __attribute__((noreturn,format(printf,1,2))) void fatal_error(const char *fmt, ... )
+{
+    va_list args;
+    char buffer[256];
+    int len;
+
+    va_start( args, fmt );
+    len = wld_vsprintf(buffer, fmt, args );
+    va_end( args );
+    wld_write(2, buffer, len);
+    wld_exit(1);
+}
+
+/*
+ *  preload_reserve
+ *
+ * Reserve a range specified in string format
+ */
+static void preload_reserve( const char *str )
+{
+    const char *p;
+    unsigned long result = 0;
+    void *start = NULL, *end = NULL;
+    int i, first = 1;
+
+    for (p = str; *p; p++)
+    {
+        if (*p >= '0' && *p <= '9') result = result * 16 + *p - '0';
+        else if (*p >= 'a' && *p <= 'f') result = result * 16 + *p - 'a' + 10;
+        else if (*p >= 'A' && *p <= 'F') result = result * 16 + *p - 'A' + 10;
+        else if (*p == '-')
+        {
+            if (!first) goto error;
+            start = (void *)(result & ~page_mask);
+            result = 0;
+            first = 0;
+        }
+        else goto error;
+    }
+    if (!first) end = (void *)((result + page_mask) & ~page_mask);
+    else if (result) goto error;  /* single value '0' is allowed */
+
+    /* sanity checks */
+    if (end <= start) start = end = NULL;
+    else if ((char *)end > preloader_start &&
+             (char *)start <= preloader_end)
+    {
+        wld_printf( "WINEPRELOADRESERVE range %p-%p overlaps preloader %p-%p\n",
+                     start, end, preloader_start, preloader_end );
+        start = end = NULL;
+    }
+
+    /* check for overlap with low memory areas */
+    for (i = 0; preload_info[i].size; i++)
+    {
+        if ((char *)preload_info[i].addr > (char *)0x00110000) break;
+        if ((char *)end <= (char *)preload_info[i].addr + preload_info[i].size)
+        {
+            start = end = NULL;
+            break;
+        }
+        if ((char *)start < (char *)preload_info[i].addr + preload_info[i].size)
+            start = (char *)preload_info[i].addr + preload_info[i].size;
+    }
+
+    while (preload_info[i].size) i++;
+    preload_info[i].addr = start;
+    preload_info[i].size = (char *)end - (char *)start;
+    return;
+
+error:
+    fatal_error( "invalid WINEPRELOADRESERVE value '%s'\n", str );
+}
-- 
2.10.2




More information about the wine-devel mailing list