Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

326 lines
10 KiB

5 years ago
/*
File: MachineExceptions.h
Contains: Processor Exception Handling Interfaces.
Version: QuickTime 7.3
Copyright: (c) 2007 (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 <MacTypes.h>
#endif
#ifndef __MIXEDMODE__
#include <MixedMode.h>
#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 int 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; /* The area related to the execption, same as MPAreaID.*/
LogicalAddress theAddress; /* The 32-bit address of the exception.*/
OSStatus theError; /* See enum below.*/
MemoryReferenceKind theReference; /* read, write, instruction fetch.*/
};
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, /* Optional*/
kDataBreakpointException = 11, /* Optional*/
kIntegerException = 12,
kFloatingPointException = 13,
kStackOverflowException = 14, /* Optional, may be implemented as kAccessException on some systems.*/
kTaskTerminationException = 15, /* Obsolete*/
kTaskCreationException = 16, /* Obsolete*/
kDataAlignmentException = 17 /* May occur when a task is in little endian mode or created with kMPTaskTakesAllExceptions.*/
};
#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;
/*
* NewExceptionHandlerUPP()
*
* Availability:
* Non-Carbon CFM: available as macro/inline
* CarbonLib: in CarbonLib 1.1 and later
* Mac OS X: in version 10.0 and later
*/
EXTERN_API_C( ExceptionHandlerUPP )
NewExceptionHandlerUPP(ExceptionHandlerProcPtr userRoutine);
#if !OPAQUE_UPP_TYPES
enum { uppExceptionHandlerProcInfo = 0x000000F1 }; /* 4_bytes Func(4_bytes) */
#ifdef __cplusplus
inline DEFINE_API_C(ExceptionHandlerUPP) NewExceptionHandlerUPP(ExceptionHandlerProcPtr userRoutine) { return userRoutine; }
#else
#define NewExceptionHandlerUPP(userRoutine) (userRoutine)
#endif
#endif
/*
* DisposeExceptionHandlerUPP()
*
* Availability:
* Non-Carbon CFM: available as macro/inline
* CarbonLib: in CarbonLib 1.1 and later
* Mac OS X: in version 10.0 and later
*/
EXTERN_API_C( void )
DisposeExceptionHandlerUPP(ExceptionHandlerUPP userUPP);
#if !OPAQUE_UPP_TYPES
#ifdef __cplusplus
inline DEFINE_API_C(void) DisposeExceptionHandlerUPP(ExceptionHandlerUPP) {}
#else
#define DisposeExceptionHandlerUPP(userUPP)
#endif
#endif
/*
* InvokeExceptionHandlerUPP()
*
* Availability:
* Non-Carbon CFM: available as macro/inline
* CarbonLib: in CarbonLib 1.1 and later
* Mac OS X: in version 10.0 and later
*/
EXTERN_API_C( OSStatus )
InvokeExceptionHandlerUPP(
ExceptionInformation * theException,
ExceptionHandlerUPP userUPP);
#if !OPAQUE_UPP_TYPES
#ifdef __cplusplus
inline DEFINE_API_C(OSStatus) InvokeExceptionHandlerUPP(ExceptionInformation * theException, ExceptionHandlerUPP userUPP) { return (*userUPP)(theException); }
#else
#define InvokeExceptionHandlerUPP(theException, userUPP) (*userUPP)(theException)
#endif
#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 */
/*
* InstallExceptionHandler()
*
* Availability:
* Non-Carbon CFM: in InterfaceLib 7.1 and later
* CarbonLib: in CarbonLib 1.1 and later
* Mac OS X: in version 10.0 and later
*/
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__ */