Date: Tue, 2 Sep 2003 19:50:04 -0700 (PDT) From: Daniel Eischen <deischen@FreeBSD.org> To: FreeBSD-gnats-submit@FreeBSD.org Subject: ports/56358: multimedia/mplayer doesn't work with libkse/libthr Message-ID: <200309030250.h832o4Hr081775@freefall.freebsd.org> Resent-Message-ID: <200309030250.h832oFHb081801@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 56358 >Category: ports >Synopsis: multimedia/mplayer doesn't work with libkse/libthr >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-ports-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Tue Sep 02 19:50:15 PDT 2003 >Closed-Date: >Last-Modified: >Originator: Daniel Eischen >Release: FreeBSD 5.0-current i386 >Organization: Self >Environment: FreeBSD vespa 5.1-CURRENT FreeBSD 5.1-CURRENT #37: Fri Aug 8 16:05:12 EDT 2003 root@vespa:/opt/FreeBSD/obj/opt/FreeBSD/stable/src/sys/vespa i386 >Description: mplayer uses static ldt assignments which don't work with our new thread libraries. -current has a new interface for dynamic ldt assignments to let applications use ldts and still work with our thread libraries. >How-To-Repeat: run mplayer under a recent -current kernel with /etc/libmap.conf pointed to libkse. >Fix: Add this patch to multimedia/mplayer/files/patch-loader-ldt_keeper.c: --- loader/ldt_keeper.c.orig Sun Nov 17 12:41:19 2002 +++ loader/ldt_keeper.c Tue Sep 2 17:55:21 2003 @@ -88,11 +88,16 @@ #define LDT_SEL(idx) ((idx) << 3 | 1 << 2 | 3) /* i got this value from wine sources, it's the first free LDT entry */ +#if defined(__FreeBSD__) && defined(LDT_AUTO_ALLOC) +#define TEB_SEL_IDX LDT_AUTO_ALLOC +#endif + #ifndef TEB_SEL_IDX #define TEB_SEL_IDX 17 #endif -#define TEB_SEL LDT_SEL(TEB_SEL_IDX) +static unsigned int fs_ldt = TEB_SEL_IDX; + /** * here is a small logical problem with Restore for multithreaded programs - @@ -104,8 +109,10 @@ #endif void Setup_FS_Segment(void) { + unsigned int ldt_desc = LDT_SEL(fs_ldt); + __asm__ __volatile__( - "movl %0,%%eax; movw %%ax, %%fs" : : "i" (TEB_SEL) + "movl %0,%%eax; movw %%ax, %%fs" : : "r" (ldt_desc) ); } @@ -211,7 +218,13 @@ unsigned long d[2]; LDT_EntryToBytes( d, &array ); +#if defined(__FreeBSD__) && defined(LDT_AUTO_ALLOC) + ret = i386_set_ldt(LDT_AUTO_ALLOC, (union descriptor *)d, 1); + array.entry_number = ret; + fs_ldt = ret; +#else ret = i386_set_ldt(array.entry_number, (union descriptor *)d, 1); +#endif if (ret < 0) { perror("install_fs"); @@ -224,7 +237,7 @@ #if defined(__svr4__) { struct ssd ssd; - ssd.sel = TEB_SEL; + ssd.sel = LDT_SEL(TEB_SEL_IDX); ssd.bo = array.base_addr; ssd.ls = array.limit - array.base_addr; ssd.acc1 = ((array.read_exec_only == 0) << 1) | >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200309030250.h832o4Hr081775>