Working again!

alentours-dev
Sergiusz Bazanski 2011-04-30 19:08:46 +02:00
parent 07f4f66ba5
commit c3c1001931
9 changed files with 39 additions and 31 deletions

View File

@ -6,8 +6,6 @@ extern "C" {
#include "Tier0/paging.h" #include "Tier0/paging.h"
}; };
#include "Tier1/CKernel.h"
// This is more-or less just a C++ wrapper for T_PGAE_DIRECTORY. // This is more-or less just a C++ wrapper for T_PGAE_DIRECTORY.
namespace cb { namespace cb {
class CPageDirectory { class CPageDirectory {
@ -20,7 +18,7 @@ namespace cb {
// A bitmap precising whether a table is owned by the page directory // A bitmap precising whether a table is owned by the page directory
// (== can we delete it when we delete the directory itself) // (== can we delete it when we delete the directory itself)
u32 m_OwnerBitmap[32]; volatile u32 m_OwnerBitmap[32];
// Check whether a table is owned by us // Check whether a table is owned by us
bool IsTableOurs(u32 Virtual); bool IsTableOurs(u32 Virtual);

View File

@ -2,8 +2,8 @@
#define __CTASK_H__ #define __CTASK_H__
#include "types.h" #include "types.h"
#include "Tier1/CPageDirectory.h"
#include "Tier1/CKernel.h" #include "Tier1/CKernel.h"
#include "Tier1/CPageDirectory.h"
// Task memory map... // Task memory map...
// _______________________ // _______________________
@ -97,9 +97,9 @@ namespace cb {
ETaskPriority m_Priority; ETaskPriority m_Priority;
ETaskRing m_Ring; ETaskRing m_Ring;
bool m_User; bool m_User;
u32 m_PID; volatile u32 m_PID;
u32 m_ESP, m_EIP, m_EBP; volatile u32 m_ESP, m_EIP, m_EBP;
u32 m_HeapStart; u32 m_HeapStart;
u32 m_HeapSize; u32 m_HeapSize;
@ -136,8 +136,7 @@ namespace cb {
inline u32 GetPageDirectoryPhysicalAddress(void) inline u32 GetPageDirectoryPhysicalAddress(void)
{ {
//return m_Directory->m_Directory->PhysicalAddress; return m_Directory->m_Directory->PhysicalAddress;
return 0;
} }
inline void SetESP(u32 ESP) { m_ESP = ESP; } inline void SetESP(u32 ESP) { m_ESP = ESP; }

View File

@ -2,6 +2,7 @@
#define __ISCHEDULER_H__ #define __ISCHEDULER_H__
#include "Tier1/CTask.h" #include "Tier1/CTask.h"
#include "Tier0/semaphore.h"
namespace cb { namespace cb {
class IScheduler { class IScheduler {
@ -10,6 +11,8 @@ namespace cb {
virtual void AddTask(CTask *Task) = 0; virtual void AddTask(CTask *Task) = 0;
virtual void NextTask(void) = 0; virtual void NextTask(void) = 0;
virtual CTask *GetCurrentTask(void) = 0; virtual CTask *GetCurrentTask(void) = 0;
virtual void AcquireSemaphore(T_SEMAPHORE *Semaphore) = 0;
virtual void ReleaseSemaphore(T_SEMAPHORE *Semaphore) = 0;
}; };
}; };

View File

@ -64,7 +64,7 @@ void kputi(s32 Number)
void kprintf(const s8 *szFormat, ...) void kprintf(const s8 *szFormat, ...)
{ {
semaphore_acquire(&ScreenWriteLock); //semaphore_acquire(&ScreenWriteLock);
va_list ap; va_list ap;
va_start(ap, szFormat); va_start(ap, szFormat);
@ -112,7 +112,7 @@ void kprintf(const s8 *szFormat, ...)
} }
va_end(ap); va_end(ap);
semaphore_release(&ScreenWriteLock); //semaphore_release(&ScreenWriteLock);
} }
void kscroll_up(void) void kscroll_up(void)
@ -199,6 +199,7 @@ void kdump(u8 *bData, u32 Length)
void kputch(s8 Character) void kputch(s8 Character)
{ {
semaphore_acquire(&ScreenWriteLock);
volatile u8 *VideoMemory = (u8 *)0xC00B8000; volatile u8 *VideoMemory = (u8 *)0xC00B8000;
u16 Offset = (g_kstdio_cur_y * 80 + g_kstdio_cur_x) << 1; u16 Offset = (g_kstdio_cur_y * 80 + g_kstdio_cur_x) << 1;
@ -213,6 +214,7 @@ void kputch(s8 Character)
else else
kmove_cursor(g_kstdio_cur_x + 1, g_kstdio_cur_y); kmove_cursor(g_kstdio_cur_x + 1, g_kstdio_cur_y);
} }
semaphore_release(&ScreenWriteLock);
} }
void kputs(const s8 *szString) void kputs(const s8 *szString)

View File

@ -54,6 +54,7 @@ void CKernel::Start(void)
m_DriverManager->LoadNew(); m_DriverManager->LoadNew();
CTask *KernelTask = CreateKernelTask(); CTask *KernelTask = CreateKernelTask();
kprintf("[i] Kernel task has TID %i.\n", KernelTask->GetPID());
CScheduler::AddTask(KernelTask); CScheduler::AddTask(KernelTask);
CScheduler::Enable(); CScheduler::Enable();
@ -61,11 +62,10 @@ void CKernel::Start(void)
CTask *ParentTask = CScheduler::GetCurrentTask(); CTask *ParentTask = CScheduler::GetCurrentTask();
CTask *NewTask = ParentTask->Fork(); CTask *NewTask = ParentTask->Fork();
if (NewTask == ParentTask) if (NewTask == ParentTask)
{ {
for (;;) { for (;;) {
for (volatile u32 i = 0; i < 350; i++) for (volatile u32 i = 0; i < 3500; i++)
{ {
for (volatile u32 j = 0; j < 650; j++){} for (volatile u32 j = 0; j < 650; j++){}
} }
@ -75,7 +75,7 @@ void CKernel::Start(void)
else else
{ {
for (;;) { for (;;) {
for (volatile u32 i = 0; i < 350; i++) for (volatile u32 i = 0; i < 3500; i++)
{ {
for (volatile u32 j = 0; j < 650; j++){} for (volatile u32 j = 0; j < 650; j++){}
} }

View File

@ -10,6 +10,8 @@ extern "C" {
#include "Tier0/kstdio.h" #include "Tier0/kstdio.h"
}; };
#include "Tier1/CKernel.h"
CPageDirectory *g_KernelPageDirectory; CPageDirectory *g_KernelPageDirectory;
CPageDirectory::CPageDirectory(bool Empty) CPageDirectory::CPageDirectory(bool Empty)

View File

@ -14,7 +14,6 @@ void CRoundRobinScheduler::Enable(bool Enabled)
__attribute__((optimize("O0"))) void CRoundRobinScheduler::NextTask(void) __attribute__((optimize("O0"))) void CRoundRobinScheduler::NextTask(void)
{ {
__asm__ volatile("cli");
volatile u32 NewEBP, NewESP, NewEIP, EBP, ESP, Directory; volatile u32 NewEBP, NewESP, NewEIP, EBP, ESP, Directory;
if (m_TaskQueue.GetSize() == 0) if (m_TaskQueue.GetSize() == 0)
@ -27,14 +26,18 @@ __attribute__((optimize("O0"))) void CRoundRobinScheduler::NextTask(void)
m_TaskQueuePosition = 0; m_TaskQueuePosition = 0;
CTask *NextTask = m_TaskQueue[m_TaskQueuePosition]; CTask *NextTask = m_TaskQueue[m_TaskQueuePosition];
if (m_CurrentTask->GetPID() == NextTask->GetPID())
return;
//kprintf("[i] %i -> %i (%x)\n", m_CurrentTask->GetPID(), NextTask->GetPID(), NextTask);
// Read task details // Read task details
NewEBP = NextTask->GetEBP(); NewEBP = NextTask->GetEBP();
NewESP = NextTask->GetESP(); NewESP = NextTask->GetESP();
NewEIP = NextTask->GetEIP(); NewEIP = NextTask->GetEIP();
if (!NewEIP || !NewESP || !NewEBP) if (!NewEIP || !NewESP || !NewEBP)
{ {
kprintf("[i] no wai\n"); //kprintf("null %x %x %x\n", NewEIP, NewESP, NewEBP);
return; return;
} }
@ -46,7 +49,6 @@ __attribute__((optimize("O0"))) void CRoundRobinScheduler::NextTask(void)
// Return point // Return point
volatile u32 ReturnPoint = ctask_geteip(); volatile u32 ReturnPoint = ctask_geteip();
//kprintf("return point %x\n", ReturnPoint);
if (ReturnPoint == 0xFEEDFACE) if (ReturnPoint == 0xFEEDFACE)
{ {
@ -55,7 +57,6 @@ __attribute__((optimize("O0"))) void CRoundRobinScheduler::NextTask(void)
} }
m_CurrentTask->SetEIP(ReturnPoint); m_CurrentTask->SetEIP(ReturnPoint);
// Switch to next task // Switch to next task
m_CurrentTask = NextTask; m_CurrentTask = NextTask;
@ -79,9 +80,9 @@ __attribute__((optimize("O0"))) void CRoundRobinScheduler::NextTask(void)
void CRoundRobinScheduler::AddTask(CTask *Task) void CRoundRobinScheduler::AddTask(CTask *Task)
{ {
__asm__ volatile("cli");
m_TaskQueue.Push(Task); m_TaskQueue.Push(Task);
__asm__ volatile("sti"); if (m_TaskQueue.GetSize() == 1)
m_CurrentTask = Task;
} }
CTask *CRoundRobinScheduler::GetCurrentTask(void) CTask *CRoundRobinScheduler::GetCurrentTask(void)

View File

@ -9,7 +9,7 @@ extern "C" {
#include "Tier0/kstdio.h" #include "Tier0/kstdio.h"
} }
CScheduler g_Scheduler; volatile CScheduler g_Scheduler;
CScheduler::CScheduler(void) CScheduler::CScheduler(void)
{ {
@ -20,6 +20,7 @@ CScheduler::CScheduler(void)
void CScheduler::AddTask(CTask *Task) void CScheduler::AddTask(CTask *Task)
{ {
__asm__ volatile("cli"); __asm__ volatile("cli");
kprintf("[i] Adding task %i (%x)\n", Task->GetPID(), Task);
g_Scheduler.m_CurrentScheduler->AddTask(Task); g_Scheduler.m_CurrentScheduler->AddTask(Task);
__asm__ volatile("sti"); __asm__ volatile("sti");
} }
@ -31,7 +32,7 @@ CTask *CScheduler::GetCurrentTask(void)
void CScheduler::Enable(void) void CScheduler::Enable(void)
{ {
u32 Divisor = 100; u32 Divisor = 0xFFFFFFFF;
koutb(0x43, 0x36); koutb(0x43, 0x36);
u8 Low = (u8)(Divisor & 0xFF); u8 Low = (u8)(Divisor & 0xFF);
u8 High = (u8)((Divisor >> 8) & 0xFF); u8 High = (u8)((Divisor >> 8) & 0xFF);
@ -41,7 +42,10 @@ void CScheduler::Enable(void)
interrupts_setup_irq(0x00, (void*)CScheduler::TimerTick); interrupts_setup_irq(0x00, (void*)CScheduler::TimerTick);
} }
void CScheduler::TimerTick(T_ISR_REGISTERS R) __attribute__((optimize("O0"))) void CScheduler::TimerTick(T_ISR_REGISTERS R)
{ {
__asm__ volatile("cli");
g_Scheduler.m_CurrentScheduler->NextTask(); g_Scheduler.m_CurrentScheduler->NextTask();
interrupts_irq_finish(0);
__asm__ volatile("sti");
} }

View File

@ -84,14 +84,12 @@ CPageDirectory *CTask::GetPageDirectory(void)
CTask *CTask::Fork(void) CTask *CTask::Fork(void)
{ {
__asm__ volatile("cli"); __asm__ volatile("cli");
u32 ESP, EBP; volatile u32 ESP, EBP;
CTask *ParentTask = CScheduler::GetCurrentTask(); CTask *ParentTask = CScheduler::GetCurrentTask();
CTask *NewTask = new CTask(m_User); CTask *NewTask = new CTask(m_User);
NewTask->m_Owner = m_Owner; NewTask->m_Owner = m_Owner;
NewTask->m_Ring = m_Ring; NewTask->m_Ring = m_Ring;
if (m_User) if (m_User)
{ {
//TODO: Write code for userland //TODO: Write code for userland
@ -102,15 +100,16 @@ CTask *CTask::Fork(void)
__asm__ volatile("mov %%ebp, %0" : "=r"(EBP)); __asm__ volatile("mov %%ebp, %0" : "=r"(EBP));
NewTask->CopyStack(this); NewTask->CopyStack(this);
u32 ForkPoint = ctask_geteip(); volatile u32 ForkPoint = ctask_geteip();
if (CScheduler::GetCurrentTask() == ParentTask) if (CScheduler::GetCurrentTask() == ParentTask)
{ {
NewTask->m_ESP = ESP; NewTask->m_ESP = ESP;
NewTask->m_EBP = EBP; NewTask->m_EBP = EBP;
NewTask->m_EIP = ForkPoint; NewTask->m_EIP = ForkPoint;
kprintf("[i] Forked: TID %i, ESP %x, EBP %x...\n", NewTask->m_PID, kprintf("[i] Forked: TID %i, ESP %x, EBP %x, EIP %x...\n", NewTask->m_PID,
ESP, EBP); ESP, EBP, ForkPoint);
CScheduler::AddTask(NewTask); CScheduler::AddTask(NewTask);
__asm__ volatile("sti"); __asm__ volatile("sti");
@ -119,7 +118,7 @@ CTask *CTask::Fork(void)
} }
else else
{ {
__asm__ volatile("sti");; __asm__ volatile("sti");
//for(;;){} //for(;;){}
return NewTask; return NewTask;
} }