diff options
author | midipix <writeonce@midipix.org> | 2019-01-31 19:56:08 +0000 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2019-02-19 14:47:45 -0500 |
commit | 07b6814a07b3c94bf8b4ba2e2a906175fbf89ffd (patch) | |
tree | fb774568c51f184786ea100e58cd9d765b82bcf5 /src | |
parent | ca29c23790ef87220b2f74cb6c77d4f40f9cd5b8 (diff) | |
download | mmglue-07b6814a07b3c94bf8b4ba2e2a906175fbf89ffd.tar.bz2 mmglue-07b6814a07b3c94bf8b4ba2e2a906175fbf89ffd.tar.xz |
psxglue.h: update struct __ldso_vtbl (psxscl) to match member names in psxscl.
tls: place __copy_tls() and __reset_tls() in designated translation units.
Diffstat (limited to 'src')
-rw-r--r-- | src/env/nt32/__copy_tls.c | 30 | ||||
-rw-r--r-- | src/env/nt32/__reset_tls.c | 13 | ||||
-rw-r--r-- | src/env/nt32/__reset_tls.s | 0 | ||||
-rw-r--r-- | src/env/nt64/__copy_tls.c | 30 | ||||
-rw-r--r-- | src/env/nt64/__reset_tls.c | 13 | ||||
-rw-r--r-- | src/env/nt64/__reset_tls.s | 0 | ||||
-rw-r--r-- | src/ldso/nt32/dynlink.c | 27 | ||||
-rw-r--r-- | src/ldso/nt64/dynlink.c | 27 |
8 files changed, 86 insertions, 54 deletions
diff --git a/src/env/nt32/__copy_tls.c b/src/env/nt32/__copy_tls.c new file mode 100644 index 0000000..b96f4ed --- /dev/null +++ b/src/env/nt32/__copy_tls.c @@ -0,0 +1,30 @@ +#define _BSD_SOURCE + +#include <unistd.h> +#include "psxglue.h" +#include "pthread_impl.h" + +extern const struct __ldso_vtbl * __ldso_vtbl; +extern const struct __psx_vtbl * __psx_vtbl; + +void *__copy_tls(unsigned char * mem) +{ + /** + * this is always the simple case, since: + * emutls is based on PE named sections; and + * tls allocation and initialization are handled by clone(2) + **/ + + pthread_t td; + uintptr_t addr; + + addr = (uintptr_t)mem; + addr += 0xf; + addr |= 0xf; + addr ^= 0xf; + + td = (struct __pthread *)addr; + td->dtv = 0; + + return td; +} diff --git a/src/env/nt32/__reset_tls.c b/src/env/nt32/__reset_tls.c new file mode 100644 index 0000000..7b6b6a5 --- /dev/null +++ b/src/env/nt32/__reset_tls.c @@ -0,0 +1,13 @@ +#define _BSD_SOURCE + +#include <unistd.h> +#include "psxglue.h" +#include "pthread_impl.h" + +extern const struct __ldso_vtbl * __ldso_vtbl; +extern const struct __psx_vtbl * __psx_vtbl; + +void __reset_tls(void) +{ + __ldso_vtbl->tlsreset(); +} diff --git a/src/env/nt32/__reset_tls.s b/src/env/nt32/__reset_tls.s deleted file mode 100644 index e69de29..0000000 --- a/src/env/nt32/__reset_tls.s +++ /dev/null diff --git a/src/env/nt64/__copy_tls.c b/src/env/nt64/__copy_tls.c new file mode 100644 index 0000000..b96f4ed --- /dev/null +++ b/src/env/nt64/__copy_tls.c @@ -0,0 +1,30 @@ +#define _BSD_SOURCE + +#include <unistd.h> +#include "psxglue.h" +#include "pthread_impl.h" + +extern const struct __ldso_vtbl * __ldso_vtbl; +extern const struct __psx_vtbl * __psx_vtbl; + +void *__copy_tls(unsigned char * mem) +{ + /** + * this is always the simple case, since: + * emutls is based on PE named sections; and + * tls allocation and initialization are handled by clone(2) + **/ + + pthread_t td; + uintptr_t addr; + + addr = (uintptr_t)mem; + addr += 0xf; + addr |= 0xf; + addr ^= 0xf; + + td = (struct __pthread *)addr; + td->dtv = 0; + + return td; +} diff --git a/src/env/nt64/__reset_tls.c b/src/env/nt64/__reset_tls.c new file mode 100644 index 0000000..7b6b6a5 --- /dev/null +++ b/src/env/nt64/__reset_tls.c @@ -0,0 +1,13 @@ +#define _BSD_SOURCE + +#include <unistd.h> +#include "psxglue.h" +#include "pthread_impl.h" + +extern const struct __ldso_vtbl * __ldso_vtbl; +extern const struct __psx_vtbl * __psx_vtbl; + +void __reset_tls(void) +{ + __ldso_vtbl->tlsreset(); +} diff --git a/src/env/nt64/__reset_tls.s b/src/env/nt64/__reset_tls.s deleted file mode 100644 index e69de29..0000000 --- a/src/env/nt64/__reset_tls.s +++ /dev/null diff --git a/src/ldso/nt32/dynlink.c b/src/ldso/nt32/dynlink.c index 6a4f4df..a585fbb 100644 --- a/src/ldso/nt32/dynlink.c +++ b/src/ldso/nt32/dynlink.c @@ -131,33 +131,6 @@ char * dlerror(void) return __ldso_vtbl->dlerror(); } -void __reset_tls(void) -{ - __ldso_vtbl->reset_tls(); -} - -void *__copy_tls(unsigned char * mem) -{ - /** - * this is always the simple case, since: - * emutls is based on PE named sections; and - * tls allocation and initialization are handled by clone(2) - **/ - - pthread_t td; - uintptr_t addr; - - addr = (uintptr_t)mem; - addr >>= 4; - addr <<= 4; - addr += 16; - - td = (struct __pthread *)addr; - td->dtv = 0; - - return td; -} - weak_alias(__dlsym,dlsym); weak_alias(__dladdr,dladdr); weak_alias(__dlinfo,dlinfo); diff --git a/src/ldso/nt64/dynlink.c b/src/ldso/nt64/dynlink.c index 6a4f4df..a585fbb 100644 --- a/src/ldso/nt64/dynlink.c +++ b/src/ldso/nt64/dynlink.c @@ -131,33 +131,6 @@ char * dlerror(void) return __ldso_vtbl->dlerror(); } -void __reset_tls(void) -{ - __ldso_vtbl->reset_tls(); -} - -void *__copy_tls(unsigned char * mem) -{ - /** - * this is always the simple case, since: - * emutls is based on PE named sections; and - * tls allocation and initialization are handled by clone(2) - **/ - - pthread_t td; - uintptr_t addr; - - addr = (uintptr_t)mem; - addr >>= 4; - addr <<= 4; - addr += 16; - - td = (struct __pthread *)addr; - td->dtv = 0; - - return td; -} - weak_alias(__dlsym,dlsym); weak_alias(__dladdr,dladdr); weak_alias(__dlinfo,dlinfo); |