feat: fonction task_switch & task_run passe en mode utilisateur RING0 mais plantage lors de l'execution

This commit is contained in:
Nicolas Hordé 2018-12-12 00:15:36 +01:00
parent dd70f75ab8
commit 69fa9567a1
4 changed files with 17 additions and 41 deletions

View File

@ -56,11 +56,11 @@
}) })
#define createdump(dump) ({ \ #define createdump(dump) ({ \
push(dump.ss);\
push(dump.esp);\
push(dump.eflags);\ push(dump.eflags);\
push(dump.cs);\ push(dump.cs);\
push(dump.eip);\ push(dump.eip);\
push(dump.esp);\
push(dump.ss);\
push(dump.ds);\ push(dump.ds);\
push(dump.es);\ push(dump.es);\
push(dump.fs);\ push(dump.fs);\
@ -90,11 +90,11 @@
#define dumpcpu() ({ \ #define dumpcpu() ({ \
asm("\ asm("\
pushl %%ss\n \
pushl %%esp\n \
pushf \n \ pushf \n \
pushl %%cs\n \ pushl %%cs\n \
pushl $0x0\n \ pushl $0x0\n \
pushl %%esp\n \
pushl %%ss\n \
pushl %%ds\n \ pushl %%ds\n \
pushl %%es\n \ pushl %%es\n \
pushl %%fs\n \ pushl %%fs\n \
@ -132,7 +132,7 @@
pushl %%eax":::);\ pushl %%eax":::);\
}) })
#define restcpu(usermode) ({\ #define restcpu() ({\
asm("\ asm("\
popl %%eax \n \ popl %%eax \n \
popl %%edx \n \ popl %%edx \n \
@ -166,11 +166,9 @@
popl %%fs\n \ popl %%fs\n \
popl %%es\n \ popl %%es\n \
popl %%ds\n \"::);\ popl %%ds\n \"::);\
if (usermode==true)\
asm("add $0x8,%%esp"::);\
}) })
#define restdebugcpu(usermode) ({\ #define restdebugcpu() ({\
asm("\ asm("\
popl %%eax \n \ popl %%eax \n \
popl %%edx \n \ popl %%edx \n \
@ -198,8 +196,6 @@
popl %%fs\n \ popl %%fs\n \
popl %%es\n \ popl %%es\n \
popl %%ds":::);\ popl %%ds":::);\
if (usermode==true)\
asm("add $0x8,%%esp"::);\
}) })
/* /*
@ -237,11 +233,11 @@ typedef struct regs {
u32 fs; u32 fs;
u32 es; u32 es;
u32 ds; u32 ds;
u32 ss;
u32 esp;
u32 eip; u32 eip;
u32 cs; u32 cs;
u32 eflags; u32 eflags;
u32 esp;
u32 ss;
} regs __attribute__ ((packed)); } regs __attribute__ ((packed));
/* exception pile */ /* exception pile */
typedef struct exception_stack { typedef struct exception_stack {

View File

@ -214,14 +214,7 @@ void exception1()
initselectors(retry_address); initselectors(retry_address);
} }
changevc(0); changevc(0);
if (dump->cs==SEL_KERNEL_CODE) restdebugcpu();
{
restdebugcpu(true);
}
else
{
restdebugcpu(false);
}
iret(); 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); 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); cpuerror("#SS Page fault",dump);
} }
if (dump->cs==SEL_KERNEL_CODE) restdebugcpu();
{
restdebugcpu(true);
}
else
{
restdebugcpu(false);
}
iret(); iret();
} }

View File

@ -154,18 +154,12 @@ u32 task_usePID (u32 pid)
void task_switch(u32 pid, bool fromkernelmode) void task_switch(u32 pid, bool fromkernelmode)
{ {
process *previous=current;
current = &processes[pid]; current = &processes[pid];
setTSS(current->kstack.ss0,current->kstack.esp0); setTSS(current->kstack.ss0,current->kstack.esp0);
current->dump.eflags = (current->dump.eflags | 0x200) & 0xFFFFBFFF; current->dump.eflags = (current->dump.eflags | 0x200) & 0xFFFFBFFF;
createdump(current->dump); createdump(current->dump);
if (fromkernelmode) restdebugcpu();
{
restdebugcpu(true);
}
else
{
restdebugcpu(false);
}
iret(); iret();
} }
@ -175,7 +169,7 @@ void task_switch(u32 pid, bool fromkernelmode)
void task_run(u32 pid) void task_run(u32 pid)
{ {
processes[pid].status = STATUS_RUN; 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); setcr3(processes[pid].pdd->addr->paddr);
kstack = virtual_page_getfree(); kstack = virtual_page_getfree();
processes[pid].dump.ss = SEL_USER_STACK | RPL_RING3; 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.eflags = 0x0;
processes[pid].dump.cs = SEL_USER_CODE | RPL_RING3; processes[pid].dump.cs = SEL_USER_CODE | RPL_RING3;
processes[pid].dump.eip = elf_load(code,pid); processes[pid].dump.eip = elf_load(code,pid);

View File

@ -42,7 +42,7 @@ void sysenter_handler(void)
break; break;
} }
restdebugcpu(true); restdebugcpu();
sysexit(); sysexit();
} }