private void InterruptHandler(IExecutionContext context) { KThread currentThread = KernelStatic.GetCurrentThread(); if (currentThread.Context.Running && currentThread.Owner != null && currentThread.GetUserDisableCount() != 0 && currentThread.Owner.PinnedThreads[currentThread.CurrentCore] == null) { KernelContext.CriticalSection.Enter(); currentThread.Owner.PinThread(currentThread); currentThread.SetUserInterruptFlag(); KernelContext.CriticalSection.Leave(); } if (currentThread.IsSchedulable) { KernelContext.Schedulers[currentThread.CurrentCore].Schedule(); } currentThread.HandlePostSyscall(); }
public void SvcCall(IExecutionContext context, ulong address, int id) { KThread currentThread = KernelStatic.GetCurrentThread(); if (currentThread.Owner != null && currentThread.GetUserDisableCount() != 0 && currentThread.Owner.PinnedThreads[currentThread.CurrentCore] == null) { _context.CriticalSection.Enter(); currentThread.Owner.PinThread(currentThread); currentThread.SetUserInterruptFlag(); _context.CriticalSection.Leave(); } if (context.IsAarch32) { SyscallDispatch.Dispatch32(_context.Syscall, context, id); } else { SyscallDispatch.Dispatch64(_context.Syscall, context, id); } currentThread.HandlePostSyscall(); }
private void InterruptHandler(object sender, EventArgs e) { KThread currentThread = KernelStatic.GetCurrentThread(); if (currentThread.Owner != null && currentThread.GetUserDisableCount() != 0 && currentThread.Owner.PinnedThreads[currentThread.CurrentCore] == null) { KernelContext.CriticalSection.Enter(); currentThread.Owner.PinThread(currentThread); currentThread.SetUserInterruptFlag(); if (currentThread.IsSchedulable) { KernelContext.Schedulers[currentThread.CurrentCore].Schedule(); } KernelContext.CriticalSection.Leave(); } else if (currentThread.IsSchedulable) { KernelContext.Schedulers[currentThread.CurrentCore].Schedule(); } currentThread.HandlePostSyscall(); }
public void SvcCall(object sender, InstExceptionEventArgs e) { KThread currentThread = KernelStatic.GetCurrentThread(); if (currentThread.Owner != null && currentThread.GetUserDisableCount() != 0 && currentThread.Owner.PinnedThreads[currentThread.CurrentCore] == null) { _context.CriticalSection.Enter(); currentThread.Owner.PinThread(currentThread); currentThread.SetUserInterruptFlag(); _context.CriticalSection.Leave(); } ExecutionContext context = (ExecutionContext)sender; if (context.IsAarch32) { var svcFunc = SyscallTable.SvcTable32[e.Id]; if (svcFunc == null) { throw new NotImplementedException($"SVC 0x{e.Id:X4} is not implemented."); } svcFunc(_syscall32, context); } else { var svcFunc = SyscallTable.SvcTable64[e.Id]; if (svcFunc == null) { throw new NotImplementedException($"SVC 0x{e.Id:X4} is not implemented."); } svcFunc(_syscall64, context); } currentThread.HandlePostSyscall(); }