Example #1
0
        // Methods is always called within Interrupt with Interrupt disabled

        // TODO: Code duplication! Both SwitchToThreadMethod are very similar.

        public unsafe void SwitchToThreadMethod(ref SysCallContext context, ref SystemMessage args)
        {
            var th      = CreateThread(DefaultDispatchEntryPoint, SystemMessage.Size);
            var argsPtr = (SystemMessage *)Unsafe.AsPointer(ref args);

            th.DebugSystemMessage = *argsPtr;
            var argAddr = (SystemMessage *)th.GetArgumentAddr(0);

            argAddr[0] = *argsPtr;
            SwitchToThread(context, th);
        }
Example #2
0
        internal static void Service(ref IDTStack stack)
        {
            var handler = IDTManager.Handlers[stack.Interrupt];

            if (handler.Service == null)
            {
                KernelMessage.WriteLine("handler.Service == null");
                return;
            }

            var ctx = new SysCallContext
            {
                CallingType = SysCallCallingType.Async, // Important! Otherwise stack will corrupted
            };

            var msg = new SystemMessage(SysCallTarget.Interrupt)
            {
                Arg1 = stack.Interrupt,
            };

            Scheduler.SaveThreadState(Scheduler.GetCurrentThread().ThreadID, ref stack);
            handler.Service.SwitchToThreadMethod(ref ctx, ref msg);
        }