Kernel: Start working on TLS, add SYS_{SET,GET}_TLS
This commit is contained in:
@@ -128,6 +128,10 @@ namespace Kernel
|
||||
#endif
|
||||
}
|
||||
|
||||
#if ARCH(i686)
|
||||
void set_tls(uintptr_t addr);
|
||||
#endif
|
||||
|
||||
private:
|
||||
GDT() = default;
|
||||
|
||||
@@ -149,8 +153,8 @@ namespace Kernel
|
||||
BAN::Array<SegmentDescriptor, 7> m_gdt; // null, kernel code, kernel data, user code, user data, tss low, tss high
|
||||
static constexpr uint16_t m_tss_offset = 0x28;
|
||||
#elif ARCH(i686)
|
||||
BAN::Array<SegmentDescriptor, 7> m_gdt; // null, kernel code, kernel data, user code, user data, processor data, tss
|
||||
static constexpr uint16_t m_tss_offset = 0x30;
|
||||
BAN::Array<SegmentDescriptor, 8> m_gdt; // null, kernel code, kernel data, user code, user data, processor data, tls, tss
|
||||
static constexpr uint16_t m_tss_offset = 0x38;
|
||||
#endif
|
||||
TaskStateSegment m_tss;
|
||||
const GDTR m_gdtr {
|
||||
|
||||
@@ -174,6 +174,8 @@ namespace Kernel
|
||||
BAN::ErrorOr<long> sys_sigprocmask(int how, const sigset_t* set, sigset_t* oset);
|
||||
|
||||
BAN::ErrorOr<long> sys_yield();
|
||||
BAN::ErrorOr<long> sys_set_tls(void*);
|
||||
BAN::ErrorOr<long> sys_get_tls();
|
||||
BAN::ErrorOr<long> sys_pthread_create(const pthread_attr_t* attr, void (*entry)(void*), void* arg);
|
||||
BAN::ErrorOr<long> sys_pthread_exit(void* value);
|
||||
BAN::ErrorOr<long> sys_pthread_join(pthread_t thread, void** value);
|
||||
|
||||
@@ -110,6 +110,8 @@ namespace Kernel
|
||||
static void send_smp_message(ProcessorID, const SMPMessage&, bool send_ipi = true);
|
||||
static void broadcast_smp_message(const SMPMessage&);
|
||||
|
||||
static void load_tls();
|
||||
|
||||
private:
|
||||
Processor() = default;
|
||||
~Processor() { ASSERT_NOT_REACHED(); }
|
||||
|
||||
@@ -88,6 +88,9 @@ namespace Kernel
|
||||
|
||||
bool is_userspace() const { return m_is_userspace; }
|
||||
|
||||
void set_tls(vaddr_t tls) { m_tls = tls; }
|
||||
vaddr_t get_tls() const { return m_tls; }
|
||||
|
||||
size_t virtual_page_count() const { return (m_kernel_stack ? (m_kernel_stack->size() / PAGE_SIZE) : 0) + (m_userspace_stack ? (m_userspace_stack->size() / PAGE_SIZE) : 0); }
|
||||
size_t physical_page_count() const { return virtual_page_count(); }
|
||||
|
||||
@@ -121,6 +124,8 @@ namespace Kernel
|
||||
bool m_is_userspace { false };
|
||||
bool m_delete_process { false };
|
||||
|
||||
vaddr_t m_tls { 0 };
|
||||
|
||||
SchedulerQueue::Node* m_scheduler_node { nullptr };
|
||||
|
||||
InterruptStack m_interrupt_stack { };
|
||||
|
||||
Reference in New Issue
Block a user