summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/helpers.s1
-rw-r--r--kernel/scheduler.c19
-rw-r--r--kernel/usermode.c5
3 files changed, 11 insertions, 14 deletions
diff --git a/asm/helpers.s b/asm/helpers.s
index e92b49f..135443d 100644
--- a/asm/helpers.s
+++ b/asm/helpers.s
@@ -1,5 +1,6 @@
//http://wiki.osdev.org/GDT_Tutorial
.global setup_gdt
+.global tss_flush
// call as setup_gdt(GDT,sizeof(GDT))
setup_gdt:
diff --git a/kernel/scheduler.c b/kernel/scheduler.c
index 3136868..453d4f4 100644
--- a/kernel/scheduler.c
+++ b/kernel/scheduler.c
@@ -24,12 +24,12 @@ static volatile struct task_list_struct
volatile bool waiting;
volatile bool skipwait;
volatile uint32_t brk;
+ volatile uint32_t esp0;
}volatile task_list[MAX_TASKS];
volatile int add_task(uint32_t esp, uint32_t vmem)
{
-
for(int i=0;i<MAX_TASKS;i++)
{
if(task_list[i].active!=true)
@@ -37,6 +37,7 @@ volatile int add_task(uint32_t esp, uint32_t vmem)
task_list[i].parent=current_task;
task_list[i].vmem=vmem;
task_list[i].esp=esp;
+ task_list[i].esp0 = kballoc(4)+4*4096;
task_list[i].active=true;
task_list[i].waiting=false;
task_list[i].skipwait=false;
@@ -62,10 +63,6 @@ static int first=1;
volatile uint32_t my_scheduler(uint32_t oldesp)
{
- // allows skipping scheduling from gdb
- volatile int skippy=0;
- if(skippy)return oldesp;
-
if(!first)
{
task_list[current_task].esp=oldesp;
@@ -82,6 +79,7 @@ volatile uint32_t my_scheduler(uint32_t oldesp)
// log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"switch from %d to %d", current_task, pid);
current_task=pid;
+ install_tss(task_list[pid].esp0);
x86_set_page_directory(task_list[pid].vmem);
return task_list[pid].esp;
@@ -158,21 +156,20 @@ volatile void scheduler_init(pdirectory *dir)
{
current_task=0;
- // this is our main task on slot 0
+ // this is our main user task on slot 0
task_list[0].parent=0;
task_list[0].active=true;
task_list[0].waiting=false;
task_list[0].vmem=dir;
- task_list[0].esp = kballoc(4); // 0; // will be set by next task_switch_next() call.
+ task_list[0].esp = kballoc(4)+4*4096;
+ task_list[0].esp0 = kballoc(4)+4*4096;
task_list[1].parent=0;
task_list[1].active=true;
task_list[1].waiting=false;
task_list[1].vmem=dir;
- task_list[1].esp = kballoc(4); // fresh 16kb stack from here.
-
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"fresh esp on: 0x%08X",task_list[1].esp+4*4096-1);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"fresh esp on: 0x%08X",task_list[0].esp+4*4096-1);
+ task_list[1].esp = kballoc(4)+4*4096;
+ task_list[1].esp0 = 0; // not needed by kernel space task
task_pusha(task_list[1].esp); // pusha but to alternative location
task_pusha(task_list[0].esp); // pusha but to alternative location
diff --git a/kernel/usermode.c b/kernel/usermode.c
index c700a61..7ec27d5 100644
--- a/kernel/usermode.c
+++ b/kernel/usermode.c
@@ -18,13 +18,12 @@ tss_struct sys_tss; //Define the TSS as a global structure
static volatile uint32_t c1;
static volatile uint32_t c2;
-void install_tss(int cpu_no){
+void install_tss(uint32_t esp0){
// now fill each value
// set values necessary
sys_tss.ss0 = 0x10; //kernel data
- sys_tss.esp0 = kballoc(4)+4095;
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"esp0 =0x%08X ",sys_tss.esp0);
+ sys_tss.esp0 = esp0;
// now set the IO bitmap (not necessary, so set above limit)
// sys_tss.iomap = ( unsigned short ) sizeof( tss_struct );