1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 15:17:36 +00:00

Kernel/aarch64: Implement Thread Local Storage

This commit adds Processor::set_thread_specific_data, and this function
is used to factor out architecture specific implementation of setting
the thread specific data. This function is implemented for
aarch64 and x86_64, and the callsites are changed to use this function
instead.
This commit is contained in:
Timon Kruiper 2023-02-15 19:49:37 +01:00 committed by Jelle Raaijmakers
parent 7d0917f50b
commit cfd73e5d9f
6 changed files with 24 additions and 6 deletions

View file

@ -37,6 +37,11 @@ inline void set_sp_el1(FlatPtr sp_el1)
asm("msr sp_el1, %[value]" ::[value] "r"(sp_el1));
}
inline void set_tpidr_el0(FlatPtr tpidr_el0)
{
asm("msr tpidr_el0, %[value]" ::[value] "r"(tpidr_el0));
}
inline void flush()
{
asm("dsb ish");

View file

@ -454,6 +454,8 @@ extern "C" void enter_thread_context(Thread* from_thread, Thread* to_thread)
to_thread->set_cpu(Processor::current().id());
Processor::set_thread_specific_data(to_thread->thread_specific_data());
auto in_critical = to_thread->saved_critical();
VERIFY(in_critical > 0);
Processor::restore_critical(in_critical);
@ -466,4 +468,9 @@ StringView Processor::platform_string()
return "aarch64"sv;
}
void Processor::set_thread_specific_data(VirtualAddress thread_specific_data)
{
Aarch64::Asm::set_tpidr_el0(thread_specific_data.get());
}
}

View file

@ -279,6 +279,8 @@ public:
static StringView platform_string();
static void set_thread_specific_data(VirtualAddress thread_specific_data);
private:
Processor(Processor const&) = delete;