Still needs task billing and some callbacks are still disabled. Console has
been move into a thread. Some commands crash the system for some reason like
cpuid and memdump.
Index: Kernel/Core/ADC/Task.cs
===================================================================
--- Kernel/Core/ADC/Task.cs (revision 0)
+++ Kernel/Core/ADC/Task.cs (revision 0)
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+
+namespace SharpOS.Kernel.ADC
+{
+ [StructLayout(LayoutKind.Sequential)]
+ public struct Task
+ {
+ public const uint SizeOf = 14;
+ public uint stackPointer;
+ public uint stackMemory;
+ public uint taskId;
+ public bool valid;
+ public bool enabled;
+
+ public void Start()
+ {
+ enabled = true;
+ }
+ }
+}
Index: Kernel/Core/ADC/TaskManager.cs
===================================================================
--- Kernel/Core/ADC/TaskManager.cs (revision 0)
+++ Kernel/Core/ADC/TaskManager.cs (revision 0)
@@ -0,0 +1,53 @@
+using System;
+using AOTAttr = SharpOS.AOT.Attributes;
+
+namespace SharpOS.Kernel.ADC
+{
+ public static unsafe class TaskManager
+ {
+ internal const int maxTasks = 1024;
+ internal static Task* tasks = (Task*)Stubs.StaticAlloc(Task.SizeOf *
maxTasks);
+ internal static Task** currentTask =
(Task**)Stubs.LabelledAlloc("currentTask", 4);
+ internal static uint currentTaskNum;
+ internal static uint threadCount = 0;
+
+ public static unsafe void InitKernelTask()
+ {
+ Task* kt = (Task*)&tasks[0];
+ currentTaskNum = 0;
+ *currentTask = kt;
+ kt->valid = true;
+ kt->enabled = true;
+
+ SharpOS.Kernel.ADC.TaskManager.threadCount++;
+ }
+
+ [AOTAttr.ADCStub]
+ public static unsafe Task* CreateTask(uint address)
+ {
+ Diagnostics.Error("Unimplemented - Setup");
+
+ return (Task*)0;
+ }
+
+ public static Task* GetNextTask()
+ {
+ Task* t = (Task*)0;
+
+ for (int i = 0; i < threadCount; i++)
+ {
+ currentTaskNum++;
+ if (currentTaskNum >= threadCount)
+ currentTaskNum = 0;
+
+ if (tasks[currentTaskNum].enabled)
+ {
+ t = (Task*)&tasks[currentTaskNum];
+ break;
+ }
+ }
+
+ return t;
+ }
+ }
+}
Index: Kernel/Core/ADC/Timer.cs
===================================================================
--- Kernel/Core/ADC/Timer.cs (revision 855)
+++ Kernel/Core/ADC/Timer.cs (working copy)
@@ -30,5 +30,11 @@
{
return 0;
}
+
+ [AOTAttr.ADCStub]
+ public static uint GetTicks()
+ {
+ return 0;
+ }
}
}
Index: Kernel/Core/ADC/X86/Architecture.cs
===================================================================
--- Kernel/Core/ADC/X86/Architecture.cs (revision 855)
+++ Kernel/Core/ADC/X86/Architecture.cs (working copy)
@@ -25,11 +25,13 @@
#region Setup
public static void Setup ()
{
- GDT.Setup (); // Global Descriptor Table
- PIC.Setup (); // Programmable Interrupt
Controller
- IDT.Setup (); // Interrupt Descriptor table
- PIT.Setup (); // Periodic Interrupt Timer
- Serial.Setup (); // Setup serial I/O
+ GDT.Setup (); // Global Descriptor Table
+ SharpOS.Kernel.ADC.TaskManager.InitKernelTask();
+ PIC.Setup (); // Programmable Interrupt Controller
+ IDT.Setup (); // Interrupt Descriptor table
+ PIT.Setup (); // Periodic Interrupt Timer
+ Serial.Setup (); // Setup serial I/O
+
}
#endregion
Index: Kernel/Core/ADC/X86/IDT.cs
===================================================================
--- Kernel/Core/ADC/X86/IDT.cs (revision 855)
+++ Kernel/Core/ADC/X86/IDT.cs (working copy)
@@ -352,7 +352,8 @@
ADC.TextMode.Write (" CR2=0x", (int) cr2);
ADC.TextMode.WriteLine ();
- ADC.TextMode.Write (" EIP=0x", (int) data.EIP);
+ ADC.TextMode.Write (" EIP=0x");
+ ADC.TextMode.Write((int)data.EIP, true);
ADC.TextMode.WriteLine ();
ADC.TextMode.Write (" EAX=0x", (int) data.EAX);
@@ -362,7 +363,8 @@
ADC.TextMode.WriteLine ();
- ADC.TextMode.Write (" ESP=0x", (int) data.ESP);
+ ADC.TextMode.Write (" ESP=0x");
+ ADC.TextMode.Write((int)data.ESP, true);
ADC.TextMode.Write (" EBP=0x", (int) data.EBP);
ADC.TextMode.Write (" ESI=0x", (int) data.ESI);
ADC.TextMode.Write (" EDI=0x", (int) data.EDI);
@@ -1936,6 +1938,8 @@
Asm.PUSH (Seg.GS);
Asm.PUSH (Seg.FS);
Asm.PUSH (Seg.SS);
+ Asm.MOV(R32.EAX, new SharpOS.AOT.X86.DWordMemory("currentTask"));
+ Asm.MOV(new SharpOS.AOT.X86.DWordMemory(null, R32.EAX, null, 0,
0), R32.ESP);
// Not necessary yet but perhaps in the future
Asm.MOV (R16.AX, GDT.DataSelector);
Index: Kernel/Core/ADC/X86/PIT.cs
===================================================================
--- Kernel/Core/ADC/X86/PIT.cs (revision 855)
+++ Kernel/Core/ADC/X86/PIT.cs (working copy)
@@ -28,7 +28,7 @@
private const uint PITFrequency = 1193182;
public static ushort HZ = 100;
- private static uint ticks = 0;
+ internal static uint ticks = 0;
unsafe static uint* timerEvent =
(uint*)Stubs.StaticAlloc(sizeof(uint) *
EntryModule.MaxEventHandlers);
@@ -116,15 +116,18 @@
{
ticks++;
- for (int x = 0; x < EntryModule.MaxEventHandlers; ++x) {
- if (timerEvent[x] == 0)
- continue;
+ //for (int x = 0; x < EntryModule.MaxEventHandlers; ++x)
+ //{
+ // if (timerEvent[x] == 0)
+ // continue;
- MemoryUtil.Call(timerEvent[x], ticks);
- }
+ // MemoryUtil.Call(timerEvent[x], ticks);
+ //}
// run scheduler here..
- data = *((IDT.ISRData*) ADC.Scheduler.GetNextThread
((void*) &data));
+ //data = *((IDT.ISRData*) ADC.Scheduler.GetNextThread
((void*) &data));
+ //TaskManager.Sched();
+ Asm.JMP("SCHED");
}
#endregion
}
Index: Kernel/Core/ADC/X86/TaskManager.cs
===================================================================
--- Kernel/Core/ADC/X86/TaskManager.cs (revision 0)
+++ Kernel/Core/ADC/X86/TaskManager.cs (revision 0)
@@ -0,0 +1,85 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+using SharpOS.Kernel;
+using SharpOS.AOT.X86;
+using SharpOS.Kernel.Foundation;
+
+namespace SharpOS.Kernel.ADC.X86
+{
+ public unsafe class TaskManager
+ {
+ [SharpOS.AOT.Attributes.Naked]
+ public static unsafe void Sched()
+ {
+ Asm.LABEL("SCHED");
+
+ *SharpOS.Kernel.ADC.TaskManager.currentTask =
SharpOS.Kernel.ADC.TaskManager.GetNextTask();
+
+ IO.WriteByte(IO.Port.Master_PIC_CommandPort, 0x20);
+
+ Asm.MOV(R32.EAX, new DWordMemory("currentTask"));
+ Asm.MOV(R32.ESP, new SharpOS.AOT.X86.DWordMemory(null, R32.EAX,
null, 0, 0));
+
+ Asm.POP(Seg.SS);
+ Asm.POP(Seg.FS);
+ Asm.POP(Seg.GS);
+ Asm.POP(Seg.ES);
+ Asm.POP(Seg.DS);
+ Asm.POPAD();
+ Asm.ADD(R32.ESP, 0x08);
+ Asm.STI();
+ Asm.IRETD();
+ }
+
+ public static unsafe Task* CreateTask(uint address)
+ {
+ Barrier.Enter();
+
+ Task* t = (Task*)0;
+ for (int i = 0; i < SharpOS.Kernel.ADC.TaskManager.maxTasks; i++)
+ {
+ if (!SharpOS.Kernel.ADC.TaskManager.tasks[i].valid)
+ {
+ t = (Task*)&SharpOS.Kernel.ADC.TaskManager.tasks[i];
+ break;
+ }
+ }
+
+ t->stackMemory = (uint)MemoryManager.Allocate(4096);
+ uint* stackBottom = (uint*)(t->stackMemory + 4092);
+ uint* stack = stackBottom;
+
+ *stack-- = 0x0202;
+ *stack-- = GDT.CodeSelector;
+ *stack-- = address;
+ *stack-- = 0;
+ *stack-- = 0;
+ *stack-- = 0; //edi
+ *stack-- = 0; //esi
+ *stack-- = 0; //ebp
+ *stack-- = (uint)stack; //esp
+ *stack-- = 0; //ebx
+ *stack-- = 0; //edx
+ *stack-- = 0; //ecx
+ *stack-- = 0; //eax
+ *stack-- = GDT.DataSelector; //ds
+ *stack-- = GDT.DataSelector; //es
+ *stack-- = GDT.DataSelector; //gs
+ *stack-- = GDT.DataSelector; //fs
+ *stack = GDT.DataSelector; //ss
+
+ t->stackPointer = (uint)stack;
+
+ t->valid = true;
+ t->enabled = false;
+
+ SharpOS.Kernel.ADC.TaskManager.threadCount++;
+
+ Barrier.Exit();
+
+ return t;
+ }
+ }
+}
Index: Kernel/Core/ADC/X86/Timer.cs
===================================================================
--- Kernel/Core/ADC/X86/Timer.cs (revision 855)
+++ Kernel/Core/ADC/X86/Timer.cs (working copy)
@@ -28,5 +28,10 @@
{
return PIT.HZ;
}
+
+ public static uint GetTicks()
+ {
+ return PIT.ticks;
+ }
}
}
Index: Kernel/Core/Console.cs
===================================================================
--- Kernel/Core/Console.cs (revision 855)
+++ Kernel/Core/Console.cs (working copy)
@@ -50,12 +50,12 @@
Keyboard.RegisterKeyUpEvent (Stubs.GetFunctionPointer
(CONSOLE_KEY_UP_HANDLER));
Keyboard.RegisterKeyDownEvent (Stubs.GetFunctionPointer
(CONSOLE_KEY_DOWN_HANDLER));
- SharpOS.Kernel.ADC.Timer.RegisterTimerEvent
(Stubs.GetFunctionPointer (CONSOLE_TIMER_HANDLER));
+ //SharpOS.Kernel.ADC.Timer.RegisterTimerEvent
(Stubs.GetFunctionPointer (CONSOLE_TIMER_HANDLER));
+
TaskManager.CreateTask(Stubs.GetFunctionPointer(CONSOLE_TIMER_HANDLER))->Start();
initialized = true;
TextMode.RefreshCursor ();
SetOverwrite (overwrite);
-
}
public static unsafe void SetOverwrite (bool _overwrite)
@@ -255,18 +255,22 @@
[SharpOS.AOT.Attributes.Label (CONSOLE_TIMER_HANDLER)]
public static unsafe void Timer (uint ticks)
{
- if (ticks % SharpOS.Kernel.ADC.Timer.GetFrequency () ==
0) {
- int x, y;
- TextMode.GetCursor (out x, out y);
- TextMode.SaveAttributes ();
- TextMode.MoveTo (0, 24);
- TextMode.SetAttributes (TextColor.Yellow,
TextColor.Red);
- Clock.Write ();
- TextMode.RestoreAttributes ();
- TextMode.MoveTo (x, y);
- }
+ while (true)
+ {
+ if (SharpOS.Kernel.ADC.Timer.GetTicks() %
SharpOS.Kernel.ADC.Timer.GetFrequency() == 0)
+ {
+ int x, y;
+ TextMode.GetCursor(out x, out y);
+ TextMode.SaveAttributes();
+ TextMode.MoveTo(0, 24);
+ TextMode.SetAttributes(TextColor.Yellow, TextColor.Red);
+ Clock.Write();
+ TextMode.RestoreAttributes();
+ TextMode.MoveTo(x, y);
+ }
- Shell.Prompter.Pulse ();
+ Shell.Prompter.Pulse();
+ }
}
}
}
Index: Kernel/Core/EntryModule.cs
===================================================================
--- Kernel/Core/EntryModule.cs (revision 855)
+++ Kernel/Core/EntryModule.cs (working copy)
@@ -107,8 +107,8 @@
StageMessage ("MemoryManager setup...");
ADC.MemoryManager.Setup ();
- StageMessage("Scheduler setup...");
- Scheduler.Setup();
+ //StageMessage("Scheduler setup...");
+ //Scheduler.Setup();
StageMessage ("Device setup...");
ADC.Architecture.DeviceManager.Setup ();
@@ -164,9 +164,49 @@
SetKernelStage (KernelStage.Diagnostics);
- while (stayInLoop);
+ Task* task1 =
TaskManager.CreateTask(Stubs.GetFunctionPointer("INIT"));
+ task1->Start();
+
+ while (stayInLoop) ;
}
+ [SharpOS.AOT.Attributes.Label("INIT")]
+ static unsafe void Init()
+ {
+ TextMode.WriteLine("INIT!");
+
+ //Task* task1 =
TaskManager.CreateTask(Stubs.GetFunctionPointer("THREAD_TEST"));
+ //task1->Start();
+
+ //Task* task2 =
TaskManager.CreateTask(Stubs.GetFunctionPointer("THREAD_TEST2"));
+ //task2->Start();
+
+ while (stayInLoop) ;
+ }
+
+ [SharpOS.AOT.Attributes.Label("THREAD_TEST")]
+ static unsafe void ThreadTest()
+ {
+ TextMode.WriteLine("Thread 1!");
+
+ while (true)
+ {
+ //TextMode.SetCursor(0, 0);
+ //TextMode.Write("*");
+ }
+ }
+
+ [SharpOS.AOT.Attributes.Label("THREAD_TEST2")]
+ static unsafe void ThreadTest2()
+ {
+ TextMode.WriteLine("Thread 2!");
+ while (true)
+ {
+ //TextMode.SetCursor(1, 0);
+ //TextMode.Write("+");
+ }
+ }
+
public static void DisplayBanner ()
{
TextMode.SaveAttributes ();
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
SharpOS-Developers mailing list
SharpOS-Developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sharpos-developers