diff --git a/Userland/DynamicLoader/CMakeLists.txt b/Userland/DynamicLoader/CMakeLists.txt index d827efd398b..30d7733483b 100644 --- a/Userland/DynamicLoader/CMakeLists.txt +++ b/Userland/DynamicLoader/CMakeLists.txt @@ -10,7 +10,7 @@ file(GLOB LIBC_SOURCES2 "../Libraries/LibC/*/*.cpp") set(ARCH_FOLDER "${SERENITY_ARCH}") file(GLOB LIBC_SOURCES3 "../Libraries/LibC/arch/${ARCH_FOLDER}/*.S") -set(ELF_SOURCES ${ELF_SOURCES} "../Libraries/LibELF/Arch/${ARCH_FOLDER}/entry.S" "../Libraries/LibELF/Arch/${ARCH_FOLDER}/plt_trampoline.S") +set(ELF_SOURCES ${ELF_SOURCES} "../Libraries/LibELF/Arch/${ARCH_FOLDER}/entry.S" "../Libraries/LibELF/Arch/${ARCH_FOLDER}/plt_trampoline.S" "../Libraries/LibELF/Arch/${ARCH_FOLDER}/tls.cpp") set(LIBC_SOURCES3 ${LIBC_SOURCES3} "../Libraries/LibC/arch/${ARCH_FOLDER}/fenv.cpp") if ("${SERENITY_ARCH}" STREQUAL "x86_64") set(LIBC_SOURCES3 ${LIBC_SOURCES3} "../Libraries/LibC/arch/x86_64/memset.cpp") diff --git a/Userland/Libraries/LibC/CMakeLists.txt b/Userland/Libraries/LibC/CMakeLists.txt index 90a638c22cb..74398d0f185 100644 --- a/Userland/Libraries/LibC/CMakeLists.txt +++ b/Userland/Libraries/LibC/CMakeLists.txt @@ -97,7 +97,7 @@ foreach(RELATIVE_HEADER_PATH IN LISTS LIBC_HEADERS) ) endforeach() -file(GLOB ELF_SOURCES CONFIGURE_DEPENDS "../LibELF/*.cpp") +file(GLOB ELF_SOURCES CONFIGURE_DEPENDS "../LibELF/*.cpp" "../LibELF/Arch/${SERENITY_ARCH}/*.cpp") if ("${SERENITY_ARCH}" STREQUAL "aarch64") set(LIBC_SOURCES ${LIBC_SOURCES} "arch/aarch64/fenv.cpp") diff --git a/Userland/Libraries/LibELF/Arch/aarch64/tls.cpp b/Userland/Libraries/LibELF/Arch/aarch64/tls.cpp new file mode 100644 index 00000000000..b7393c14c18 --- /dev/null +++ b/Userland/Libraries/LibELF/Arch/aarch64/tls.cpp @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2024, Sönke Holz + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include + +namespace ELF { + +void set_thread_pointer_register(FlatPtr value) +{ + asm volatile("msr tpidr_el0, %0" ::"r"(value)); +} + +} diff --git a/Userland/Libraries/LibELF/Arch/riscv64/tls.cpp b/Userland/Libraries/LibELF/Arch/riscv64/tls.cpp new file mode 100644 index 00000000000..13971de4199 --- /dev/null +++ b/Userland/Libraries/LibELF/Arch/riscv64/tls.cpp @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2024, Sönke Holz + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include + +namespace ELF { + +void set_thread_pointer_register(FlatPtr value) +{ + asm volatile("mv tp, %0" ::"r"(value)); +} + +} diff --git a/Userland/Libraries/LibELF/Arch/tls.h b/Userland/Libraries/LibELF/Arch/tls.h new file mode 100644 index 00000000000..8fecc33df9c --- /dev/null +++ b/Userland/Libraries/LibELF/Arch/tls.h @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2024, Sönke Holz + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace ELF { + +void set_thread_pointer_register(FlatPtr); + +} diff --git a/Userland/Libraries/LibELF/Arch/x86_64/tls.cpp b/Userland/Libraries/LibELF/Arch/x86_64/tls.cpp new file mode 100644 index 00000000000..5f5f7eb9e94 --- /dev/null +++ b/Userland/Libraries/LibELF/Arch/x86_64/tls.cpp @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2024, Sönke Holz + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace ELF { + +void set_thread_pointer_register(FlatPtr) +{ + TODO(); +} + +}