diff --git a/libc/calls/ucontext.c b/libc/calls/ucontext.c index a6227663bbd..d5ba75a94cc 100644 --- a/libc/calls/ucontext.c +++ b/libc/calls/ucontext.c @@ -34,7 +34,7 @@ int __tailcontext(const ucontext_t *); * @see getcontext() */ int setcontext(const ucontext_t *uc) { - if (IsWindows()) { + if (IsWindows() || IsMetal()) { atomic_store_explicit(&__get_tls()->tib_sigmask, uc->uc_sigmask, memory_order_release); } else { @@ -44,7 +44,7 @@ int setcontext(const ucontext_t *uc) { } int __getcontextsig(ucontext_t *uc) { - if (IsWindows()) { + if (IsWindows() || IsMetal()) { uc->uc_sigmask = atomic_load_explicit(&__get_tls()->tib_sigmask, memory_order_acquire); return 0; @@ -54,7 +54,7 @@ int __getcontextsig(ucontext_t *uc) { } int __swapcontextsig(ucontext_t *x, const ucontext_t *y) { - if (IsWindows()) { + if (IsWindows() || IsMetal()) { x->uc_sigmask = atomic_exchange_explicit( &__get_tls()->tib_sigmask, y->uc_sigmask, memory_order_acquire); return 0; diff --git a/libc/intrin/mman.greg.c b/libc/intrin/mman.greg.c index cb9274a1b56..8d7f17449a5 100644 --- a/libc/intrin/mman.greg.c +++ b/libc/intrin/mman.greg.c @@ -45,7 +45,7 @@ #ifdef __x86_64__ #define INVERT(x) (BANE + PHYSICAL((uintptr_t)(x))) -#define NOPAGE ((uint64_t) - 1) +#define NOPAGE ((uint64_t)-1) #define APE_STACK_VADDR \ ({ \ @@ -69,9 +69,9 @@ texthead uint64_t __new_page(struct mman *mm) { if (p != NOPAGE) { uint64_t q; struct ReclaimedPage *rp = (struct ReclaimedPage *)(BANE + p); - unassert(p == (p & PAGE_TA)); + /* unassert(p == (p & PAGE_TA)); */ q = rp->next; - unassert(q == (q & PAGE_TA) || q == NOPAGE); + /* unassert(q == (q & PAGE_TA) || q == NOPAGE); */ mm->frp = q; return p; } @@ -200,7 +200,7 @@ void __ref_pages(struct mman *mm, uint64_t *pml4t, uint64_t ps, uint64_t size) { */ static void __reclaim_page(struct mman *mm, uint64_t p) { struct ReclaimedPage *rp = (struct ReclaimedPage *)(BANE + p); - unassert(p == (p & PAGE_TA)); + /* unassert(p == (p & PAGE_TA)); */ rp->next = mm->frp; mm->frp = p; } diff --git a/libc/intrin/pthread_mutex_lock.c b/libc/intrin/pthread_mutex_lock.c index 0138974e62a..6fd2c6bfbb8 100644 --- a/libc/intrin/pthread_mutex_lock.c +++ b/libc/intrin/pthread_mutex_lock.c @@ -25,7 +25,6 @@ #include "libc/runtime/internal.h" #include "libc/thread/lock.h" #include "libc/thread/thread.h" -#include "libc/thread/tls.h" #include "third_party/nsync/mu.h" /** diff --git a/libc/intrin/sig.c b/libc/intrin/sig.c index 2bffeeb7b10..8679b811ddc 100644 --- a/libc/intrin/sig.c +++ b/libc/intrin/sig.c @@ -27,9 +27,12 @@ struct Signals __sig; sigset_t __sig_block(void) { - if (IsWindows()) { - return atomic_exchange_explicit(&__get_tls()->tib_sigmask, -1, - memory_order_acquire); + if (IsWindows() || IsMetal()) { + if (__tls_enabled) + return atomic_exchange_explicit(&__get_tls()->tib_sigmask, -1, + memory_order_acquire); + else + return 0; } else { sigset_t res, neu = -1; sys_sigprocmask(SIG_SETMASK, &neu, &res); @@ -38,10 +41,12 @@ sigset_t __sig_block(void) { } void __sig_unblock(sigset_t m) { - if (IsWindows()) { - atomic_store_explicit(&__get_tls()->tib_sigmask, m, memory_order_release); - if (_weaken(__sig_check)) { - _weaken(__sig_check)(); + if (IsWindows() || IsMetal()) { + if (__tls_enabled) { + atomic_store_explicit(&__get_tls()->tib_sigmask, m, memory_order_release); + if (_weaken(__sig_check)) { + _weaken(__sig_check)(); + } } } else { sys_sigprocmask(SIG_SETMASK, &m, 0); diff --git a/libc/runtime/set_tls.c b/libc/runtime/set_tls.c index 0f54e8d1285..a1d49789639 100644 --- a/libc/runtime/set_tls.c +++ b/libc/runtime/set_tls.c @@ -57,7 +57,7 @@ dontinstrument textstartup void __set_tls(struct CosmoTib *tib) { uint64_t val = (uint64_t)tib; asm volatile("wrmsr" : /* no outputs */ - : "c"(MSR_IA32_FS_BASE), "a"((uint32_t)val), + : "c"(MSR_IA32_GS_BASE), "a"((uint32_t)val), "d"((uint32_t)(val >> 32))); } #elif defined(__aarch64__) diff --git a/libc/thread/pthread_create.c b/libc/thread/pthread_create.c index 9e01f26f62a..740d43cef01 100644 --- a/libc/thread/pthread_create.c +++ b/libc/thread/pthread_create.c @@ -118,7 +118,7 @@ static int PosixThread(void *arg, int tid) { // set long jump handler so pthread_exit can bring control back here if (!setjmp(pt->pt_exiter)) { sigdelset(&pt->pt_attr.__sigmask, SIGTHR); - if (IsWindows()) { + if (IsWindows() || IsMetal()) { atomic_store_explicit(&__get_tls()->tib_sigmask, pt->pt_attr.__sigmask, memory_order_release); } else {