Spinlock save cpu flags

This commit is contained in:
2026-03-12 22:48:34 +01:00
parent 19793e9126
commit 4760818118
50 changed files with 704 additions and 461 deletions

View File

@@ -68,6 +68,7 @@ struct proc* proc_from_elf (uint8_t* elf_contents) {
struct proc* proc_clone (struct proc* proto, uintptr_t vstack_top, uintptr_t entry,
uintptr_t argument_ptr) {
uint64_t fpt;
struct limine_hhdm_response* hhdm = limine_hhdm_request.response;
struct proc* proc = malloc (sizeof (*proc));
@@ -85,12 +86,12 @@ struct proc* proc_clone (struct proc* proto, uintptr_t vstack_top, uintptr_t ent
return NULL;
}
spin_lock (&proto->lock);
spin_lock (&proto->lock, &fpt);
proc->procgroup = proto->procgroup;
procgroup_attach (proc->procgroup, proc);
spin_unlock (&proto->lock);
spin_unlock (&proto->lock, fpt);
uintptr_t kstack_paddr = pmm_alloc (KSTACK_SIZE / PAGE_SIZE);
proc->pdata.kernel_stack = kstack_paddr + (uintptr_t)hhdm->offset + KSTACK_SIZE;
@@ -112,25 +113,27 @@ struct proc* proc_clone (struct proc* proto, uintptr_t vstack_top, uintptr_t ent
}
void proc_cleanup (struct proc* proc, struct reschedule_ctx* rctx) {
spin_lock (&proc->lock);
spin_lock (&proc->done_sq.lock);
uint64_t fp, fsq;
spin_lock (&proc->lock, &fp);
spin_lock (&proc->done_sq.lock, &fsq);
while (proc->done_sq.proc_list != NULL) {
struct list_node_link* node = proc->done_sq.proc_list;
struct proc_sq_entry* sq_entry = list_entry (node, struct proc_sq_entry, sq_link);
struct proc* suspended_proc = sq_entry->proc;
spin_unlock (&proc->done_sq.lock);
spin_unlock (&proc->lock);
spin_unlock (&proc->done_sq.lock, fsq);
spin_unlock (&proc->lock, fp);
proc_sq_resume (suspended_proc, sq_entry, rctx);
spin_lock (&proc->lock);
spin_lock (&proc->done_sq.lock);
spin_lock (&proc->lock, &fp);
spin_lock (&proc->done_sq.lock, &fsq);
}
spin_unlock (&proc->done_sq.lock);
spin_unlock (&proc->lock);
spin_unlock (&proc->done_sq.lock, fsq);
spin_unlock (&proc->lock, fp);
proc_sqs_cleanup (proc);
proc_mutexes_cleanup (proc, rctx);