From 44d5634532b8109aa5552a94d1ac6c1d8bc95d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Mon, 10 Dec 2018 19:12:20 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20pr=C3=A9paration=20au=20basculement=20de?= =?UTF-8?q?=20t=C3=A2che=20par=20la=20pile=20fonction=20task=5Fswitch,=20c?= =?UTF-8?q?orrection=20=C3=A0=20apporter=20dans=20la=20gestion=20de=20la?= =?UTF-8?q?=20m=C3=A9moire?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/asm.h | 4 ++++ include/gdt.h | 1 + include/interrupts.h | 2 +- include/process.h | 1 + lib/gdt.c | 9 +++++++++ lib/interrupts.c | 38 +++++++++++++++++++++++++++++++++++++- lib/process.c | 21 +++++++++++++++++++++ 7 files changed, 74 insertions(+), 2 deletions(-) diff --git a/include/asm.h b/include/asm.h index b648462..0733f95 100755 --- a/include/asm.h +++ b/include/asm.h @@ -21,6 +21,10 @@ #define pushf() asm("pushf"::) +#define pop(mem) asm("popl %0":"=m" (mem)) + +#define push(mem) asm("pushl %0"::"m" (mem)) + #define popf() asm("popf"::) #define iret() asm("iret"::) diff --git a/include/gdt.h b/include/gdt.h index f1eee82..97c5b0b 100755 --- a/include/gdt.h +++ b/include/gdt.h @@ -85,3 +85,4 @@ bool isdesvalid(u16 sel); u8 getdesbit3(u16 sel); u32 getdesdpl(u16 sel); u16 getdesalign(u16 sel); +void setTSS(u32 ss,u32 sp); diff --git a/include/interrupts.h b/include/interrupts.h index 6a23c95..ee6facc 100755 --- a/include/interrupts.h +++ b/include/interrupts.h @@ -220,6 +220,6 @@ struct idtr { void enableirq(u8 irq); void disableirq(u8 irq); void cpuerror(const u8 * src, const regs *stack); - + void createdump(regs *dump); #endif diff --git a/include/process.h b/include/process.h index 62f92b8..1467621 100755 --- a/include/process.h +++ b/include/process.h @@ -145,5 +145,6 @@ u32 task_usePID (u32 pid); u32 task_create(); u32 elf_test(u8 *src); u32 elf_load(u8 *src, u32 pid); +void task_switch(u32 pid, bool fromkernelmode); process *getcurrentprocess(); void task_run(u32 pid); diff --git a/lib/gdt.c b/lib/gdt.c index bc53820..1b06cb0 100755 --- a/lib/gdt.c +++ b/lib/gdt.c @@ -46,6 +46,15 @@ void initgdt(u32 offset) initselectors(offset); } +/*******************************************************************************/ +/* Change le TSS courant */ + +void setTSS(u32 ss,u32 sp) +{ + tss0.esp0 = sp; + tss0.ss0 = ss; +} + /*******************************************************************************/ /* Initialise le registre de tâche (TSR) */ diff --git a/lib/interrupts.c b/lib/interrupts.c index 5ae92d7..8b0091f 100755 --- a/lib/interrupts.c +++ b/lib/interrupts.c @@ -125,7 +125,6 @@ void setidt(u32 offset, u16 select, u16 type, u16 index) } /******************************************************************************/ - /* Met une entrĂ©e dans l'IDT */ void putidt(u32 offset, u16 select, u16 type, u16 index) @@ -135,6 +134,43 @@ void putidt(u32 offset, u16 select, u16 type, u16 index) idt[index] = temp; } +/******************************************************************************/ +/* CrĂ©Ă© un dump de la mĂ©moire en empilant les registres */ + + void createdump(regs *dump) +{ + push(dump->eax); + push(dump->ecx); + push(dump->edx); + push(dump->ebx); + push(dump->esp); + push(dump->ebp); + push(dump->esi); + push(dump->edi); + push(dump->eflags); + push(dump->cs); + push(dump->eip); + push(dump->ds); + push(dump->es); + push(dump->fs); + push(dump->gs); + push(dump->ss); + push(dump->cr0); + push(dump->cr2); + push(dump->cr3); + push(dump->cr4); + push(dump->dr0); + push(dump->dr1); + push(dump->dr2); + push(dump->dr3); + push(dump->dr6); + push(dump->dr7); + u32 eferlow=dump->efer & 0xFFFF; + u32 eferhigh=dump->efer >> 32; + push(eferlow); + push(eferhigh); +} + /******************************************************************************/ /* Affiche une erreur CPU et fige l'ordinateur */ diff --git a/lib/process.c b/lib/process.c index bc7db02..aeb57c8 100644 --- a/lib/process.c +++ b/lib/process.c @@ -149,12 +149,33 @@ u32 task_usePID (u32 pid) lastpid=pid; } +/*******************************************************************************/ +/* Bascule vers une tâche */ + +void task_switch(u32 pid, bool fromkernelmode) +{ + u32 ss,esp,eflags; + current = &processes[pid]; + setTSS(current->kstack.ss0,current->kstack.esp0); + eflags = (current->dump.eflags | 0x200) & 0xFFFFBFFF; + if (fromkernelmode) { + ss = current->dump.ss; + esp = current->dump.esp; + } else { + ss = current->kstack.ss0; + esp = current->kstack.esp0; + } + createdump(¤t->dump); + restdebugcpu(); +} + /*******************************************************************************/ /* Execute une tâche */ void task_run(u32 pid) { processes[pid].status = STATUS_RUN; + task_switch(pid, true); } /*******************************************************************************/