Example #1
0
        public static unsafe Thread CreateTask(uint xLoc, bool isRunning)
        {
            Native.ClearInterrupt();

            uint *stack;

            Task *task = (Task *)(Heap.AllocateMem((uint)sizeof(Task)));

            task->Stack = Heap.AllocateMem(0x1000) + 0x1000;//Put pointer at end

            stack = (uint *)task->Stack;

            // Expand down stack
            // processor data
            *--stack = 0x202;       // EFLAGS
            *--stack = 0x08;        // CS
            *--stack = xLoc;        // EIP

            // pusha
            *--stack = 0;           // EDI
            *--stack = 0;           // ESI
            *--stack = 0;           // EBP
            *--stack = 0;           // ESP
            *--stack = 0;           // EBX
            *--stack = 0;           // EDX
            *--stack = 0;           // ECX
            *--stack = 0;           // EAX

            // data segments
            *--stack = 0x10;        // DS
            *--stack = 0x10;        // ES
            *--stack = 0x10;        // FS
            *--stack = 0x10;        // GS

            task->Stack   = (uint)stack;
            task->Address = (uint *)xLoc;
            task->state   = (byte)(isRunning ? State.Alive : State.None);

            mTasks[Counter++] = *task;

            if (isRunning)
            {
                RunningTasks.Enqueue(Counter - 1);
            }

            Native.SetInterrupt();
            return(new Thread(Counter - 1));
        }