Kernel: Start working on TLS, add SYS_{SET,GET}_TLS

This commit is contained in:
2025-04-15 23:16:20 +03:00
parent 254fd80088
commit 4bcd3ed86f
11 changed files with 60 additions and 3 deletions

View File

@@ -26,12 +26,20 @@ namespace Kernel
gdt->write_entry(0x20, 0x00000000, 0xFFFFF, 0xF2, data_flags); // user data
#if ARCH(i686)
gdt->write_entry(0x28, reinterpret_cast<uint32_t>(processor), sizeof(Processor), 0x92, 0x4); // processor data
gdt->write_entry(0x30, 0x00000000, 0x00000, 0x00, 0x0); // tls
#endif
gdt->write_tss();
return gdt;
}
#if ARCH(i686)
void GDT::set_tls(uintptr_t addr)
{
write_entry(0x30, addr, 0xFFFF, 0xF2, 0xC);
}
#endif
void GDT::write_entry(uint8_t offset, uint32_t base, uint32_t limit, uint8_t access, uint8_t flags)
{
ASSERT(offset % sizeof(SegmentDescriptor) == 0);

View File

@@ -2037,6 +2037,18 @@ namespace Kernel
return 0;
}
BAN::ErrorOr<long> Process::sys_set_tls(void* addr)
{
Thread::current().set_tls(reinterpret_cast<vaddr_t>(addr));
Processor::load_tls();
return 0;
}
BAN::ErrorOr<long> Process::sys_get_tls()
{
return Thread::current().get_tls();
}
BAN::ErrorOr<long> Process::sys_pthread_create(const pthread_attr_t* attr, void (*entry)(void*), void* arg)
{
if (attr != nullptr)

View File

@@ -10,7 +10,10 @@ extern Kernel::TerminalDriver* g_terminal_driver;
namespace Kernel
{
#if ARCH(x86_64)
static constexpr uint32_t MSR_IA32_FS_BASE = 0xC0000100;
static constexpr uint32_t MSR_IA32_GS_BASE = 0xC0000101;
#endif
ProcessorID Processor::s_bsb_id { PROCESSOR_NONE };
BAN::Atomic<uint8_t> Processor::s_processor_count { 0 };
@@ -260,6 +263,18 @@ namespace Kernel
set_interrupt_state(state);
}
void Processor::load_tls()
{
const auto addr = scheduler().current_thread().get_tls();
#if ARCH(x86_64)
uint32_t ptr_hi = addr >> 32;
uint32_t ptr_lo = addr & 0xFFFFFFFF;
asm volatile("wrmsr" :: "d"(ptr_hi), "a"(ptr_lo), "c"(MSR_IA32_FS_BASE));
#elif ARCH(i686)
gdt().set_tls(addr);
#endif
}
void Processor::send_smp_message(ProcessorID processor_id, const SMPMessage& message, bool send_ipi)
{
ASSERT(processor_id != current_id());

View File

@@ -278,6 +278,7 @@ namespace Kernel
thread->m_state = Thread::State::Executing;
Processor::gdt().set_tss_stack(thread->kernel_stack_top());
Processor::load_tls();
*interrupt_stack = thread->interrupt_stack();
*interrupt_registers = thread->interrupt_registers();

View File

@@ -196,6 +196,8 @@ namespace Kernel
thread->m_kernel_stack = TRY(m_kernel_stack->clone(new_process->page_table()));
thread->m_userspace_stack = TRY(m_userspace_stack->clone(new_process->page_table()));
thread->m_tls = m_tls;
thread->m_state = State::NotStarted;
thread->m_interrupt_stack.ip = ip;