// 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); }
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); }