From e9cce27e7a9e0a352124557c122f4a34839ed9ed Mon Sep 17 00:00:00 2001 From: milek7 Date: Thu, 8 Feb 2024 21:16:23 +0100 Subject: [PATCH] Add support for pthread_getattr_np --- Makefile | 1 + .../wasm32-wasip1-threads/defined-symbols.txt | 1 + libc-top-half/musl/src/env/__init_tls.c | 36 +++++++++++++------ .../musl/src/thread/pthread_getattr_np.c | 6 ++++ 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index c1a1ad27e..9137d996d 100644 --- a/Makefile +++ b/Makefile @@ -258,6 +258,7 @@ LIBC_TOP_HALF_MUSL_SOURCES += \ thread/pthread_create.c \ thread/pthread_detach.c \ thread/pthread_equal.c \ + thread/pthread_getattr_np.c \ thread/pthread_getspecific.c \ thread/pthread_join.c \ thread/pthread_key_create.c \ diff --git a/expected/wasm32-wasip1-threads/defined-symbols.txt b/expected/wasm32-wasip1-threads/defined-symbols.txt index 22d6fec60..f3fc6d4a7 100644 --- a/expected/wasm32-wasip1-threads/defined-symbols.txt +++ b/expected/wasm32-wasip1-threads/defined-symbols.txt @@ -1010,6 +1010,7 @@ pthread_condattr_setpshared pthread_create pthread_detach pthread_equal +pthread_getattr_np pthread_getspecific pthread_join pthread_key_create diff --git a/libc-top-half/musl/src/env/__init_tls.c b/libc-top-half/musl/src/env/__init_tls.c index c3e407c87..4f4c22171 100644 --- a/libc-top-half/musl/src/env/__init_tls.c +++ b/libc-top-half/musl/src/env/__init_tls.c @@ -31,25 +31,35 @@ extern unsigned char __global_base; extern weak unsigned char __stack_high; extern weak unsigned char __stack_low; -static inline void setup_default_stack_size() +struct stack_bounds { + void *base; + size_t size; +}; + +static inline struct stack_bounds get_stack_bounds() { - ptrdiff_t stack_size; + struct stack_bounds bounds; - if (&__stack_high) - stack_size = &__stack_high - &__stack_low; - else { + if (&__stack_high) { + bounds.base = &__stack_high; + bounds.size = &__stack_high - &__stack_low; + } else { unsigned char *sp; __asm__( ".globaltype __stack_pointer, i32\n" "global.get __stack_pointer\n" "local.set %0\n" : "=r"(sp)); - stack_size = sp > &__global_base ? &__heap_base - &__data_end : (ptrdiff_t)&__global_base; + if (sp > &__global_base) { + bounds.base = &__heap_base; + bounds.size = &__heap_base - &__data_end; + } else { + bounds.base = &__global_base; + bounds.size = (size_t)&__global_base; + } } - __default_stacksize = - stack_size < DEFAULT_STACK_MAX ? - stack_size : DEFAULT_STACK_MAX; + return bounds; } void __wasi_init_tp() { @@ -68,8 +78,14 @@ int __init_tp(void *p) td->detach_state = DT_JOINABLE; td->tid = __syscall(SYS_set_tid_address, &__thread_list_lock); #else - setup_default_stack_size(); + struct stack_bounds bounds = get_stack_bounds(); + __default_stacksize = + bounds.size < DEFAULT_STACK_MAX ? + bounds.size : DEFAULT_STACK_MAX; td->detach_state = DT_JOINABLE; + td->stack = bounds.base; + td->stack_size = bounds.size; + td->guard_size = 0; /* * Initialize the TID to a value which doesn't conflict with * host-allocated TIDs, so that TID-based locks can work. diff --git a/libc-top-half/musl/src/thread/pthread_getattr_np.c b/libc-top-half/musl/src/thread/pthread_getattr_np.c index 2881831f8..c23e5d75d 100644 --- a/libc-top-half/musl/src/thread/pthread_getattr_np.c +++ b/libc-top-half/musl/src/thread/pthread_getattr_np.c @@ -1,7 +1,9 @@ #define _GNU_SOURCE #include "pthread_impl.h" #include "libc.h" +#ifdef __wasilibc_unmodified_upstream #include +#endif int pthread_getattr_np(pthread_t t, pthread_attr_t *a) { @@ -12,6 +14,7 @@ int pthread_getattr_np(pthread_t t, pthread_attr_t *a) a->_a_stackaddr = (uintptr_t)t->stack; a->_a_stacksize = t->stack_size; } else { +#ifdef __wasilibc_unmodified_upstream char *p = (void *)libc.auxv; size_t l = PAGE_SIZE; p += -(uintptr_t)p & PAGE_SIZE-1; @@ -19,6 +22,9 @@ int pthread_getattr_np(pthread_t t, pthread_attr_t *a) while (mremap(p-l-PAGE_SIZE, PAGE_SIZE, 2*PAGE_SIZE, 0)==MAP_FAILED && errno==ENOMEM) l += PAGE_SIZE; a->_a_stacksize = l; +#else + return ENOSYS; +#endif } return 0; }