namespace Ryujinx.Cpu
{
///
/// Exception callback without any additional arguments.
///
/// Context for the thread where the exception was triggered
public delegate void ExceptionCallbackNoArgs(IExecutionContext context);
///
/// Exception callback.
///
/// Context for the thread where the exception was triggered
/// Address of the instruction that caused the exception
/// Immediate value of the instruction that caused the exception, or for undefined instruction, the instruction itself
public delegate void ExceptionCallback(IExecutionContext context, ulong address, int imm);
///
/// Stores handlers for the various CPU exceptions.
///
public struct ExceptionCallbacks
{
///
/// Handler for CPU interrupts triggered using .
///
public readonly ExceptionCallbackNoArgs InterruptCallback;
///
/// Handler for CPU software interrupts caused by the Arm BRK instruction.
///
public readonly ExceptionCallback BreakCallback;
///
/// Handler for CPU software interrupts caused by the Arm SVC instruction.
///
public readonly ExceptionCallback SupervisorCallback;
///
/// Handler for CPU software interrupts caused by any undefined Arm instruction.
///
public readonly ExceptionCallback UndefinedCallback;
///
/// Creates a new exception callbacks structure.
///
///
/// All handlers are optional, and if null, the CPU will just continue executing as if nothing happened.
///
/// Handler for CPU interrupts triggered using
/// Handler for CPU software interrupts caused by the Arm BRK instruction
/// Handler for CPU software interrupts caused by the Arm SVC instruction
/// Handler for CPU software interrupts caused by any undefined Arm instruction
public ExceptionCallbacks(
ExceptionCallbackNoArgs interruptCallback = null,
ExceptionCallback breakCallback = null,
ExceptionCallback supervisorCallback = null,
ExceptionCallback undefinedCallback = null)
{
InterruptCallback = interruptCallback;
BreakCallback = breakCallback;
SupervisorCallback = supervisorCallback;
UndefinedCallback = undefinedCallback;
}
}
}