From 5f6c2bcf0d2f9c416134aba224d90a605f216818 Mon Sep 17 00:00:00 2001 From: Miguel Date: Fri, 28 Sep 2018 11:13:06 +0200 Subject: struggling with scheduler and userprog to view ppm files --- kernel/scheduler.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) (limited to 'kernel/scheduler.c') diff --git a/kernel/scheduler.c b/kernel/scheduler.c index 0c24f94..23ed7b2 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -120,8 +120,10 @@ static uint32_t scheduler_schedule(uint32_t idx) if(task_list[cpu][idx].active && !task_list[cpu][idx].syscall) { if(current_task[cpu]!=0)last_task[cpu]=current_task[cpu]; - current_task[cpu]=idx; + + // klog("%d idx %d",last_task[cpu],current_task[cpu]); + install_tss(cpu,task_list[cpu][idx].esp0); x86_set_page_directory(task_list[cpu][idx].vmem); return task_list[cpu][idx].esp; @@ -153,19 +155,36 @@ volatile uint32_t scheduler_run(uint32_t oldesp,uint32_t preference) else task_list[cpu][current_task[cpu]].esp=oldesp; uint32_t esp; - esp=scheduler_schedule(preference); // try preference - if(esp)return esp; + if(preference!=-1) + { + esp=scheduler_schedule(preference); // try preference + if(esp)return esp; + + if(current_task[cpu]==0)// we have interrupted a task with ring1 work + { + esp=scheduler_schedule(last_task[cpu]); // try preference + if(esp)return esp; + } + } + else + { + //klog("preempt %d", last_task[cpu]); + } for(int i=0;i