diff --git a/include/interrupts.h b/include/interrupts.h index 9eaa9c8..b1b892d 100644 --- a/include/interrupts.h +++ b/include/interrupts.h @@ -56,11 +56,11 @@ }) #define createdump(dump) ({ \ + push(dump.ss);\ + push(dump.esp);\ push(dump.eflags);\ push(dump.cs);\ push(dump.eip);\ - push(dump.esp);\ - push(dump.ss);\ push(dump.ds);\ push(dump.es);\ push(dump.fs);\ @@ -90,12 +90,12 @@ #define dumpcpu() ({ \ asm("\ + pushl %%ss\n \ + pushl %%esp\n \ pushf \n \ pushl %%cs\n \ pushl $0x0\n \ - pushl %%esp\n \ - pushl %%ss\n \ - pushl %%ds\n \ + pushl %%ds\n \ pushl %%es\n \ pushl %%fs\n \ pushl %%gs\n \ @@ -132,7 +132,7 @@ pushl %%eax":::);\ }) -#define restcpu(usermode) ({\ +#define restcpu() ({\ asm("\ popl %%eax \n \ popl %%edx \n \ @@ -166,11 +166,9 @@ popl %%fs\n \ popl %%es\n \ popl %%ds\n \"::);\ - if (usermode==true)\ - asm("add $0x8,%%esp"::);\ }) -#define restdebugcpu(usermode) ({\ +#define restdebugcpu() ({\ asm("\ popl %%eax \n \ popl %%edx \n \ @@ -198,8 +196,6 @@ popl %%fs\n \ popl %%es\n \ popl %%ds":::);\ - if (usermode==true)\ - asm("add $0x8,%%esp"::);\ }) /* @@ -237,11 +233,11 @@ typedef struct regs { u32 fs; u32 es; u32 ds; - u32 ss; - u32 esp; u32 eip; u32 cs; u32 eflags; + u32 esp; + u32 ss; } regs __attribute__ ((packed)); /* exception pile */ typedef struct exception_stack { diff --git a/lib/interrupts.c b/lib/interrupts.c index e7ef9ed..5a94bd0 100644 --- a/lib/interrupts.c +++ b/lib/interrupts.c @@ -214,14 +214,7 @@ void exception1() initselectors(retry_address); } changevc(0); - if (dump->cs==SEL_KERNEL_CODE) - { - restdebugcpu(true); - } - else - { - restdebugcpu(false); - } + restdebugcpu(); iret(); } @@ -435,14 +428,7 @@ void exception14() printf("Page fault - %s at adress %Y cs:eip - %Y:%Y\r\n",ex14_errors[current->error_code & 0xF],dump->cr2,dump->cs,dump->eip); cpuerror("#SS Page fault",dump); } - if (dump->cs==SEL_KERNEL_CODE) - { - restdebugcpu(true); - } - else - { - restdebugcpu(false); - } + restdebugcpu(); iret(); } diff --git a/lib/process.c b/lib/process.c index 8f11154..2cc25af 100644 --- a/lib/process.c +++ b/lib/process.c @@ -154,18 +154,12 @@ u32 task_usePID (u32 pid) void task_switch(u32 pid, bool fromkernelmode) { + process *previous=current; current = &processes[pid]; setTSS(current->kstack.ss0,current->kstack.esp0); current->dump.eflags = (current->dump.eflags | 0x200) & 0xFFFFBFFF; - createdump(current->dump); - if (fromkernelmode) - { - restdebugcpu(true); - } - else - { - restdebugcpu(false); - } + createdump(current->dump); + restdebugcpu(); iret(); } @@ -175,7 +169,7 @@ void task_switch(u32 pid, bool fromkernelmode) void task_run(u32 pid) { processes[pid].status = STATUS_RUN; - task_switch(pid, true); + task_switch(pid, false); } /*******************************************************************************/ @@ -194,7 +188,7 @@ u32 task_create(u8 *code) setcr3(processes[pid].pdd->addr->paddr); kstack = virtual_page_getfree(); processes[pid].dump.ss = SEL_USER_STACK | RPL_RING3; - processes[pid].dump.esp = USER_STACK; + processes[pid].dump.esp = USER_STACK-16; processes[pid].dump.eflags = 0x0; processes[pid].dump.cs = SEL_USER_CODE | RPL_RING3; processes[pid].dump.eip = elf_load(code,pid); diff --git a/lib/syscall.c b/lib/syscall.c index 71c6a59..02ee2bf 100644 --- a/lib/syscall.c +++ b/lib/syscall.c @@ -42,7 +42,7 @@ void sysenter_handler(void) break; } - restdebugcpu(true); + restdebugcpu(); sysexit(); }