feat: fonction task_switch & task_run passe en mode utilisateur RING0 mais plantage lors de l'execution
This commit is contained in:
parent
dd70f75ab8
commit
69fa9567a1
|
@ -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 {
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -42,7 +42,7 @@ void sysenter_handler(void)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
restdebugcpu(true);
|
restdebugcpu();
|
||||||
sysexit();
|
sysexit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue