summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2019-08-03 16:14:26 +0000
committermidipix <writeonce@midipix.org>2019-08-03 16:14:26 +0000
commit3d4ab416844793fb1b4fc28ad966cb125d19e441 (patch)
treed3c5197d912d664726b232b55aa2c1fdf3728b65 /src
parent831753b17817e33d06c841be66e48be1b05dba54 (diff)
downloadmmglue-3d4ab416844793fb1b4fc28ad966cb125d19e441.tar.bz2
mmglue-3d4ab416844793fb1b4fc28ad966cb125d19e441.tar.xz
midipix targets: __init_tls(): added __thread_list_lock support.
Diffstat (limited to 'src')
-rw-r--r--src/arch/nt32/crt_glue.c19
-rw-r--r--src/arch/nt64/crt_glue.c19
2 files changed, 36 insertions, 2 deletions
diff --git a/src/arch/nt32/crt_glue.c b/src/arch/nt32/crt_glue.c
index a710c39..6fd9919 100644
--- a/src/arch/nt32/crt_glue.c
+++ b/src/arch/nt32/crt_glue.c
@@ -6,6 +6,8 @@
#include "psxglue.h"
#include "pthread_impl.h"
+volatile int __thread_list_lock;
+
extern const struct __ldso_vtbl * __ldso_vtbl;
extern const struct __psx_vtbl * __psx_vtbl;
extern const struct __seh_vtbl * __eh_vtbl;
@@ -44,7 +46,6 @@ void __init_tls (size_t * auxv)
T.pt.self = &T.pt;
T.pt.locale = &libc.global_locale;
- T.pt.tid = __syscall(SYS_set_tid_address, &T.pt.tid);
T.pt.detach_state = DT_JOINABLE;
T.pt.locale = &libc.global_locale;
@@ -52,6 +53,22 @@ void __init_tls (size_t * auxv)
libc.can_do_threads = 1;
libc.tls_size = sizeof(struct __tls);
+
+#if defined(__LIBC_TD_TID_ADDR_TID)
+ T.pt.tid = __syscall(SYS_set_tid_address, &T.pt.tid);
+#elif defined(__LIBC_TD_TID_ADDR_JOIN_FUTEX)
+ T.pt.join_futex = -1;
+ T.pt.tid = __syscall(SYS_set_tid_address, &T.pt.join_futex);
+#elif defined(__LIBC_TD_TID_ADDR_DETACH_STATE)
+ T.pt.tid = __syscall(SYS_set_tid_address, &T.pt.detach_state);
+#elif defined(__LIBC_TD_TID_ADDR_THREAD_LIST_LOCK)
+ T.pt.tid = __syscall(SYS_set_tid_address, &T.pt.detach_state);
+ T.pt.next = &T.pt;
+ T.pt.prev = &T.pt;
+#else
+ #error could not detect tid address logic.
+#endif
+
};
void __libc_entry_routine(
diff --git a/src/arch/nt64/crt_glue.c b/src/arch/nt64/crt_glue.c
index a710c39..6fd9919 100644
--- a/src/arch/nt64/crt_glue.c
+++ b/src/arch/nt64/crt_glue.c
@@ -6,6 +6,8 @@
#include "psxglue.h"
#include "pthread_impl.h"
+volatile int __thread_list_lock;
+
extern const struct __ldso_vtbl * __ldso_vtbl;
extern const struct __psx_vtbl * __psx_vtbl;
extern const struct __seh_vtbl * __eh_vtbl;
@@ -44,7 +46,6 @@ void __init_tls (size_t * auxv)
T.pt.self = &T.pt;
T.pt.locale = &libc.global_locale;
- T.pt.tid = __syscall(SYS_set_tid_address, &T.pt.tid);
T.pt.detach_state = DT_JOINABLE;
T.pt.locale = &libc.global_locale;
@@ -52,6 +53,22 @@ void __init_tls (size_t * auxv)
libc.can_do_threads = 1;
libc.tls_size = sizeof(struct __tls);
+
+#if defined(__LIBC_TD_TID_ADDR_TID)
+ T.pt.tid = __syscall(SYS_set_tid_address, &T.pt.tid);
+#elif defined(__LIBC_TD_TID_ADDR_JOIN_FUTEX)
+ T.pt.join_futex = -1;
+ T.pt.tid = __syscall(SYS_set_tid_address, &T.pt.join_futex);
+#elif defined(__LIBC_TD_TID_ADDR_DETACH_STATE)
+ T.pt.tid = __syscall(SYS_set_tid_address, &T.pt.detach_state);
+#elif defined(__LIBC_TD_TID_ADDR_THREAD_LIST_LOCK)
+ T.pt.tid = __syscall(SYS_set_tid_address, &T.pt.detach_state);
+ T.pt.next = &T.pt;
+ T.pt.prev = &T.pt;
+#else
+ #error could not detect tid address logic.
+#endif
+
};
void __libc_entry_routine(