/*---------------------------------------------------------------------------* Project: OS File: OSException.h Copyright (C) Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. *---------------------------------------------------------------------------*/ #ifndef __OSEXCEPTION_H__ #define __OSEXCEPTION_H__ #define OS_EXCEPTION_SYSTEM_RESET 0 #define OS_EXCEPTION_MACHINE_CHECK 1 #define OS_EXCEPTION_DSI 2 #define OS_EXCEPTION_ISI 3 #define OS_EXCEPTION_EXTERNAL_INTERRUPT 4 #define OS_EXCEPTION_ALIGNMENT 5 #define OS_EXCEPTION_PROGRAM 6 #define OS_EXCEPTION_FLOATING_POINT 7 #define OS_EXCEPTION_DECREMENTER 8 #define OS_EXCEPTION_SYSTEM_CALL 9 #define OS_EXCEPTION_TRACE 10 #define OS_EXCEPTION_PERFORMANCE_MONITOR 11 #define OS_EXCEPTION_BREAKPOINT 12 #define OS_EXCEPTION_SYSTEM_INTERRUPT 13 #define OS_EXCEPTION_ICI 14 #define OS_EXCEPTION_MAX (OS_EXCEPTION_ICI + 1) #ifndef _ASSEMBLER #include #ifdef __cplusplus extern "C" { #endif #define OS_EXCEPTION_MODE_SYSTEM 0 #define OS_EXCEPTION_MODE_THREAD 1 #define OS_EXCEPTION_MODE_GLOBAL 2 #define OS_EXCEPTION_MODE_THREAD_ALL_CORES 3 #define OS_EXCEPTION_MODE_GLOBAL_ALL_CORES 4 FORWARD_DECLARE_STRUCT_TYPE(OSContext) typedef u8 OSExceptionMode; typedef u8 OSExceptionType; typedef BOOL (*OSExceptionCallback)(OSContext* interruptedContext); OSExceptionCallback OSSetExceptionCallback(OSExceptionType exceptionType, OSExceptionCallback callback); OSExceptionCallback OSSetExceptionCallbackEx(OSExceptionMode exceptionMode, OSExceptionType exceptionType, OSExceptionCallback newCallback); /* DABR and IABR registers are set per-process */ void OSSetDABR(BOOL allCores, void* address, BOOL matchReads, BOOL matchWrites); void OSSetIABR(BOOL allCores, void* address); /*---------------------------------------------------------------------------* FPSCR bits *---------------------------------------------------------------------------*/ #ifndef FPSCR_FX #define FPSCR_FX 0x80000000 // Exception summary #define FPSCR_FEX 0x40000000 // Enabled exception summary #define FPSCR_VX 0x20000000 // Invalid operation #define FPSCR_OX 0x10000000 // Overflow exception #define FPSCR_UX 0x08000000 // Underflow exception #define FPSCR_ZX 0x04000000 // Zero divide exception #define FPSCR_XX 0x02000000 // Inexact exception #define FPSCR_VXSNAN 0x01000000 // SNaN #define FPSCR_VXISI 0x00800000 // Infinity - Infinity #define FPSCR_VXIDI 0x00400000 // Infinity / Infinity #define FPSCR_VXZDZ 0x00200000 // 0 / 0 #define FPSCR_VXIMZ 0x00100000 // Infinity * 0 #define FPSCR_VXVC 0x00080000 // Invalid compare #define FPSCR_FR 0x00040000 // Fraction rounded #define FPSCR_FI 0x00020000 // Fraction inexact #define FPSCR_VXSOFT 0x00000400 // Software request #define FPSCR_VXSQRT 0x00000200 // Invalid square root #define FPSCR_VXCVI 0x00000100 // Invalid integer convert #define FPSCR_VE 0x00000080 // Invalid operation exception enable #define FPSCR_OE 0x00000040 // Overflow exception enable #define FPSCR_UE 0x00000020 // Underflow exception enable #define FPSCR_ZE 0x00000010 // Zero divide exception enable #define FPSCR_XE 0x00000008 // Inexact exception enable #define FPSCR_NI 0x00000004 // Non-IEEE mode #endif // FPSCR_FX #define FPSCR_ALL_ENABLE (FPSCR_VE | FPSCR_OE | FPSCR_UE | FPSCR_ZE | FPSCR_XE) #define FPSCR_ALL_STATUS (FPSCR_FX | FPSCR_FEX | FPSCR_VX | FPSCR_OX | FPSCR_UX | FPSCR_ZX | FPSCR_XX | \ FPSCR_VXSNAN | FPSCR_VXISI | FPSCR_VXIDI | FPSCR_VXZDZ | FPSCR_VXIMZ | FPSCR_VXVC | \ FPSCR_FI | FPSCR_VXSOFT | FPSCR_VXSQRT | FPSCR_VXCVI) FORWARD_DECLARE_STRUCT_TYPE(OSThread) BOOL OSEnableThreadFPUException(OSThread *thread, u32 fpu_ex_mask); u32 OSEnableAllThreadFPUException(u32 fpu_ex_mask); BOOL OSDisableThreadFPUException(OSThread *thread); u32 OSDisableAllThreadFPUException(void); void OSDisableContextFPUException(OSContext *context); #ifdef __cplusplus } #endif #endif // _ASSEMBLER #endif // __OSEXCEPTION_H__