/* File: MachineExceptions.h Contains: Processor Exception Handling Interfaces. Version: Technology: Mac OS 8 Release: QuickTime 6.0.2 Copyright: (c) 1993-2001 by Apple Computer, Inc., all rights reserved. Bugs?: For bug reports, consult the following page on the World Wide Web: http://developer.apple.com/bugreporter/ */ #ifndef __MACHINEEXCEPTIONS__ #define __MACHINEEXCEPTIONS__ #ifndef __MACTYPES__ #include #endif #ifndef __MIXEDMODE__ #include #endif #if PRAGMA_ONCE #pragma once #endif #ifdef __cplusplus extern "C" { #endif #if PRAGMA_IMPORT #pragma import on #endif #if PRAGMA_STRUCT_ALIGN #pragma options align=power #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(push, 2) #elif PRAGMA_STRUCT_PACK #pragma pack(2) #endif /* Some basic declarations used throughout the kernel */ typedef struct OpaqueAreaID* AreaID; #if TARGET_OS_MAC /* Machine Dependent types for PowerPC: */ struct MachineInformationPowerPC { UnsignedWide CTR; UnsignedWide LR; UnsignedWide PC; unsigned long CR; unsigned long XER; unsigned long MSR; unsigned long MQ; unsigned long ExceptKind; unsigned long DSISR; UnsignedWide DAR; UnsignedWide Reserved; }; typedef struct MachineInformationPowerPC MachineInformationPowerPC; struct RegisterInformationPowerPC { UnsignedWide R0; UnsignedWide R1; UnsignedWide R2; UnsignedWide R3; UnsignedWide R4; UnsignedWide R5; UnsignedWide R6; UnsignedWide R7; UnsignedWide R8; UnsignedWide R9; UnsignedWide R10; UnsignedWide R11; UnsignedWide R12; UnsignedWide R13; UnsignedWide R14; UnsignedWide R15; UnsignedWide R16; UnsignedWide R17; UnsignedWide R18; UnsignedWide R19; UnsignedWide R20; UnsignedWide R21; UnsignedWide R22; UnsignedWide R23; UnsignedWide R24; UnsignedWide R25; UnsignedWide R26; UnsignedWide R27; UnsignedWide R28; UnsignedWide R29; UnsignedWide R30; UnsignedWide R31; }; typedef struct RegisterInformationPowerPC RegisterInformationPowerPC; struct FPUInformationPowerPC { UnsignedWide Registers[32]; unsigned long FPSCR; unsigned long Reserved; }; typedef struct FPUInformationPowerPC FPUInformationPowerPC; union Vector128 { #ifdef __VEC__ vector unsigned long v; #endif unsigned long l[4]; unsigned short s[8]; unsigned char c[16]; }; typedef union Vector128 Vector128; struct VectorInformationPowerPC { Vector128 Registers[32]; Vector128 VSCR; UInt32 VRsave; }; typedef struct VectorInformationPowerPC VectorInformationPowerPC; /* Exception related declarations */ enum { kWriteReference = 0, kReadReference = 1, kFetchReference = 2, writeReference = kWriteReference, /* Obsolete name*/ readReference = kReadReference, /* Obsolete name*/ fetchReference = kFetchReference /* Obsolete name*/ }; typedef unsigned long MemoryReferenceKind; struct MemoryExceptionInformation { AreaID theArea; LogicalAddress theAddress; OSStatus theError; MemoryReferenceKind theReference; }; typedef struct MemoryExceptionInformation MemoryExceptionInformation; enum { kUnknownException = 0, kIllegalInstructionException = 1, kTrapException = 2, kAccessException = 3, kUnmappedMemoryException = 4, kExcludedMemoryException = 5, kReadOnlyMemoryException = 6, kUnresolvablePageFaultException = 7, kPrivilegeViolationException = 8, kTraceException = 9, kInstructionBreakpointException = 10, kDataBreakpointException = 11, kIntegerException = 12, kFloatingPointException = 13, kStackOverflowException = 14, kTaskTerminationException = 15, kTaskCreationException = 16, kDataAlignmentException = 17 }; #if OLDROUTINENAMES enum { unknownException = kUnknownException, /* Obsolete name*/ illegalInstructionException = kIllegalInstructionException, /* Obsolete name*/ trapException = kTrapException, /* Obsolete name*/ accessException = kAccessException, /* Obsolete name*/ unmappedMemoryException = kUnmappedMemoryException, /* Obsolete name*/ excludedMemoryException = kExcludedMemoryException, /* Obsolete name*/ readOnlyMemoryException = kReadOnlyMemoryException, /* Obsolete name*/ unresolvablePageFaultException = kUnresolvablePageFaultException, /* Obsolete name*/ privilegeViolationException = kPrivilegeViolationException, /* Obsolete name*/ traceException = kTraceException, /* Obsolete name*/ instructionBreakpointException = kInstructionBreakpointException, /* Obsolete name*/ dataBreakpointException = kDataBreakpointException, /* Obsolete name*/ integerException = kIntegerException, /* Obsolete name*/ floatingPointException = kFloatingPointException, /* Obsolete name*/ stackOverflowException = kStackOverflowException, /* Obsolete name*/ terminationException = kTaskTerminationException, /* Obsolete name*/ kTerminationException = kTaskTerminationException /* Obsolete name*/ }; #endif /* OLDROUTINENAMES */ typedef unsigned long ExceptionKind; union ExceptionInfo { MemoryExceptionInformation * memoryInfo; }; typedef union ExceptionInfo ExceptionInfo; struct ExceptionInformationPowerPC { ExceptionKind theKind; MachineInformationPowerPC * machineState; RegisterInformationPowerPC * registerImage; FPUInformationPowerPC * FPUImage; ExceptionInfo info; VectorInformationPowerPC * vectorImage; }; typedef struct ExceptionInformationPowerPC ExceptionInformationPowerPC; #if TARGET_CPU_PPC || TARGET_CPU_68K typedef ExceptionInformationPowerPC ExceptionInformation; typedef MachineInformationPowerPC MachineInformation; typedef RegisterInformationPowerPC RegisterInformation; typedef FPUInformationPowerPC FPUInformation; typedef VectorInformationPowerPC VectorInformation; #endif /* TARGET_CPU_PPC || TARGET_CPU_68K */ /* Note: An ExceptionHandler is NOT a UniversalProcPtr, except in Carbon. It must be a PowerPC function pointer with NO routine descriptor, except on Carbon, where it must be a UniversalProcPtr (TPP actually) to allow the interface to work from both CFM and Mach-O. */ typedef CALLBACK_API_C( OSStatus , ExceptionHandlerProcPtr )(ExceptionInformation *theException); typedef TVECTOR_UPP_TYPE(ExceptionHandlerProcPtr) ExceptionHandlerUPP; #if OPAQUE_UPP_TYPES EXTERN_API(ExceptionHandlerUPP) NewExceptionHandlerUPP (ExceptionHandlerProcPtr userRoutine); EXTERN_API(void) DisposeExceptionHandlerUPP (ExceptionHandlerUPP userUPP); EXTERN_API(OSStatus) InvokeExceptionHandlerUPP (ExceptionInformation * theException, ExceptionHandlerUPP userUPP); #else #define NewExceptionHandlerUPP(userRoutine) (userRoutine) #define DisposeExceptionHandlerUPP(userUPP) #define InvokeExceptionHandlerUPP(theException, userUPP) (*userUPP)(theException) #endif /* ExceptionHandler function pointers (TPP): on classic PowerPC, use raw function pointers on classic PowerPC with OPAQUE_UPP_TYPES=1, use UPP's on Carbon, use UPP's */ #if TARGET_OS_MAC && !OPAQUE_UPP_TYPES /* use raw function pointers*/ typedef ExceptionHandlerProcPtr ExceptionHandlerTPP; #else /* use UPP's*/ typedef ExceptionHandlerUPP ExceptionHandlerTPP; #endif /* TARGET_OS_MAC && !OPAQUE_UPP_TYPES */ typedef ExceptionHandlerTPP ExceptionHandler; /* Routine for installing per-process exception handlers */ EXTERN_API( ExceptionHandlerTPP ) InstallExceptionHandler(ExceptionHandlerTPP theHandler); #endif /* TARGET_OS_MAC */ #if PRAGMA_STRUCT_ALIGN #pragma options align=reset #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(pop) #elif PRAGMA_STRUCT_PACK #pragma pack() #endif #ifdef PRAGMA_IMPORT_OFF #pragma import off #elif PRAGMA_IMPORT #pragma import reset #endif #ifdef __cplusplus } #endif #endif /* __MACHINEEXCEPTIONS__ */