Fix TLS alignment issues, works on BOCHS now too!
All checks were successful
Build documentation / build-and-deploy (push) Successful in 40s
All checks were successful
Build documentation / build-and-deploy (push) Successful in 40s
This commit is contained in:
@@ -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 = .;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user