From d2f5c032d97ba8fa0cdbc183e91d9a344ff52e7e Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Thu, 29 Jan 2026 18:18:24 +0100 Subject: [PATCH] Fix TLS alignment issues, works on BOCHS now too! --- amd64/link.ld | 8 ++++---- init/init.c | 4 +--- kernel/amd64/proc.c | 13 ++++++++----- kernel/proc/proc.c | 30 ++++++++++++++++-------------- 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/amd64/link.ld b/amd64/link.ld index 395d413..47b695d 100644 --- a/amd64/link.ld +++ b/amd64/link.ld @@ -18,20 +18,20 @@ SECTIONS { *(.ltext .ltext.*) } :text - . = ALIGN(CONSTANT(MAXPAGESIZE)); + . = ALIGN(0x1000); .rodata : { *(.rodata .rodata.*) } :rodata - . = ALIGN(CONSTANT(MAXPAGESIZE)); + . = ALIGN(0x1000); .data : { *(.data .data.*) *(.ldata .ldata.*) } :data - . = ALIGN(CONSTANT(MAXPAGESIZE)); + . = ALIGN(0x1000); __bss_start = .; @@ -42,7 +42,7 @@ SECTIONS { __bss_end = .; - . = ALIGN(CONSTANT(MAXPAGESIZE)); + . = ALIGN(0x1000); __tdata_start = .; diff --git a/init/init.c b/init/init.c index 92bf8aa..b4a15e9 100644 --- a/init/init.c +++ b/init/init.c @@ -7,7 +7,7 @@ #define MUTEX 2000 -LOCAL char letter = 'c'; +LOCAL volatile char letter = 'c'; void app_proc1 (void) { letter = 'b'; @@ -37,8 +37,6 @@ void app_main (void) { for (int i = 0; i < 3; i++) test (letter); - process_quit (); - mutex_unlock (MUTEX); } } diff --git a/kernel/amd64/proc.c b/kernel/amd64/proc.c index 6f4a5d0..95459b8 100644 --- a/kernel/amd64/proc.c +++ b/kernel/amd64/proc.c @@ -109,22 +109,25 @@ void proc_cleanup (struct proc* proc) { void proc_init_tls (struct proc* proc) { struct limine_hhdm_response* hhdm = limine_hhdm_request.response; + if (proc->procgroup->tls.tls_tmpl == NULL) + return; + size_t tls_size = proc->procgroup->tls.tls_tmpl_size; + size_t pages = proc->procgroup->tls.tls_tmpl_pages; uintptr_t tls_paddr; uint32_t flags = MM_PG_USER | MM_PG_PRESENT | MM_PG_RW; - uintptr_t tls_vaddr = - procgroup_map (proc->procgroup, 0, proc->procgroup->tls.tls_tmpl_pages, flags, &tls_paddr); + uintptr_t tls_vaddr = procgroup_map (proc->procgroup, 0, pages, flags, &tls_paddr); uintptr_t k_tls_addr = (uintptr_t)hhdm->offset + tls_paddr; + memset ((void*)k_tls_addr, 0, pages * PAGE_SIZE); + memcpy ((void*)k_tls_addr, (void*)proc->procgroup->tls.tls_tmpl, tls_size); + uintptr_t ktcb = k_tls_addr + tls_size; uintptr_t utcb = tls_vaddr + tls_size; - memset ((void*)k_tls_addr, 0, tls_size); - memcpy ((void*)k_tls_addr, (void*)proc->procgroup->tls.tls_tmpl, tls_size); - *(uintptr_t*)ktcb = utcb; proc->pdata.fs_base = utcb; diff --git a/kernel/proc/proc.c b/kernel/proc/proc.c index f314207..158ffbf 100644 --- a/kernel/proc/proc.c +++ b/kernel/proc/proc.c @@ -75,21 +75,23 @@ struct elf_aux proc_load_segments (struct proc* proc, uint8_t* elf) { } break; case PT_TLS: { #if defined(__x86_64__) - size_t tls_align = phdr->p_align ? phdr->p_align : sizeof (uintptr_t); - size_t tls_size = phdr->p_memsz; - size_t tls_total_needed = tls_size + sizeof (uintptr_t); - size_t blks = div_align_up (tls_total_needed, PAGE_SIZE); - proc->procgroup->tls.tls_tmpl_pages = blks; - proc->procgroup->tls.tls_tmpl_size = tls_size; - proc->procgroup->tls.tls_tmpl_total_size = tls_total_needed; + if (phdr->p_memsz > 0) { + size_t tls_align = phdr->p_align ? phdr->p_align : sizeof (uintptr_t); + size_t tls_size = align_up (phdr->p_memsz, tls_align); + size_t tls_total_needed = tls_size + sizeof (uintptr_t); + size_t blks = div_align_up (tls_total_needed, PAGE_SIZE); + proc->procgroup->tls.tls_tmpl_pages = blks; + proc->procgroup->tls.tls_tmpl_size = tls_size; + proc->procgroup->tls.tls_tmpl_total_size = tls_total_needed; - proc->procgroup->tls.tls_tmpl = malloc (blks * PAGE_SIZE); - memset (proc->procgroup->tls.tls_tmpl, 0, blks * PAGE_SIZE); + proc->procgroup->tls.tls_tmpl = malloc (blks * PAGE_SIZE); + memset (proc->procgroup->tls.tls_tmpl, 0, blks * PAGE_SIZE); - memcpy (proc->procgroup->tls.tls_tmpl, (void*)((uintptr_t)elf + phdr->p_offset), - phdr->p_filesz); + memcpy (proc->procgroup->tls.tls_tmpl, (void*)((uintptr_t)elf + phdr->p_offset), + phdr->p_filesz); - proc_init_tls (proc); + proc_init_tls (proc); + } #endif } break; } @@ -276,6 +278,6 @@ void proc_init (void) { proc_register (init, NULL); spin_lock_ctx_t ctxcpu; - spin_lock (&init->cpu->lock, &ctxcpu); - do_sched (init, &init->cpu->lock, &ctxcpu); + spin_lock (&spin_proc->cpu->lock, &ctxcpu); + do_sched (spin_proc, &spin_proc->cpu->lock, &ctxcpu); }