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

Reply via email to