using System;
namespace Ryujinx.Cpu
{
///
/// CPU context interface.
///
public interface ICpuContext : IDisposable
{
///
/// Creates a new execution context that will store thread CPU register state when executing guest code.
///
/// Optional functions to be called when the CPU receives an interrupt
/// Execution context
IExecutionContext CreateExecutionContext(ExceptionCallbacks exceptionCallbacks);
///
/// Starts executing code at a specified entry point address.
///
///
/// This function only returns when the execution is stopped, by calling .
///
/// Execution context to be used for this run
/// Entry point address
void Execute(IExecutionContext context, ulong address);
///
/// Invalidates the instruction cache for a given memory region.
///
///
/// This should be called if code is modified to make the CPU emulator aware of the modifications,
/// otherwise it might run stale code which will lead to errors and crashes.
/// Calling this function is not necessary if the code memory was modified by guest code,
/// as the expectation is that it will do it on its own using the appropriate cache invalidation instructions,
/// except on Arm32 where those instructions can't be used in unprivileged mode.
///
/// Address of the region to be invalidated
/// Size of the region to be invalidated
void InvalidateCacheRegion(ulong address, ulong size);
///
/// Loads cached code from disk for a given application.
///
///
/// If the execution engine is recompiling guest code, this can be used to load cached code from disk.
///
/// Title ID of the application in padded hex form
/// Version of the application
/// True if the cache should be loaded from disk if it exists, false otherwise
/// Disk cache load progress reporter and manager
IDiskCacheLoadState LoadDiskCache(string titleIdText, string displayVersion, bool enabled);
///
/// Indicates that code has been loaded into guest memory, and that it might be executed in the future.
///
///
/// Some execution engines might use this information to cache recompiled code on disk or to ensure it can be executed.
///
/// CPU virtual address where the code starts
/// Size of the code range in bytes
void PrepareCodeRange(ulong address, ulong size);
}
}