Fix TLS alignment issues, works on BOCHS now too!
All checks were successful
Build documentation / build-and-deploy (push) Successful in 40s

This commit is contained in:
2026-01-29 18:18:24 +01:00
parent 73e42588fb
commit d2f5c032d9
4 changed files with 29 additions and 26 deletions

View File

@@ -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 = .;

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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);
}