Mercurial > mplayer.hg
changeset 10821:e9e5dca4af9e
FreeBSD 5.0 (libkse/libthr) support by Dan Eischen <eischen@vigrid.com>
author | alex |
---|---|
date | Sat, 06 Sep 2003 00:14:08 +0000 |
parents | 4c4bb509e8a2 |
children | 6377c7d0459e |
files | loader/ldt_keeper.c |
diffstat | 1 files changed, 16 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/loader/ldt_keeper.c Fri Sep 05 23:50:56 2003 +0000 +++ b/loader/ldt_keeper.c Sat Sep 06 00:14:08 2003 +0000 @@ -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) |