changeset 30499:09b72a74d6da

Add win32 loader support for OS/2
author komh
date Fri, 12 Feb 2010 01:38:14 +0000
parents e68460fb7693
children 78a2c26a1002
files configure loader/ldt_keeper.c loader/module.c
diffstat 3 files changed, 31 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/configure	Thu Feb 11 23:59:08 2010 +0000
+++ b/configure	Fri Feb 12 01:38:14 2010 +0000
@@ -7129,7 +7129,7 @@
   _real=no
   _res_comment="dynamic loader support needed"
   if test "$_dl" = yes || test "$_win32dll" = yes &&
-     (linux || freebsd || netbsd || openbsd || dragonfly || darwin || win32) ; then
+     (linux || freebsd || netbsd || openbsd || dragonfly || darwin || win32 || os2) ; then
     _real=yes
   fi
 fi
--- a/loader/ldt_keeper.c	Thu Feb 11 23:59:08 2010 +0000
+++ b/loader/ldt_keeper.c	Fri Feb 12 01:38:14 2010 +0000
@@ -255,6 +255,9 @@
 	    printf("Couldn't install fs segment, expect segfault\n");
 	}
     }
+#elif defined(__OS2__)
+    /* convert flat addr to sel idx for LDT_SEL() */
+    fs_ldt = (uintptr_t)fs_seg >> 16;
 #endif
 
     Setup_FS_Segment();
--- a/loader/module.c	Thu Feb 11 23:59:08 2010 +0000
+++ b/loader/module.c	Fri Feb 12 01:38:14 2010 +0000
@@ -744,6 +744,31 @@
 
 #ifdef EMU_QTX_API
 
+#ifdef __OS2__
+uint32_t _System DosQueryMem(void *, uint32_t *, uint32_t *);
+#endif
+
+static int is_invalid_ptr_handle(void *p)
+{
+#ifdef __OS2__
+    uint32_t cb = 1;
+    uint32_t fl;
+
+    if(DosQueryMem(p, &cb, &fl))
+        return 1;
+
+    // Occasionally, ptr with 'EXEC' attr is passed.
+    // On OS/2, however, malloc() never sets 'EXEC' attr.
+    // So ptr with 'EXEC' attr is invalid.
+    if(fl & 0x04)
+        return 1;
+
+    return 0;
+#else
+    return (uint32_t)p >= 0x60000000;
+#endif
+}
+
 static uint32_t ret_array[4096];
 static int ret_i=0;
 
@@ -844,10 +869,10 @@
 #endif
       return 1;
   case 0x15002f: //DisposePtr
-      if(((uint32_t *)stack_base)[1]>=0x60000000)
+      if(is_invalid_ptr_handle(((void **)stack_base)[1]))
           printf("WARNING! Invalid Ptr handle!\n");
       else
-          free((void *)((uint32_t *)stack_base)[1]);
+          free(((void **)stack_base)[1]);
       reg->eax=0;
 #ifdef DEBUG_QTX_API
       printf("%*sLEAVE(%d): EMULATED! 0x%X\n",ret_i*2,"",ret_i, reg->eax);