From 07b6814a07b3c94bf8b4ba2e2a906175fbf89ffd Mon Sep 17 00:00:00 2001 From: midipix Date: Thu, 31 Jan 2019 19:56:08 +0000 Subject: psxglue.h: update struct __ldso_vtbl (psxscl) to match member names in psxscl. tls: place __copy_tls() and __reset_tls() in designated translation units. --- src/env/nt32/__copy_tls.c | 30 ++++++++++++++++++++++++++++++ src/env/nt32/__reset_tls.c | 13 +++++++++++++ src/env/nt32/__reset_tls.s | 0 src/env/nt64/__copy_tls.c | 30 ++++++++++++++++++++++++++++++ src/env/nt64/__reset_tls.c | 13 +++++++++++++ src/env/nt64/__reset_tls.s | 0 src/ldso/nt32/dynlink.c | 27 --------------------------- src/ldso/nt64/dynlink.c | 27 --------------------------- 8 files changed, 86 insertions(+), 54 deletions(-) create mode 100644 src/env/nt32/__copy_tls.c create mode 100644 src/env/nt32/__reset_tls.c delete mode 100644 src/env/nt32/__reset_tls.s create mode 100644 src/env/nt64/__copy_tls.c create mode 100644 src/env/nt64/__reset_tls.c delete mode 100644 src/env/nt64/__reset_tls.s (limited to 'src') 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 +#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 +#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 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 +#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 +#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 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); -- cgit v1.2.3