From fe2716df216ec4a31818f6f1c0a47d64454a23f0 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 29 Jun 2021 17:56:04 +0200 Subject: [PATCH] Kernel: Disable __thread and TLS on x86_64 for now They're not yet properly supported. --- CMakeLists.txt | 5 +++++ Kernel/Syscalls/mmap.cpp | 2 +- Userland/Libraries/LibC/pthread_tls.cpp | 5 ++++- Userland/Libraries/LibDl/dlfcn.cpp | 12 ++++++++++-- Userland/Libraries/LibPthread/pthread.cpp | 10 ++++++++-- 5 files changed, 28 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 992292e470c..62fd60c7534 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,6 +93,11 @@ set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) +if("${SERENITY_ARCH}" STREQUAL "x86_64") + # FIXME: Implement TLS support and get rid of this + add_compile_definitions(NO_TLS X86_64_NO_TLS) +endif() + add_compile_options(-Wno-literal-suffix) if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") add_compile_options(-fconcepts) diff --git a/Kernel/Syscalls/mmap.cpp b/Kernel/Syscalls/mmap.cpp index f88bc4d51e8..dd0cc612044 100644 --- a/Kernel/Syscalls/mmap.cpp +++ b/Kernel/Syscalls/mmap.cpp @@ -612,7 +612,7 @@ KResultOr Process::sys$allocate_tls(Userspace initial_data tls_descriptor.set_base(main_thread->thread_specific_data()); tls_descriptor.set_limit(main_thread->thread_specific_region_size()); #else - TODO(); + dbgln("FIXME: Not setting FS_BASE for process."); #endif return m_master_tls_region.unsafe_ptr()->vaddr().get(); diff --git a/Userland/Libraries/LibC/pthread_tls.cpp b/Userland/Libraries/LibC/pthread_tls.cpp index 6c32260dcd4..393964a7ed1 100644 --- a/Userland/Libraries/LibC/pthread_tls.cpp +++ b/Userland/Libraries/LibC/pthread_tls.cpp @@ -26,7 +26,10 @@ struct SpecificTable { static KeyTable s_keys; -__thread SpecificTable t_specifics; +# ifndef X86_64_NO_TLS +__thread +# endif + SpecificTable t_specifics; int __pthread_key_create(pthread_key_t* key, KeyDestructor destructor) { diff --git a/Userland/Libraries/LibDl/dlfcn.cpp b/Userland/Libraries/LibDl/dlfcn.cpp index 077f62a101e..861df60476d 100644 --- a/Userland/Libraries/LibDl/dlfcn.cpp +++ b/Userland/Libraries/LibDl/dlfcn.cpp @@ -11,8 +11,16 @@ #include // FIXME: use thread_local and a String once TLS works -__thread char* s_dlerror_text = NULL; -__thread bool s_dlerror_retrieved = false; +#ifndef X86_64_NO_TLS +__thread +#endif + char* s_dlerror_text + = NULL; +#ifndef X86_64_NO_TLS +__thread +#endif + bool s_dlerror_retrieved + = false; static void store_error(const String& error) { diff --git a/Userland/Libraries/LibPthread/pthread.cpp b/Userland/Libraries/LibPthread/pthread.cpp index 763de5b74da..831145d106b 100644 --- a/Userland/Libraries/LibPthread/pthread.cpp +++ b/Userland/Libraries/LibPthread/pthread.cpp @@ -33,8 +33,14 @@ static constexpr size_t required_stack_alignment = 4 * MiB; static constexpr size_t highest_reasonable_guard_size = 32 * PAGE_SIZE; static constexpr size_t highest_reasonable_stack_size = 8 * MiB; // That's the default in Ubuntu? -__thread void* s_stack_location; -__thread size_t s_stack_size; +#ifndef X86_64_NO_TLS +__thread +#endif + void* s_stack_location; +#ifndef X86_64_NO_TLS +__thread +#endif + size_t s_stack_size; #define __RETURN_PTHREAD_ERROR(rc) \ return ((rc) < 0 ? -(rc) : 0)