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.*) *(.ltext .ltext.*)
} :text } :text
. = ALIGN(CONSTANT(MAXPAGESIZE)); . = ALIGN(0x1000);
.rodata : { .rodata : {
*(.rodata .rodata.*) *(.rodata .rodata.*)
} :rodata } :rodata
. = ALIGN(CONSTANT(MAXPAGESIZE)); . = ALIGN(0x1000);
.data : { .data : {
*(.data .data.*) *(.data .data.*)
*(.ldata .ldata.*) *(.ldata .ldata.*)
} :data } :data
. = ALIGN(CONSTANT(MAXPAGESIZE)); . = ALIGN(0x1000);
__bss_start = .; __bss_start = .;
@@ -42,7 +42,7 @@ SECTIONS {
__bss_end = .; __bss_end = .;
. = ALIGN(CONSTANT(MAXPAGESIZE)); . = ALIGN(0x1000);
__tdata_start = .; __tdata_start = .;

View File

@@ -7,7 +7,7 @@
#define MUTEX 2000 #define MUTEX 2000
LOCAL char letter = 'c'; LOCAL volatile char letter = 'c';
void app_proc1 (void) { void app_proc1 (void) {
letter = 'b'; letter = 'b';
@@ -37,8 +37,6 @@ void app_main (void) {
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
test (letter); test (letter);
process_quit ();
mutex_unlock (MUTEX); mutex_unlock (MUTEX);
} }
} }

View File

@@ -109,22 +109,25 @@ void proc_cleanup (struct proc* proc) {
void proc_init_tls (struct proc* proc) { void proc_init_tls (struct proc* proc) {
struct limine_hhdm_response* hhdm = limine_hhdm_request.response; 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 tls_size = proc->procgroup->tls.tls_tmpl_size;
size_t pages = proc->procgroup->tls.tls_tmpl_pages;
uintptr_t tls_paddr; uintptr_t tls_paddr;
uint32_t flags = MM_PG_USER | MM_PG_PRESENT | MM_PG_RW; uint32_t flags = MM_PG_USER | MM_PG_PRESENT | MM_PG_RW;
uintptr_t tls_vaddr = uintptr_t tls_vaddr = procgroup_map (proc->procgroup, 0, pages, flags, &tls_paddr);
procgroup_map (proc->procgroup, 0, proc->procgroup->tls.tls_tmpl_pages, flags, &tls_paddr);
uintptr_t k_tls_addr = (uintptr_t)hhdm->offset + 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 ktcb = k_tls_addr + tls_size;
uintptr_t utcb = tls_vaddr + 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; *(uintptr_t*)ktcb = utcb;
proc->pdata.fs_base = utcb; proc->pdata.fs_base = utcb;

View File

@@ -75,8 +75,9 @@ struct elf_aux proc_load_segments (struct proc* proc, uint8_t* elf) {
} break; } break;
case PT_TLS: { case PT_TLS: {
#if defined(__x86_64__) #if defined(__x86_64__)
if (phdr->p_memsz > 0) {
size_t tls_align = phdr->p_align ? phdr->p_align : sizeof (uintptr_t); size_t tls_align = phdr->p_align ? phdr->p_align : sizeof (uintptr_t);
size_t tls_size = phdr->p_memsz; size_t tls_size = align_up (phdr->p_memsz, tls_align);
size_t tls_total_needed = tls_size + sizeof (uintptr_t); size_t tls_total_needed = tls_size + sizeof (uintptr_t);
size_t blks = div_align_up (tls_total_needed, PAGE_SIZE); size_t blks = div_align_up (tls_total_needed, PAGE_SIZE);
proc->procgroup->tls.tls_tmpl_pages = blks; proc->procgroup->tls.tls_tmpl_pages = blks;
@@ -90,6 +91,7 @@ struct elf_aux proc_load_segments (struct proc* proc, uint8_t* elf) {
phdr->p_filesz); phdr->p_filesz);
proc_init_tls (proc); proc_init_tls (proc);
}
#endif #endif
} break; } break;
} }
@@ -276,6 +278,6 @@ void proc_init (void) {
proc_register (init, NULL); proc_register (init, NULL);
spin_lock_ctx_t ctxcpu; spin_lock_ctx_t ctxcpu;
spin_lock (&init->cpu->lock, &ctxcpu); spin_lock (&spin_proc->cpu->lock, &ctxcpu);
do_sched (init, &init->cpu->lock, &ctxcpu); do_sched (spin_proc, &spin_proc->cpu->lock, &ctxcpu);
} }