From a2248e0fbb1849f60b01107a9858e4694e54ce6e Mon Sep 17 00:00:00 2001 From: Tulio A M Mendes Date: Thu, 12 Feb 2026 03:42:19 -0300 Subject: [PATCH] refactor: extract x86 GDT/GS TLS setup from scheduler to HAL layer MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Added hal_cpu_set_tls(base) to the HAL CPU API with x86 implementation (GDT entry 22 + GS segment load) and a no-op fallback for other arches. kernel/scheduler.c no longer contains x86 inline assembly for TLS — the #if defined(__i386__) block is replaced by a single HAL call. --- include/hal/cpu.h | 2 ++ src/hal/x86/cpu.c | 13 +++++++++++++ src/kernel/scheduler.c | 13 ++----------- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/include/hal/cpu.h b/include/hal/cpu.h index dcb196d..1ad85a8 100644 --- a/include/hal/cpu.h +++ b/include/hal/cpu.h @@ -15,4 +15,6 @@ void hal_cpu_idle(void); uint64_t hal_cpu_read_timestamp(void); +void hal_cpu_set_tls(uintptr_t base); + #endif diff --git a/src/hal/x86/cpu.c b/src/hal/x86/cpu.c index 1adc72e..d863996 100644 --- a/src/hal/x86/cpu.c +++ b/src/hal/x86/cpu.c @@ -54,6 +54,15 @@ uint64_t hal_cpu_read_timestamp(void) { return ((uint64_t)hi << 32) | lo; } +void hal_cpu_set_tls(uintptr_t base) { + /* GDT entry 22: user TLS segment (ring 3, data RW) */ + gdt_set_gate_ext(22, (uint32_t)base, 0xFFFFF, 0xF2, 0xCF); + __asm__ volatile( + "mov $0xB3, %%ax\n" + "mov %%ax, %%gs\n" : : : "ax" + ); /* selector = 22*8 | RPL=3 = 0xB3 */ +} + #else uintptr_t hal_cpu_get_stack_pointer(void) { @@ -85,4 +94,8 @@ uint64_t hal_cpu_read_timestamp(void) { return 0; } +void hal_cpu_set_tls(uintptr_t base) { + (void)base; +} + #endif diff --git a/src/kernel/scheduler.c b/src/kernel/scheduler.c index e6cc36e..7a5d326 100644 --- a/src/kernel/scheduler.c +++ b/src/kernel/scheduler.c @@ -434,18 +434,9 @@ static void clone_child_trampoline(void) { } /* Load user TLS into GS if set */ -#if defined(__i386__) if (current_process->tls_base) { - extern void gdt_set_gate_ext(int num, uint32_t base, uint32_t limit, - uint8_t access, uint8_t gran); - /* Use GDT entry 22 as the user TLS segment (ring 3, data RW) */ - gdt_set_gate_ext(22, (uint32_t)current_process->tls_base, 0xFFFFF, 0xF2, 0xCF); - __asm__ volatile( - "mov $0xB3, %%ax\n" - "mov %%ax, %%gs\n" : : : "ax" - ); /* selector = 22*8 | RPL=3 = 0xB3 */ - } -#endif + hal_cpu_set_tls(current_process->tls_base); + } hal_usermode_enter_regs(¤t_process->user_regs); } -- 2.43.0