[????] BUILD 0.1.1.50 DATE 9/20/2011 AT 12:43 PM

====================================================
Mainly changed: Tasking
+ Implemented multitasking
+ Switching works
? TODO: Fix other not working tasking routines
This commit is contained in:
2021-09-14 18:58:06 +03:00
parent 581c6b92fe
commit 17342b6665
22 changed files with 10331 additions and 10385 deletions

View File

@ -0,0 +1,7 @@
; tasking.asm
bits 32
global TaskReadEip
TaskReadEip:
pop eax
jmp eax

View File

@ -7,27 +7,41 @@
#include <tasking.h>
#include <memory-add.h>
#include <stdio.h>
Task* TaskList;
Task* CurrentTask;
uint32 NextPid = 1;
void TaskSwitch ()
void TaskSwitch (_RegsStack32* regs)
{
MagicBreakpoint();
if (!TaskList) return;
uint32 eip = TaskReadEip();
if (eip == 0xABCDEF) return;
// Save context
asm volatile ("mov %%esp, %0" : "=r"(CurrentTask->Esp)); // Stack pointer
asm volatile ("mov %%ebp, %0" : "=r"(CurrentTask->Ebp)); // Base pointer
CurrentTask->Pd = CurrentDirectory;
asm volatile ("mov %%esp, %0" : "=r"(CurrentTask->Esp));
asm volatile ("mov %%ebp, %0" : "=r"(CurrentTask->Ebp));
CurrentTask->Eip = eip;
// Next task
CurrentTask = (!CurrentTask->Next) ? TaskList : CurrentTask->Next ;
// Switch context
PagingSwitchDirectory(CurrentTask->Pd);
asm volatile ("mov %0, %%esp" : : "r"(CurrentTask->Esp)); // Stack pointer
asm volatile ("mov %0, %%ebp" : : "r"(CurrentTask->Ebp)); // Base pointer
// Prepare for jump
asm volatile (""
"mov %0, %%ebp; "
"mov %1, %%esp; "
"mov %2, %%ecx; "
"mov $0xABCDEF, %%eax; "
"jmp *%%ecx; "
: : "r"(CurrentTask->Ebp), "r"(CurrentTask->Esp), "r"(CurrentTask->Eip)
: "eax", "ecx");
}
// Fallback for new tasks
@ -64,25 +78,16 @@ void TaskCreate (void (*func)())
t->Pid = NextPid++;
// Set up stack
*(uint32 *) (t->StackUpperBase - 0x4) = (uint32) TaskEnd; // Fallback function
t->Ebp = (uint32) t->StackUpperBase;
/*memset(&t->Regs, 0, sizeof(_RegsStack32));
t->Regs.ebp = t->StackUpperBase;
t->Regs.esp = (t->StackUpperBase - 0x4 - sizeof(_RegsStack32));
t->Regs.useresp = t->StackUpperBase - 0x4;
t->Regs.eip = (uint32) func;
*(uint32 *) (t->Regs.esp) = (uint32) TaskEnd; // Fallback function
t->Initialized = 0;
_RegsStack32* regs = (_RegsStack32*) (t->StackUpperBase - 0x4 - sizeof(_RegsStack32));
asm volatile ("mov %%ss, %0" : "=r" (regs->ss));
asm volatile ("mov %%cs, %0" : "=r" (regs->cs));
asm volatile ("pushf; pop %0" : "=r" (regs->eflags));
asm volatile ("mov %%esi, %0" : "=r" (regs->esi));
asm volatile ("mov %%edi, %0" : "=r" (regs->edi));
asm volatile ("mov %%gs, %0" : "=r" (regs->gs));
asm volatile ("mov %%fs, %0" : "=r" (regs->fs));
asm volatile ("mov %%es, %0" : "=r" (regs->es));
asm volatile ("mov %%ds, %0" : "=r" (regs->ds));
regs->eax = regs->ebx = regs->ecx = regs->edx = 0;
regs->eip = (uint32)func;
regs->useresp = t->StackUpperBase-0x4;
regs->esp = t->StackUpperBase - 40;
regs->ebp = t->Ebp = t->StackUpperBase;
// Read eflags
asm volatile ("pushf; pop %0" : "=r"(t->Regs.eflags));*/
// Add the task to the list
Task* last = TaskList;
@ -96,7 +101,6 @@ void TaskInitialize()
t->Pid = NextPid++;
t->Pd = KernelDirectory;
t->Esp = t->Ebp = 0;
t->Next = NULL;
TaskList = CurrentTask = t;