# HG changeset patch # User komh # Date 1265938694 0 # Node ID 09b72a74d6da3b536eb8dcb5532c722f73b2d668 # Parent e68460fb76939515ba764014e32786c3251831a5 Add win32 loader support for OS/2 diff -r e68460fb7693 -r 09b72a74d6da configure --- 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 diff -r e68460fb7693 -r 09b72a74d6da loader/ldt_keeper.c --- 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(); diff -r e68460fb7693 -r 09b72a74d6da loader/module.c --- 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);