[????] 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:
@ -118,3 +118,9 @@ int32 LogWrite (uint8 error, string device, string format, ...)
|
||||
ConsoleCursorUpdateHardware();
|
||||
return i;
|
||||
}
|
||||
|
||||
void LogAssert (int32 condition, string file, int32 line)
|
||||
{
|
||||
if (!condition)
|
||||
Panic("Assert", "Assertion failed in file %s line %d.\n", file, line);
|
||||
}
|
||||
|
@ -6,9 +6,9 @@
|
||||
volatile TimeSystem _internal_time;
|
||||
uint32 _internal_frequency_hz;
|
||||
|
||||
extern void TaskSwitch ();
|
||||
extern void TaskSwitch (_RegsStack32* regs);
|
||||
|
||||
void TimeHandler(_RegsStack32* UNUSED(r))
|
||||
void TimeHandler(_RegsStack32* r)
|
||||
{
|
||||
if (_internal_frequency_hz == 0) return;
|
||||
|
||||
@ -19,5 +19,5 @@ void TimeHandler(_RegsStack32* UNUSED(r))
|
||||
_internal_time.Time-=MILISECONDS_IN_DAY;
|
||||
}
|
||||
|
||||
TaskSwitch();
|
||||
TaskSwitch(r);
|
||||
}
|
||||
|
@ -70,8 +70,8 @@ void CrashMessage(_RegsStack32 *r)
|
||||
ConsoleCursorGoto(c); ConsoleWrite("eflags=0x%x", r->eflags);
|
||||
ConsoleCursorGoto(d); ConsoleWrite("useresp=0x%x\n", r->useresp);
|
||||
|
||||
ConsoleCursorGoto(a); ConsoleWrite("gs=0x%x", r->ss);
|
||||
ConsoleCursorGoto(b); ConsoleWrite("fs=0x%x", r->int_no);
|
||||
ConsoleCursorGoto(a); ConsoleWrite("ss=0x%x", r->ss);
|
||||
ConsoleCursorGoto(b); ConsoleWrite("int_no=0x%x", r->int_no);
|
||||
ConsoleCursorGoto(c); ConsoleWrite("err_code=0x%x", r->err_code);
|
||||
|
||||
// Useful info about page fault
|
||||
|
@ -65,10 +65,12 @@ extern void ConsoleMain();
|
||||
// External test routines
|
||||
extern void SystemPanic();
|
||||
extern int32 LogWrite (uint8 error, string device, string format, ...);
|
||||
extern void LogAssert (int32 condition, string file, int32 line);
|
||||
|
||||
// Debug print
|
||||
#define Log(dev, ...) { LogWrite(0, dev, __VA_ARGS__); }
|
||||
#define Error(dev, ...) { LogWrite(1, dev, __VA_ARGS__); }
|
||||
#define Panic(dev, ...) { LogWrite(1, dev, __VA_ARGS__); SystemPanic(); }
|
||||
#define Assert(c) { LogAssert(c, __FILE__, __LINE__); }
|
||||
|
||||
#endif
|
||||
|
@ -13,10 +13,11 @@
|
||||
|
||||
typedef struct _Task {
|
||||
uint32 Pid;
|
||||
uint32 Esp, Ebp; // Stack
|
||||
uint32 Eip, Esp, Ebp;
|
||||
PageDirectory* Pd;
|
||||
uint32 StackLowerBase;
|
||||
uint32 StackUpperBase;
|
||||
uint8 Initialized;
|
||||
struct _Task* Next;
|
||||
} Task;
|
||||
|
||||
|
@ -1 +1 @@
|
||||
#define OS_BUILD "0.1.1.19"
|
||||
#define OS_BUILD "0.1.1.50"
|
||||
|
7
Kernel/tasking/tasking-asm.asm
Normal file
7
Kernel/tasking/tasking-asm.asm
Normal file
@ -0,0 +1,7 @@
|
||||
; tasking.asm
|
||||
bits 32
|
||||
|
||||
global TaskReadEip
|
||||
TaskReadEip:
|
||||
pop eax
|
||||
jmp eax
|
@ -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;
|
||||
|
Reference in New Issue
Block a user