summaryrefslogtreecommitdiffstats
path: root/loader
diff options
context:
space:
mode:
authorkomh <komh@b3059339-0415-0410-9bf9-f77b7e298cf2>2010-02-12 01:38:14 +0000
committerkomh <komh@b3059339-0415-0410-9bf9-f77b7e298cf2>2010-02-12 01:38:14 +0000
commit47f78d28f1298c9feccd2424ffdb211dab6aaf53 (patch)
tree312dbfda924627b0ff60dd1ee82430716733687b /loader
parent592d2e3edfe483d2fac4a7f53955c91cb91b946b (diff)
downloadmpv-47f78d28f1298c9feccd2424ffdb211dab6aaf53.tar.bz2
mpv-47f78d28f1298c9feccd2424ffdb211dab6aaf53.tar.xz
Add win32 loader support for OS/2
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30541 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'loader')
-rw-r--r--loader/ldt_keeper.c3
-rw-r--r--loader/module.c29
2 files changed, 30 insertions, 2 deletions
diff --git a/loader/ldt_keeper.c b/loader/ldt_keeper.c
index d008a2909d..0fcc98d53c 100644
--- a/loader/ldt_keeper.c
+++ b/loader/ldt_keeper.c
@@ -255,6 +255,9 @@ ldt_fs_t* Setup_LDT_Keeper(void)
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();
diff --git a/loader/module.c b/loader/module.c
index 2bce928544..feaab14605 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -744,6 +744,31 @@ static int dump_component(char* name, int type, void* orig, ComponentParameters
#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 @@ static int report_func(void *stack_base, int stack_size, reg386_t *reg, uint32_t
#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);