From 9acb4d60a348db1bcaaba4fad44e2a7105d9c579 Mon Sep 17 00:00:00 2001 From: Miguel Date: Wed, 22 Aug 2018 02:37:42 +0200 Subject: tss works finally (for one usertask!) --- kernel/scheduler.c | 2 +- kernel/usermode.c | 16 ++++++++++------ kernel/vmem.c | 11 +++-------- 3 files changed, 14 insertions(+), 15 deletions(-) (limited to 'kernel') diff --git a/kernel/scheduler.c b/kernel/scheduler.c index d6e2c76..3136868 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -83,7 +83,7 @@ volatile uint32_t my_scheduler(uint32_t oldesp) current_task=pid; - vmem_set_dir(task_list[pid].vmem); + x86_set_page_directory(task_list[pid].vmem); return task_list[pid].esp; } diff --git a/kernel/usermode.c b/kernel/usermode.c index bb614d0..c700a61 100644 --- a/kernel/usermode.c +++ b/kernel/usermode.c @@ -23,12 +23,20 @@ void install_tss(int cpu_no){ // now fill each value // set values necessary sys_tss.ss0 = 0x10; //kernel data - sys_tss.esp0 = kballoc(4); + sys_tss.esp0 = kballoc(4)+4095; + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"esp0 =0x%08X ",sys_tss.esp0); // now set the IO bitmap (not necessary, so set above limit) // sys_tss.iomap = ( unsigned short ) sizeof( tss_struct ); } +void initfunc() +{ + while(1) + { + c2++; + } +} void userfunc() { @@ -38,11 +46,7 @@ void userfunc() // if we are pid 0, replace ourselves with /bin/init TODO: switch to usermode before! if(task_get_current_pid()==0) { - //usermode(&initfunc); - while(1) - { - c2++; - } + usermode(&initfunc); } // kernel worker thread on pid1 diff --git a/kernel/vmem.c b/kernel/vmem.c index fb19e75..f0fb9d3 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -172,6 +172,8 @@ pt_entry* vmmngr_ptable_lookup_entry (ptable* p, virtual_addr addr) return 0; } + + void vmem_free_dir(pdirectory *dir) { x86_paging_disable(); @@ -480,20 +482,13 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir) if(copy_dir==NULL) // this happens only on init { log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"initializing virtual memory (paging)"); - vmem_set_dir(dir); + x86_set_page_directory(dir); } -//while(1); x86_paging_enable(); - return dir; } -void vmem_set_dir(pdirectory *dir) -{ - x86_set_page_directory(dir); -} - pdirectory* vmem_init(uint32_t kernel_blocks, uint32_t frameb_addr) { fb_addr=frameb_addr; -- cgit v1.2.3