diff --git a/init/init.c b/init/init.c index 938c546..b456a92 100644 --- a/init/init.c +++ b/init/init.c @@ -47,8 +47,8 @@ void app_main (void) { spawn (&app_thread1); - /* for (volatile int i = 0; i < 1000*1000; i++) */ - /* ; */ + /* for (volatile int i = 0; i < 1000*1000; i++) */ + /* ; */ for (;;) { lock_mutex (MUTEX, RV_PRIVATE); @@ -56,7 +56,7 @@ void app_main (void) { test ('a'); unlock_mutex (MUTEX, RV_PRIVATE); - + /* for (volatile int i = 0; i < 1000*1000; i++) */ /* ; */ } diff --git a/kernel/amd64/bootmain.c b/kernel/amd64/bootmain.c index 7df6ba3..680c5e6 100644 --- a/kernel/amd64/bootmain.c +++ b/kernel/amd64/bootmain.c @@ -48,7 +48,7 @@ void bootmain (void) { amd64_hpet_init (); mm_init2 (); - + smp_init (); proc_init (); diff --git a/kernel/amd64/intr.c b/kernel/amd64/intr.c index cf0815a..d396ba2 100644 --- a/kernel/amd64/intr.c +++ b/kernel/amd64/intr.c @@ -165,13 +165,19 @@ static void amd64_intr_exception (struct saved_regs* regs) { /* Handle incoming interrupt, dispatch IRQ handlers. */ void amd64_intr_handler (void* stack_ptr) { - spin_lock_ctx_t ctxcpu; + spin_lock_ctx_t ctxcpu, ctxpr; + amd64_load_kernel_cr3 (); struct saved_regs* regs = stack_ptr; spin_lock (&thiscpu->lock, &ctxcpu); - memcpy (&thiscpu->regs, regs, sizeof (struct saved_regs)); + struct proc* proc_current = thiscpu->proc_current; + spin_lock (&proc_current->lock, &ctxpr); + + memcpy (&proc_current->pdata.regs, regs, sizeof (struct saved_regs)); + + spin_unlock (&proc_current->lock, &ctxpr); spin_unlock (&thiscpu->lock, &ctxcpu); if (regs->trap <= 31) { diff --git a/kernel/amd64/sched1.c b/kernel/amd64/sched1.c index 5a5cba3..1b36226 100644 --- a/kernel/amd64/sched1.c +++ b/kernel/amd64/sched1.c @@ -3,9 +3,9 @@ #include #include #include +#include #include #include -#include void do_sched (struct proc* proc, spin_lock_t* cpu_lock, spin_lock_ctx_t* ctxcpu) { spin_lock_ctx_t ctxpr; @@ -14,7 +14,7 @@ void do_sched (struct proc* proc, spin_lock_t* cpu_lock, spin_lock_ctx_t* ctxcpu thiscpu->tss.rsp0 = proc->pdata.kernel_stack; thiscpu->syscall_kernel_stack = proc->pdata.kernel_stack; - + spin_unlock (&proc->lock, &ctxpr); spin_unlock (cpu_lock, ctxcpu); diff --git a/kernel/amd64/smp.c b/kernel/amd64/smp.c index 717ff50..aa536b6 100644 --- a/kernel/amd64/smp.c +++ b/kernel/amd64/smp.c @@ -11,9 +11,9 @@ #include #include #include +#include #include #include -#include /// Cpu ID counter static atomic_uint cpu_counter = 0; @@ -83,7 +83,7 @@ static void amd64_smp_bootstrap (struct limine_mp_info* mp_info) { DEBUG ("CPU %u is online!\n", thiscpu->id); atomic_fetch_sub (&cpu_init_count, 1); - + struct proc* spin_proc = proc_spawn_rd ("spin.exe"); proc_register (spin_proc, thiscpu); diff --git a/kernel/amd64/smp.h b/kernel/amd64/smp.h index 51130a4..4aaae48 100644 --- a/kernel/amd64/smp.h +++ b/kernel/amd64/smp.h @@ -21,7 +21,6 @@ struct cpu { volatile uint8_t irq_stack[KSTACK_SIZE] ALIGNED (16); volatile struct gdt_extended gdt ALIGNED (16); volatile struct tss tss; - struct saved_regs regs; uintptr_t lapic_mmio_base; uint64_t lapic_ticks; diff --git a/kernel/amd64/syscall.c b/kernel/amd64/syscall.c index 126db5c..957dbe1 100644 --- a/kernel/amd64/syscall.c +++ b/kernel/amd64/syscall.c @@ -14,26 +14,26 @@ extern void amd64_syscall_entry (void); int amd64_syscall_dispatch (void* stack_ptr) { - spin_lock_ctx_t ctxcpu; - - spin_lock (&thiscpu->lock, &ctxcpu); + spin_lock_ctx_t ctxcpu, ctxpr; amd64_load_kernel_cr3 (); struct saved_regs* regs = stack_ptr; - memcpy (&thiscpu->regs, regs, sizeof (struct saved_regs)); + spin_lock (&thiscpu->lock, &ctxcpu); + struct proc* caller = thiscpu->proc_current; + spin_lock (&caller->lock, &ctxpr); + + memcpy (&caller->pdata.regs, regs, sizeof (struct saved_regs)); + + spin_unlock (&caller->lock, &ctxpr); + spin_unlock (&thiscpu->lock, &ctxcpu); int syscall_num = regs->rax; syscall_handler_func_t func = syscall_find_handler (syscall_num); if (func == NULL) { - spin_unlock (&thiscpu->lock, &ctxcpu); return -ST_SYSCALL_NOT_FOUND; } - - struct proc* caller = thiscpu->proc_current; - - spin_unlock (&thiscpu->lock, &ctxcpu); int result = func (caller, regs, regs->rdi, regs->rsi, regs->rdx, regs->r10, regs->r8, regs->r9); return result; diff --git a/kernel/proc/mutex.c b/kernel/proc/mutex.c index c18e307..7300295 100644 --- a/kernel/proc/mutex.c +++ b/kernel/proc/mutex.c @@ -18,7 +18,7 @@ bool proc_create_resource_mutex (struct proc_mutex* mutex) { void proc_cleanup_resource_mutex (struct proc* proc, struct proc_resource* resource) { struct proc_mutex* mutex = &resource->u.mutex; - proc_mutex_unlock (proc, mutex); + /* proc_mutex_unlock (proc, mutex); */ } static void proc_mutex_suspend (struct proc* proc, struct proc_suspension_q* sq, diff --git a/kernel/proc/proc.c b/kernel/proc/proc.c index 486ef1d..dde8876 100644 --- a/kernel/proc/proc.c +++ b/kernel/proc/proc.c @@ -294,7 +294,7 @@ static void proc_reap (void) { } void proc_sched (void) { - spin_lock_ctx_t ctxcpu, ctxpr; + spin_lock_ctx_t ctxcpu; int s_cycles = atomic_fetch_add (&sched_cycles, 1); @@ -306,15 +306,8 @@ void proc_sched (void) { spin_lock (&cpu->lock, &ctxcpu); - struct proc* prev = cpu->proc_current; next = proc_find_sched (cpu); - if (prev != NULL) { - spin_lock (&prev->lock, &ctxpr); - memcpy (&prev->pdata.regs, &cpu->regs, sizeof (struct saved_regs)); - spin_unlock (&prev->lock, &ctxpr); - } - if (next) { cpu->proc_current = next;