From daa29212d0e26cb415b56f2fd72276e878071855 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sat, 27 Aug 2005 22:00:00 -0400 Subject: [PATCH] Import backup from 2005-08-27 --- apps/test1.app | Bin 33 -> 31 bytes apps/test1.asm | 3 +++ apps/test2.app | Bin 33 -> 31 bytes apps/test2.asm | 3 +++ kernel/boot.asm | 12 ++++++++---- kernel/idt.inc | 18 +++++++++--------- kernel/kernel.c | 7 +++---- kernel/kernel.h | 2 +- kernel/proc/proc.c | 42 ++++++++++++++++-------------------------- kernel/proc/proc.h | 8 ++++++-- 10 files changed, 49 insertions(+), 46 deletions(-) diff --git a/apps/test1.app b/apps/test1.app index 4af19304907cce6ede221bcbce8cf5b3cf5e55d0..714cde462a5416913c98efc789ad6c6bdf045eca 100644 GIT binary patch literal 31 gcmeb95B6nZU|init); } @@ -208,6 +208,7 @@ void isr(u32_t num, int_stack_t *int_stack) case 0x20: // timer timer++; (*(u16_t *)CONSOLE_MEMORY)++; + proc_sched(int_stack); pic_eoi(); break; case 0x21: // keyboard @@ -219,11 +220,9 @@ void isr(u32_t num, int_stack_t *int_stack) putc(int_stack->ebx); break; default: - kprintf("Unhandled interrupt #%d, CR2 = 0x%x!\n", num, read_cr2()); + kprintf("Unhandled interrupt #%d, CR2 = 0x%x, int_stack at 0x%x!\n", num, read_cr2(), int_stack); halt(); } - if ( (num == 0x20) || (proc_new_esp == 0) ) - proc_sched(int_stack); criticalCounter--; } diff --git a/kernel/kernel.h b/kernel/kernel.h index aade35d..9865a09 100644 --- a/kernel/kernel.h +++ b/kernel/kernel.h @@ -33,8 +33,8 @@ typedef struct u32_t eip; u32_t cs; u32_t eflags; - u32_t ss; /* present if ring3->ring0 transition ?? */ u32_t esp; + u32_t ss; /* present if ring3->ring0 transition ?? */ } int_stack_t; /* returns true to callee if we should jump to a real mode module */ diff --git a/kernel/proc/proc.c b/kernel/proc/proc.c index 3f6e045..7f3a3e3 100644 --- a/kernel/proc/proc.c +++ b/kernel/proc/proc.c @@ -42,11 +42,11 @@ int proc_init() void proc_sched(int_stack_t *int_stack) { - processes[cur_task]->esp = (u32_t) int_stack; - processes[cur_task]->ss = read_ss(); - cur_task = (cur_task + 1) % 3; - proc_new_esp = processes[cur_task]->esp; - proc_new_ss = processes[cur_task]->ss; + memcpy(&processes[cur_task]->int_stack, int_stack, sizeof(int_stack_t)); + cur_task++; + if (cur_task == 3) + cur_task = 0; + memcpy(int_stack, &processes[cur_task]->int_stack, sizeof(int_stack_t)); write_cr3(processes[cur_task]->p_page_dir); } @@ -105,29 +105,19 @@ void create_process_stack(process_t *p, void *entry) u32_t *ptr32 = v_stack_table; for (i = 0; i < 1023; i++) *ptr32++ = 0; - v_stack_table[1032] = p_stack | 0x7; /* user permissions */ + v_stack_table[1023] = p_stack | 0x7; /* user permissions */ p->page_dir[511] = p_stack_table | 0x7; /* stack at 2GB */ - i = 1023; /* top of stack */ - v_stack[i--] = 0x20000000; - v_stack[i--] = SEG_USER_DATA | 0x3; - v_stack[i--] = 0x0202; - v_stack[i--] = SEG_USER_CODE | 0x3; - v_stack[i--] = (u32_t) entry; - v_stack[i--] = 0; - v_stack[i--] = 0; - v_stack[i--] = 0; - v_stack[i--] = 0; - v_stack[i--] = 0; - v_stack[i--] = 0; - v_stack[i--] = 0; - v_stack[i--] = SEG_USER_DATA | 0x3; - v_stack[i--] = SEG_USER_DATA | 0x3; - v_stack[i--] = SEG_USER_DATA | 0x3; - v_stack[i--] = SEG_USER_DATA | 0x3; vmm_unmapp(v_stack_table); vmm_unmapp(v_stack); - p->ss = SEG_USER_DATA | 0x3; - p->esp = 0x20000000 - sizeof(int_stack_t); + p->int_stack.ds = SEG_USER_DATA | 0x3; + p->int_stack.es = SEG_USER_DATA | 0x3; + p->int_stack.fs = SEG_USER_DATA | 0x3; + p->int_stack.gs = SEG_USER_DATA | 0x3; + p->int_stack.ss = SEG_USER_DATA | 0x3; + p->int_stack.esp = 0x20000000; + p->int_stack.eflags = 0x0202; + p->int_stack.cs = SEG_USER_CODE | 0x3; + p->int_stack.eip = (u32_t)entry; } /* Copy pages into new address space (v_page_dir must be set up) */ @@ -148,7 +138,7 @@ void copy_into_address_space(u32_t dest_addr, /* Time for a new page table & page directory entry! */ p->v_page_dir[pde] = (u32_t)vmm_palloc_addr(&p_page_addr); p->page_dir[pde] = p_page_addr | 0x7; - vmm_unmapp((void *)p->v_page_dir[pde]); +// vmm_unmapp((void *)p->v_page_dir[pde]); } page = vmm_palloc_addr(&p_page_addr); ((u32_t *)(p->v_page_dir[pde]))[pte] = p_page_addr | 0x7; diff --git a/kernel/proc/proc.h b/kernel/proc/proc.h index 46baa32..d34b744 100644 --- a/kernel/proc/proc.h +++ b/kernel/proc/proc.h @@ -15,8 +15,12 @@ typedef struct u32_t *v_page_dir; /* Virtual page table addresses for init */ u32_t p_page_dir; /* Physical address of page directory */ u32_t size; /* Process size, bytes from 0 through bss */ - u32_t ss; - u32_t esp; +// u32_t ss; +// u32_t esp; +// u32_t eflags; +// u32_t cs; +// u32_t eip; + int_stack_t int_stack; } process_t; typedef struct