From 216089c7a1d1b20d14a3c278aa32c43b93f21971 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Holz?= Date: Sat, 13 Apr 2024 10:26:50 +0200 Subject: [PATCH] Kernel: Add a Thread member for arch-specific data This will be used to store the fs_base value on x86-64, which is needed for thread-local storage. --- Kernel/Arch/ArchSpecificThreadData.h | 19 +++++++++++++++++++ Kernel/Arch/aarch64/ArchSpecificThreadData.h | 16 ++++++++++++++++ Kernel/Arch/riscv64/ArchSpecificThreadData.h | 16 ++++++++++++++++ Kernel/Arch/x86_64/ArchSpecificThreadData.h | 16 ++++++++++++++++ Kernel/Tasks/Thread.cpp | 1 + Kernel/Tasks/Thread.h | 4 ++++ 6 files changed, 72 insertions(+) create mode 100644 Kernel/Arch/ArchSpecificThreadData.h create mode 100644 Kernel/Arch/aarch64/ArchSpecificThreadData.h create mode 100644 Kernel/Arch/riscv64/ArchSpecificThreadData.h create mode 100644 Kernel/Arch/x86_64/ArchSpecificThreadData.h diff --git a/Kernel/Arch/ArchSpecificThreadData.h b/Kernel/Arch/ArchSpecificThreadData.h new file mode 100644 index 0000000000..3a03a17b00 --- /dev/null +++ b/Kernel/Arch/ArchSpecificThreadData.h @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2024, Sönke Holz + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +#if ARCH(X86_64) +# include +#elif ARCH(AARCH64) +# include +#elif ARCH(RISCV64) +# include +#else +# error Unknown architecture +#endif diff --git a/Kernel/Arch/aarch64/ArchSpecificThreadData.h b/Kernel/Arch/aarch64/ArchSpecificThreadData.h new file mode 100644 index 0000000000..5dbe07b8d2 --- /dev/null +++ b/Kernel/Arch/aarch64/ArchSpecificThreadData.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2024, Sönke Holz + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Kernel { + +struct ArchSpecificThreadData { +}; + +} diff --git a/Kernel/Arch/riscv64/ArchSpecificThreadData.h b/Kernel/Arch/riscv64/ArchSpecificThreadData.h new file mode 100644 index 0000000000..5dbe07b8d2 --- /dev/null +++ b/Kernel/Arch/riscv64/ArchSpecificThreadData.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2024, Sönke Holz + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Kernel { + +struct ArchSpecificThreadData { +}; + +} diff --git a/Kernel/Arch/x86_64/ArchSpecificThreadData.h b/Kernel/Arch/x86_64/ArchSpecificThreadData.h new file mode 100644 index 0000000000..5dbe07b8d2 --- /dev/null +++ b/Kernel/Arch/x86_64/ArchSpecificThreadData.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2024, Sönke Holz + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Kernel { + +struct ArchSpecificThreadData { +}; + +} diff --git a/Kernel/Tasks/Thread.cpp b/Kernel/Tasks/Thread.cpp index 8596c3a6c7..67aeec0f05 100644 --- a/Kernel/Tasks/Thread.cpp +++ b/Kernel/Tasks/Thread.cpp @@ -1210,6 +1210,7 @@ ErrorOr> Thread::clone(NonnullRefPtr process) clone->m_signal_mask = m_signal_mask; clone->m_fpu_state = m_fpu_state; clone->m_thread_specific_data = m_thread_specific_data; + clone->m_arch_specific_data = m_arch_specific_data; return clone; } diff --git a/Kernel/Tasks/Thread.h b/Kernel/Tasks/Thread.h index c73cc8e331..85129a9edd 100644 --- a/Kernel/Tasks/Thread.h +++ b/Kernel/Tasks/Thread.h @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -790,6 +791,8 @@ public: StringView state_string() const; VirtualAddress thread_specific_data() const { return m_thread_specific_data; } + ArchSpecificThreadData& arch_specific_data() { return m_arch_specific_data; } + ArchSpecificThreadData const& arch_specific_data() const { return m_arch_specific_data; } ALWAYS_INLINE void yield_if_should_be_stopped() { @@ -1193,6 +1196,7 @@ private: IntrusiveListNode m_blocked_threads_list_node; LockRank m_lock_rank_mask {}; bool m_allocation_enabled { true }; + ArchSpecificThreadData m_arch_specific_data; // FIXME: remove this after annihilating Process::m_big_lock IntrusiveListNode m_big_lock_blocked_threads_list_node;